我用WMI通过administrator账户连接远程主机,连接成功(可以看到防火墙提示有连接,并设置始终允许,并且关闭防火墙进行过试验),但是用execQuery函数查询数据的时候得到0x80070005 (DCOM ACCESS_DENIED)的返回值,查了很多资料始终不知道为什么,同样的代码查询本地信息就一点问题都没有
关键代码片断如下:
hRes = CoCreateInstance(CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER
, IID_IWbemLocator
, (LPVOID *) &pIWbemLocator);...if(pIWbemLocator->ConnectServer(
bstrNamespace, // \\192.168.xx.xx\\root\\cimv2
m_User.empty()?NULL:bstrUser.copy(), // xx.xx下的administraor
m_Pwd.empty()?NULL:bstrPwd.copy(), // xx.xx下的administraor的密码
NULL,
NULL,
NULL,
NULL,
&pWbemServices
) != WBEM_S_NO_ERROR)...hRes = CoSetProxyBlanket(
pWbemServices, // 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 模拟级别
NULL, // client identity
EOAC_NONE // proxy capabilities
);
hRes = pWbemServices->ExecQuery(strQL
, strQuery
, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY
, NULL
, &pEnumObject);//hRes返回0x80070005
请教谁了解这个问题
关键代码片断如下:
hRes = CoCreateInstance(CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER
, IID_IWbemLocator
, (LPVOID *) &pIWbemLocator);...if(pIWbemLocator->ConnectServer(
bstrNamespace, // \\192.168.xx.xx\\root\\cimv2
m_User.empty()?NULL:bstrUser.copy(), // xx.xx下的administraor
m_Pwd.empty()?NULL:bstrPwd.copy(), // xx.xx下的administraor的密码
NULL,
NULL,
NULL,
NULL,
&pWbemServices
) != WBEM_S_NO_ERROR)...hRes = CoSetProxyBlanket(
pWbemServices, // 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 模拟级别
NULL, // client identity
EOAC_NONE // proxy capabilities
);
hRes = pWbemServices->ExecQuery(strQL
, strQuery
, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY
, NULL
, &pEnumObject);//hRes返回0x80070005
请教谁了解这个问题
pAuthIdentity=new SEC_WINNT_AUTH_IDENTITY_W;
ZeroMemory(pAuthIdentity, sizeof(SEC_WINNT_AUTH_IDENTITY_W));
if (!IsLocalHost)
{
pAuthIdentity->User = bstrUser.copy();
pAuthIdentity->UserLength = wcslen(bstrUser);
pAuthIdentity->Domain = bstrDomain;
pAuthIdentity->DomainLength = wcslen(bstrDomain);
pAuthIdentity->Password = bstrPwd;
pAuthIdentity->PasswordLength = wcslen(bstrPwd);
pAuthIdentity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;//SEC_WINNT_AUTH_IDENTITY_UNICODE;
} hRes = CoSetProxyBlanket(
pWbemServices, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxxRPC_C_AUTHZ_NONE
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
pAuthIdentity, // client identity
EOAC_NONE // proxy capabilities
); 這樣設置之後ExecQuery就可以成功執行了,但是我在取數據的時候還是得到0x80070005 返回值,我完全不知道是爲什麽了
hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
//hRes = 0x80070005,pClassObject=NULL 怎么回事呢?反正总之还是DCOM用户认证的问题,但是不知道怎么写了
有时间还是要研究一下!!!
最后索性不通过DCOM了
直接在本机获得数据再通过socket传输
我这样做的目的就是要采集信息的机器上不能安装任何东西,所以没法用你的方法