在 WMI 连接上设置安全级别

检索指向 IWbemServices 代理的指针后,必须在代理上设置安全性,以便通过代理访问 WMI。 必须设置安全性,因为 IWbemServices 代理授予对进程外对象的访问权限。 通常,如果未设置正确的安全属性,COM 安全性不允许一个进程访问另一个进程。 有关详细信息,请参阅在 IWbemServices 和其他代理上设置安全性。 与不同操作系统的连接需要不同级别的身份验证和模拟。 有关详细信息,请参阅连接到远程计算机上的 WMI

本主题中的代码示例需要以下引用和 #include 语句才能正确编译。

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

以下过程介绍了如何在 WMI 连接上设置安全级别。

在 WMI 连接上设置安全级别

  • 通过调用 CoSetProxyBlanketIWbemServices 代理上设置安全级别。

    下面的代码示例展示了调用 CoSetProxyBlanket 的常用方法。

        HRESULT hres;
        IWbemServices *pSvc = 0;
        IWbemLocator *pLoc = 0;
    
        // Set the proxy so that impersonation of the client occurs.
        hres = CoSetProxyBlanket(pSvc,
           RPC_C_AUTHN_WINNT,
           RPC_C_AUTHZ_NONE,
           NULL,
           RPC_C_AUTHN_LEVEL_CALL,
           RPC_C_IMP_LEVEL_IMPERSONATE,
           NULL,
           EOAC_NONE
        );
    
        if (FAILED(hres))
        {
            cout << "Could not set proxy blanket. Error code = 0x" 
                 << hex << hres << endl;
           pSvc->Release();
          pLoc->Release();     
            CoUninitialize();
            return hres;      // Program has failed.
        }
    

IWbemServices 指针设置安全级别后,可以访问 WMI 的各种功能。 使用完 WMI 后,必须关闭应用程序。 有关详细信息,请参阅清理和关闭 WMI 应用程序