WMI へのデータの提供
WMI を使用すると、Windows に関するデータを、WMI "プロバイダー" を介して利用可能な管理可能オブジェクトにすることができます。 プロバイダーは、システム コンポーネント (プロセスなど) またはインストルメント化されたアプリケーション (SNMP や IIS など) からデータを取得し、そのデータを WMI 経由で管理アプリケーションに渡します。 たとえば、アプリケーションまたはスクリプトが WMI の Win32_Process クラスを使用してプロセス情報を要求すると、プレインストールされたプロバイダーを介してデータが動的に取得されます。
このトピックでは、以下のセクションについて説明します。
- 管理可能オブジェクトのモデルの作成
- 管理可能オブジェクトのモデルの実装
- 実装するプロバイダーの種類の決定
- プロバイダーのホスティング (実装) モデルの決定
- プロバイダーの実装
- WMI とシステムへのプロバイダーの登録
- プロバイダーのテスト
- 関連トピック
管理可能オブジェクトのモデルの作成
プロバイダーを開発する前に、WMI を介して公開する管理可能オブジェクトを表すデータ モデルを作成します。 どのデータ オブジェクトをプロバイダーで公開するかを計画します。 たとえば、デスクトップの背景の画面解像度を管理する場合は、マネージド オブジェクト フォーマット (MOF) ファイルでデスクトップをモデル化する方法を決定する必要があります。
便利なモデルを作成するには、次のようにします。
- 実際のシナリオを決定し、管理可能な各オブジェクトの読み取りと更新 (背景画像の変更など) に必要な情報をモデル化します。 これらがクラスのプロパティになります。
- 管理可能な各オブジェクトでユーザーが実行するアクションの種類を決定します。 これらがメソッドです。
管理可能オブジェクトのモデルの実装
管理可能オブジェクトのモデルを実装するには、各オブジェクトを表す WMI クラスを含む MOF ファイルを作成します。 WMI クラスを定義するための MOF ファイルの作成の詳細については、「マネージド オブジェクト フォーマット (MOF) クラスの設計」を参照してください。 プロバイダーとそのクラスの登録は通常、MOF ファイルに含まれますが、COM API を使用してクラスとメソッドを作成することができます。 詳細については、「WMI プロバイダーの開発」を参照してください。
注意
WMI に障害が発生して再起動した場合に、マネージド オブジェクトのすべての WMI クラス定義が "WMI リポジトリ" に復元されるようにするには、マネージド オブジェクト フォーマット (MOF) ファイルで #pragma autorecover プリプロセッサ命令を使用します。
MOF ファイルを作成したら、Mofcomp.exe ツールを使用してコンパイルします。 これにより、MOF ファイルのエラーが通知され、MOF ファイルに定義されている WMI クラスが "WMI リポジトリ" に追加され、プロバイダーがクラスを使用できるようになります。
実装するプロバイダーの種類の決定
WMI では、特定の数のプロバイダーの種類がサポートされており、これにより、提供される情報の性質とプロバイダーでサポートされる操作が決まります。
プロバイダーの種類は次のとおりです。
- "インスタンス プロバイダー"
- "メソッド プロバイダー"
- "プロパティ プロバイダー"
- クラス プロバイダー
- "イベント プロバイダー"
- "イベント コンシューマー プロバイダー"
- "関連付けプロバイダー"
プロバイダーの大部分は、インスタンス プロバイダーとメソッド プロバイダーです。 インスタンス プロバイダーが最も一般的なプロバイダーであり、特定のクラスのインスタンスを提供します。 メソッド プロバイダーは、1 つ以上のクラスのメソッドを実装します。 プロバイダーの種類の詳細については、「WMI プロバイダーの開発」を参照してください。
プロバイダーのホスティング (実装) モデルの決定
WMI プロバイダーは、COM オブジェクトとして実装されるバイナリです。 つまり、各プロバイダーには、特定のプロセスとセキュリティ コンテキスト内で実行できる DLL ファイルがあります。 これが、WMI で "ホスティング モデル" と呼ばれるものです。 WMI にはプロバイダーをホストするためのさまざまな方法が用意されていますが、最も一般的な方法は、NetworkServiceHost セキュリティ コンテキストで (WMI プロセスで実行される) 結合プロバイダー モデルを使用することです。 WMI プロバイダーは、結合または "分離" のいずれかに分類できます。
結合プロバイダーまたは分離プロバイダーという用語は、WMI が提供する WMIPRVSE.EXE プロセスに関して、どのホスト プロセスでプロバイダーが実行されるかを意味します。 ベスト プラクティスとしては、プロバイダーが公開する管理データと、それが依存する API またはアプリケーションが常にシステムで使用できるかどうかを判断することです。 プロバイダーが依存する API またはアプリケーションが常に使用可能な場合 (システムで実行されている場合)、プロバイダーは結合プロバイダーにする必要があります。そうでない場合は、分離プロバイダーにします。 ホスティング モデルの詳細については、「プロバイダーのホスティングとセキュリティ」を参照してください。
結合プロバイダーの作成の詳細については、「プロバイダーを作成して WMI にデータを提供する」を参照してください。分離プロバイダーをアプリケーションに組み込む方法については、「アプリケーションへのプロバイダーの組み込み」を参照してください。
結合プロバイダーは、インプロセス (in-proc) またはアウトプロセス (out-of-proc) として記述できます。 結合プロバイダーが in-proc プロバイダーの場合、共有 WMIPRVSE.EXE WMI ホスティング プロセスで実行され、COM in-proc サーバー (.dll) として実装されます。 プロバイダーが out-of-proc プロバイダーの場合、クライアントの要求またはイベントに応じて WMI によって開始されますが、別のプロセスとして実行され、実行可能ファイル (.exe) として実装されます。
プロバイダーの実装
プロバイダーは、次の方法で実装できます。
Visual Studio で ATL ウィザードを使用する。
ATL ウィザードは、結合プロバイダーを実装するプロバイダー コードを生成します。 ATL ウィザードの使用中に、in-proc (.dll) または out-of-proc (.exe) プロバイダー ランタイム モデルを作成することを指定できます。
プロバイダーを格納する COM オブジェクトを定義する。
プロバイダー コードは C++ で記述されます。 詳細については、「プロバイダーを作成して WMI にデータを提供する」を参照してください。
.NET Framework の Microsoft.Management.Infrastructure 名前空間のクラスを使用して、マネージド コードを使用してプロバイダーを作成する。 (System.Management.Instrumentation 名前空間はサポートされなくなりました)。
このプロセスでは、分離プロバイダーが作成されます。
WMI とシステムへのプロバイダーの登録
コンシューマーからプロバイダーを使用する前に、WMI システムと Windows COM サブシステムに登録することが重要です。
MOF ファイルには、同じクラスに対する複数の種類のプロバイダーを含めることができます。 同じプロバイダー名が、たとえばインスタンスまたはメソッド プロバイダーとして登録されます。 詳細については、「プロバイダーの登録」を参照してください。
プロバイダーのテスト
プロバイダー コードを登録するときは、さまざまなコンシューマー (スクリプト、.NET マネージド コード、C++ コンシューマーなど) のプロバイダーを使用して、プロバイダーを適切にテストすることが重要です。
プロバイダーをテストするには、次のタスクを実行します。
- MSFT_WmiProvider_OperationEvent イベントの通知を追跡して、プロバイダーが正しく読み込まれていることを確認します。 これらのイベントは、プロバイダーの読み込みエラーについて通知します。 役に立つ可能性があるその他のトラブルシューティング クラスは 、Win32_ProcessStartTrace と Win32_ProcessStopTrace です。 プロバイダーのトラブルシューティングの詳細については、「プロバイダーのデバッグ」と「プロバイダーの構成およびトラブルシューティングのクラス」を参照してください。
- プロバイダーがインスタンスまたはメソッド プロバイダーの場合は、コード ロジックに従う際の混乱を避けるために、各プロバイダー機能を 1 つずつテストしてください。
- インスタンス プロバイダーの場合は、プロバイダーのすべてのインターフェイス (列挙、取得、配置、削除) を呼び出すクライアント アプリケーションまたはスクリプトを作成します。 プロバイダーが何も実装しない場合でも、"サポートされていません" というメッセージを返す必要があります。 WMI リターン コードで既に定義されている戻り値を確認できます。
- 必要なセキュリティ コンテキストが計画どおりに動作していることを確認するには、管理者以外のセキュリティ コンテキストからプロバイダーでサポートされている操作を呼び出します。 プロバイダーは偽装をサポートする必要があります。 正しいセキュリティ資格情報がないユーザーがデータの更新またはメソッドを実行する操作の実行を試みた場合、プロバイダーは適切なエラー メッセージでアクセスを拒否する必要があります。
- プロバイダーのセキュリティの詳細については、「プロバイダーのセキュリティ保護」を参照してください。
関連トピック