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

本文介绍了在VC环境下使用WMI连接远程主机时遇到的ACCESS DENIED错误,详细阐述了解决步骤,包括COM库初始化、安全性设置、连接目标主机以及设置访问权限的方法,强调了用户权限和远程主机WMI服务状态的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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")

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值