远程调用IWbemServices::Release()抛出拒绝访问异常的解决问询
远程WMI会话无法正常终止,释放IWbemServices时抛出权限异常
在C++环境中,远程服务器的WMI会话无法正常终止:每次尝试释放IWbemServices指针时都会抛出异常,且与服务器的TCP连接会一直保持到进程退出(调用最后一次CoUninitialize后仍处于打开状态),本地连接时则没有这个问题。
我曾参考过相关问题,但微软提供的“先获取IUnknown指针再释放”的解决方案无效。
相关代码(省略错误检查)
HRESULT hRes = S_OK; IWbemLocator* pWbemLocator = NULL; IWbemServices* pWbemServices = NULL; // 以下三个指针已初始化完成 PWCHAR wcUser; // L"theuser" PWCHAR wcPass; // L"thepassword" PWCHAR wcAuth; // L"ntlmdomain:THEDOMAIN" std::wstring wstrNsPath = L"\\\\remoteserver\\ROOT\\CIMV2"; hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED); hRes = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pWbemLocator); // 此调用返回S_OK hRes = pWbemLocator->ConnectServer((BSTR)wstrNsPath.c_str(), (BSTR)wcUser, (BSTR)wcPass, NULL, WBEM_FLAG_CONNECT_USE_MAX_WAIT, (BSTR)wcAuth, NULL, &pWbemServices); hRes = CoSetProxyBlanket(pWbemServices, RPC_C_AUTHN_DEFAULT, RPC_C_AUTHZ_DEFAULT, COLE_DEFAULT_PRINCIPAL, RPC_C_IMP_LEVEL_IMPERSONATE, RPC_C_AUTHN_LEVEL_DEFAULT, NULL, // 域信息已在wcAuth中指定 EOAC_NONE); // 执行一些查询操作... // 清理资源 pWbemServices->Release(); // 远程会话中此调用抛出异常 pWbemLocator->Release(); CoUninitialize();
Visual Studio调试输出的异常信息
onecore\com\combase\dcomrem\call.cxx(1234)\combase.dll!0000ABCDEFABCDEF: (caller: 0000FEDCBAFEDCBA) ReturnHr(1) tid(4321) 80070005 Access is denied.
这是预期行为吗?释放会话后客户端与服务器的连接难道不应该终止吗?
我曾尝试按照MSDN建议,在CoSetProxyBlanket()调用后添加以下代码,但没有任何变化:
IUnknown* pUnknown = NULL; pWbemServices->QueryInterface(IID_IUnknown, (LPVOID*)&pUnknown); if (pUnknown) { hRes = CoSetProxyBlanket(pUnknown, RPC_C_AUTHN_DEFAULT, RPC_C_AUTHZ_DEFAULT, COLE_DEFAULT_PRINCIPAL, RPC_C_IMP_LEVEL_IMPERSONATE, RPC_C_AUTHN_LEVEL_DEFAULT, NULL, EOAC_NONE); pUnknown->Release(); }
编辑 抓包分析发现,当代理安全设置中的pAuthInfo设为NULL时,请求会以客户端机器当前登录用户的身份发送,忽略了调用ConnectServer时提供的凭据。我知道可以通过COAUTHIDENTITY结构向CoSetProxyBlanket传递正确凭据,但希望避免单独输入域变量。换句话说,是否可以在请求远程服务器时从wcAuth中提取该信息?如果可以,如何区分本地和远程请求?
以下是发现该问题的Wireshark输出(见数据包1617):
No. Time Source Destination Protocol Length Info 1615 162.221354 [CLIENT_IP] [SERVER_IP] DCERPC 174 Alter_context: call_id: 8, Fragment: Single, 1 context items: IRemUnknown2 V0.0 (32bit NDR), NTLMSSP_NEGOTIATE 1616 162.228517 [SERVER_IP] [CLIENT_IP] DCERPC 366 Alter_context_resp: call_id: 8, Fragment: Single, max_xmit: 5840 max_recv: 5840, 1 results: Acceptance, NTLMSSP_CHALLENGE 1617 162.229396 [CLIENT_IP] [SERVER_IP] DCERPC 612 AUTH3: call_id: 8, Fragment: Single, NTLMSSP_AUTH, User: .\[client_user] 1618 162.229495 [CLIENT_IP] [SERVER_IP] IRemUnknown2 182 RemRelease request Cnt=1 Refs=5-0 1619 162.235567 [SERVER_IP] [CLIENT_IP] TCP 60 49669 → 59905 [ACK] Seq=1606 Ack=4339 Win=64768 Len=0 1620 162.235567 [SERVER_IP] [CLIENT_IP] DCERPC 86 Fault: call_id: 8, Fragment: Single, Ctx: 0, status: nca_s_fault_access_denied
内容的提问来源于stack exchange,提问作者A1693
相关产品推荐
相关产品推荐

