初始化 WMI 应用程序的 COM

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

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

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

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

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

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

    调用 CoInitializeEx 是设置 COM 接口的标准过程。 因此,WMI 在调用 CoInitializeEx 时不要求你观察任何其他过程。 有关详细信息,请参阅 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。 如果另一个进程中运行,而此时无法控制身份验证、模拟或身份验证服务的默认安全设置,因而设置或更改 COM 安全性,则要使用 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 命名空间