VC下WMI连接远程主机的问题
2010-03-17 10:51
1106 查看
VC下WMI连接远程主机的问题
最近的一个工程中需要使用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")
最近的一个工程中需要使用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")
相关文章推荐
- CentOS6.4 Ftp服务器远程主机关闭连接问题
- eclipse调试远程主机node.js无法连接的问题
- Android网络编程--问题汇总(03) Adb connection Error:远程主机强迫关闭了一个现有的连接
- Adb connection Error:远程主机强迫关闭了一个现有的连接。 Connection attempts: 1 等adb报错方面的问题
- 【WCF】 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:00:56.9810000”。
- ssh连接远程主机执行脚本的环境变量问题
- WCF 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的
- ssh连接远程主机执行脚本的环境变量问题
- derby 远程主机连接问题
- WCF 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的
- 解决eclipse中Adb connection Error:远程主机强迫关闭了一个现有的连接 的问题
- 混合环境下WMI 远程连接常见问题解决方法(Remote access)
- [ 转载 ] ssh连接远程主机执行脚本的环境变量问题
- mysql 拒绝远程主机连接问题
- Mysql 连接远程Linux主机无法连接 10061问题
- python _thread [WinError 10054] 远程主机强迫关闭了一个现有的连接问题
- android真机调试问题 Adb connection Error:远程主机强迫关闭了一个现有的连接
- Eclipse 远程主机强迫关闭了一个现有的连接 问题解决方案
- 解决“Adb connenction Error:远程主机强迫关闭了一个现有的连接”问题
- 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:01:00”