您的位置:首页 > 其它

VC下WMI连接远程主机的问题

2010-03-17 10:51 1106 查看
VCWMI连接远程主机的问题
       最近的一个工程中需要使用WMI来从远程主机中获取信息和操作远程主机,在进行连接和具体的操作时总是返回ACCESS DENIED错误,经过查阅MSDN和网上的资料现在总结一下。
本机使用WMI的步骤
1、  COM库的初始化
CoInitialize(0);
HRESULT hr = S_OK;
IWbemLocator* pIWbemLocator = NULL;
IWbemServices* pIWbemServices = NULL;
 
2、  设置安全性
hr = CoInitializeSecurity( NULL, -1, NULL, NULL,
    RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL, EOAC_SECURE_REFS, NULL);
 
3、  生成IWbemLocator对象
hr = CoCreateInstance(CLSID_WbemLocator,
        NULL, CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID*)&pIWbemLocator)
 
4、  连接目的主机得到IWbemServices对象
hr = pIWbemLocator->ConnectServer(_bstr_t(L"////.//root//cimv2"),
            NULL, NULL, NULL, 0, NULL,
            NULL, &pIWbemServices);
 
5、  利用IWbemServices进行具体的操作
...
 
6、  释放资源
CHECK_AND_RELEASE(pIWbemServices);
CHECK_AND_RELEASE(pIWbemLocator);
CoUninitialize();
 
这就是操作本机的一般步骤,在本机上做完实验,一切OK后,接着进行连接远程的测试。
 
WMI连接远程主机的步骤
 
1、  COM库的初始化
CoInitialize(0);
HRESULT hr = S_OK;
IWbemLocator* pIWbemLocator = NULL;
IWbemServices* pIWbemServices = NULL;
 
2、  设置安全性
hr = CoInitializeSecurity( NULL, -1, NULL, NULL,
    RPC_C_AUTHN_LEVEL_DEFAULT,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL, EOAC_NONE, NULL);
 
3、  生成IWbemLocator对象
hr = CoCreateInstance(CLSID_WbemLocator,
        NULL, CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID*)&pIWbemLocator)
 
4、  连接目的主机得到IWbemServices对象
hr = pIWbemLocator->ConnectServer(_bstr_t(L"////目标主机IP地址//root//cimv2"),
            用户名, 密码, NULL, 0, NULL,
            NULL, &pIWbemServices);
 
5、  利用IWbemServices进行具体的操作
COAUTHIDENTITY cID;
cID.User = (USHORT*)bastrUser;//用户名
cID.UserLength = _tcslen(bastrUser); //字符长度
cID.Password = (USHORT*)bastrPW;//密码
cID.PasswordLength = _tcslen(bastrPW); //字符长度
cID.Domain = NULL;
cID.DomainLength = 0; // bstrDomain.length();
cID.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
hr = CoSetProxyBlanket(
        pIWbemServices,                // Indicates the proxy to set
        RPC_C_AUTHN_WINNT,             // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_NONE,              // RPC_C_AUTHZ_xxx
        NULL,                           // Server principal name
        RPC_C_AUTHN_LEVEL_CALL,       // RPC_C_AUTHN_LEVEL_xxx
        RPC_C_IMP_LEVEL_IMPERSONATE,  // RPC_C_IMP_LEVEL_xxx
        &cID,                           // client identity
        EOAC_NONE                      // proxy capabilities
        );
...
 
6、  释放资源
CHECK_AND_RELEASE(pIWbemServices);
CHECK_AND_RELEASE(pIWbemLocator);
CoUninitialize();
 
基本和操作本机的方式差不多,这里要注意的是步骤2和步骤4的红色字体的部分,必须要设置正确,并且确定用户具有足够的权限和远程主机与WMI有关的服务没有关闭或者禁用。
步骤5需要特别说明一下,设置访问权限是必须的,我之前是直接拷贝的MSDN上的方法,结果总是出现ACCESS_DENIED的错误,问题就是出在这里,在cID中必须要指定用户信息。
备注:使用WMI需要导入的相关头文件和库文件
#include <Wbemcli.h>
#pragma comment(lib, "Wbemuuid.lib")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null server access c 测试
相关文章推荐