You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:20:42