为 WMI 应用程序初始化 COM

连接到 WMI 的第一步是设置对 CoInitializeExCoInitializeSecurity的 COM 调用。

本主题中的代码示例需要以下引用并 # 包含正确编译的语句。

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

下面的过程介绍如何从客户端应用程序初始化 COM。

若要从客户端应用程序初始化 COM

  1. 通过调用 CoInitializeEx初始化 COM。

    调用 CoInitializeEx 是设置 COM 接口的标准过程。 因此,在调用 CoInitializeEx 时,WMI 不要求你观察到任何其他过程。 有关详细信息,请参阅 COM

    下面的代码示例说明了如何调用 CoInitializeEx

    HRESULT hr;
    hr = CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hr)) 
    { cout << "Failed to initialize COM library. Error code = 0x"
           << hex << hr << endl; 
      return hr;
    }
    
  2. 使用对 CoInitializeSecurity 接口的调用设置常规 COM 安全级别。

    CoInitializeSecurity 是在为进程设置 COM 接口时必须调用的标准函数。 如果要为整个进程的身份验证、模拟或身份验证服务设置默认的安全设置,请调用 CoInitializeSecurity 。 有关详细信息,请参阅 设置客户端应用程序进程安全性。 若要设置或更改特定代理的安全性,则必须调用 CoSetProxyBlanket。 当你必须在不能控制身份验证、模拟或身份验证服务的默认安全设置的另一个进程中运行时,请使用 CoSetProxyBlanket 。 有关详细信息,请参阅 在 WMI 连接上设置安全级别设置 IWbemServices 和其他代理上的安全性

    WMI 提供了一些在对 WMI 客户端应用程序进行编程时应注意的安全问题。 有关详细信息,请参阅 设置客户端应用程序进程安全性

    下面的代码示例说明如何调用 CoInitializeSecurity 来设置进程的 COM 安全性。

    hr =  CoInitializeSecurity(
        NULL,                        // Security descriptor    
        -1,                          // COM negotiates authentication service
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication level for proxies
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation level for proxies
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities of the client or server
        NULL);                       // Reserved
    
    if (FAILED(hr))
    {
       cout << "Failed to initialize security. Error code = 0x" 
            << hex << hr << endl;
       CoUninitialize();
       return hr;                  // Program has failed.
    }
    

初始化 COM 后,下一步是创建到 WMI 命名空间的连接。 有关详细信息,请参阅 创建与 WMI 命名空间的连接

使用 c + + 创建 WMI 应用程序

访问 WMI 命名空间