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 名前空間へのアクセス