イベントを常時受信する

イベントに常時対応できるアプリケーションを作成したいということはないでしょうか。 たとえば、特定のパフォーマンス指標がネットワークサーバーで低下した場合に、管理者が電子メールメッセージを受け取れるようにしたいというような場合です。 その場合、アプリケーションを常に実行中にする必要があります。 しかし、アプリケーションを連続して実行することは、システムリソースの使い方として効率的ではありません。 代わりに、WMI を使用して永続的なイベント コンシューマーを作成することができます。 永続的なイベント コンシューマーは、特別なセキュリティ要件を満たす必要があります。 詳細については、「WMI イベントのセキュリティ保護」を参照してください。

永続的なイベント コンシューマーは、登録が明示的に取り消されるまでイベントを受け取ります。

永続イベント コンシューマーは、システム上に存在する、次の WMI クラス、フィルター、および COM オブジェクトの組み合わせです。

  • 物理コンシューマーと呼ばれる COM オブジェクト。 WMI には、いくつかの標準的な永続コンシューマーが用意されています。 たとえば、Active Script イベント コンシューマーは、イベントが発生したときにスクリプトを実行します
  • 新しい永続コンシューマー クラス。
  • 論理コンシューマーと呼ばれる永続コンシューマー クラスのインスタンス。
  • イベントのクエリを含むフィルター。
  • コンシューマーとフィルターの間のリンケージ。

論理イベント コンシューマーのプロパティでは、イベントの通知を受けたときに実行するアクションが指定されますが、関連先のイベントクエリは定義されません。 通知を受けると、WMI は永続イベントコンシューマーを表す COM オブジェクトをアクティブ メモリに自動的に読み込みます。 通常、これは起動時、またはトリガー イベントへの応答として発生します。 アクティブ化された後、永続イベント コンシューマーは通常のイベント コンシューマーとして機能しますが、オペレーティング システムによって明示的にアンロードされるまで保持されます。

独自の永続イベント コンシューマーを作成することも、WMI にプリインストールされている標準コンシューマー クラス (ActiveScriptEventConsumer など) を使用することもできます。 詳細については、「標準コンシューマー クラス」、「標準コンシューマーを使用したイベントの監視と応答」、および「イベントの監視」を参照してください。

次の手順は、独自の永続イベント コンシューマー クラスを作成する方法について説明したものです。

独自の永続イベント コンシューマーを作成するには

  1. 受け取りたいイベントの種類を決めます。

    WMI では、組み込みと非組み込みのイベントがサポートされます。 組み込みイベントは WMI によって定義済みのイベントで、非組み込みイベントは、サード パーティのプロバイダーによって定義済みのイベントです。 詳細については、「受信するイベントの種類の決定」を参照してください。

  2. 物理コンシューマーを実装します

    管理アプリケーションと物理コンシューマーの主な違いは、管理アプリケーションがユーザーによって読み込まれ、アンロードされるのに対し、物理コンシューマーは WMI によって読み込まれ、アンロードされるという点です。 コーディングのほとんどは、物理コンシューマーで行うことになります。

    注意

    この手順は、説明の便宜上、最初の手順となっています。 コーディングの観点から言えば、実際には物理コンシューマーを最後に作成するのが合理的です。 そうすることで、大量のコーディングを開始する前に、永続イベント プロバイダーのパラメーターとロジックをレイアウトできます。 ただし、物理コンシューマーを最初に作成しても問題はありません。

     

  3. 物理コンシューマーを記述する新しいコンシューマー クラスを作成します

    コンシューマー クラスでは、他のクラスと同様、永続イベント コンシューマーの一般的なパラメーターを WMI に説明します。

  4. コンシューマー クラスのインスタンスを作成します

    他の WMI クラスと同様に、クラスを実装する場合は、コンシューマー クラスのインスタンスを作成する必要があります。 コンシューマー クラスのインスタンスは、論理コンシューマーとも呼ばれます。 論理コンシューマーは、WMI に対する物理コンシューマーを表します。

  5. イベント フィルターを作成します

    永続イベント コンシューマーをアクティブにするイベント クエリは、イベント フィルターと呼ばれます。 1 つのイベント フィルターを複数の論理イベント コンシューマーに関連付けることができます。 さらに、複数のイベント フィルターを 1 つの論理イベント コンシューマーに関連付けることもできます。 フィルターは、__EventFilter のインスタンスです。

    永続イベント コンシューマーのクエリが失敗すると、NT ログ イベントが生成されます。 このイベントのソースは WinMgmt、イベント ID は 10、イベントの種類は Error です。

  6. イベント フィルターを論理コンシューマーにリンクします

    イベント フィルターを論理コンシューマーにリンクすることで、どのイベント フィルターがどの論理コンシューマーに属するかを WMI に指示します。 論理イベント コンシューマーとイベント フィルターは、__FilterToConsumerBinding の関連付けクラス インスタンスによってリンクされます。 イベント フィルターで説明されているイベント クエリと一致するイベントを受信すると、WMI は関連付けクラス インスタンスを参照し、関連付けられた論理イベント コンシューマーを検索します。 論理イベント コンシューマー インスタンスが見つかったら、WMI は __EventConsumerProviderRegistration クラスのインスタンスを使用して、そのインスタンスに関連付けられている物理イベント コンシューマーを特定し、実行します。

  7. イベント コンシューマー プロバイダーの作成

    イベント コンシューマー プロバイダーは、WMI の物理コンシューマーを検索する COM オブジェクトです。