我用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 

请教谁了解这个问题

解决方案 »

  1.   

    都打了,我用的是VC6SP6,Win2000SP4+更新汇总N+补丁全,局域网的机器也是补丁全的Windows2000
      

  2.   

    谢谢,现在我根據查到的資料,修改了CoSetProxyBlanket函數的參數,如下: SEC_WINNT_AUTH_IDENTITY_W* pAuthIdentity; 
    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用户认证的问题,但是不知道怎么写了
      

  3.   

    dic_walter(C型血) 你是怎么解决的呢
      

  4.   

    我也是这个问题啊,后来换做delphi就可以,用VB也可以实现,郁闷!!!
      

  5.   

    我也是用VB完全没问题,用VBS脚本也试验了没问题,就是用VC不行。dic_walter你最后也没解决?
      

  6.   

    没有呢,现在用delphi做了。郁闷 ,超级郁闷ing.........
    有时间还是要研究一下!!!
      

  7.   

    有内存泄露,我用delphi做的时候!!!
      

  8.   

    我也遇到这个问题,一直没有解决
    最后索性不通过DCOM了
    直接在本机获得数据再通过socket传输
      

  9.   

    to iAL:
    我这样做的目的就是要采集信息的机器上不能安装任何东西,所以没法用你的方法