常にイベントを受信する
イベントにいつでも対応できるアプリケーションを作成できます。 たとえば、ネットワーク サーバーで特定のパフォーマンス対策が低下したときに、管理者が電子メール メッセージを受信する場合があります。 この場合、アプリケーションは常に実行されます。 ただし、アプリケーションを継続的に実行することは、システム リソースを効率的に使用することはできません。 代わりに、WMI では永続的なイベント コンシューマーを作成できます。 永続的なイベント コンシューマーは、特別なセキュリティ要件を満たす必要があります。 詳細については、「 WMI イベントのセキュリティ保護」を参照してください。
永続的なイベント コンシューマーは、登録が明示的に取り消されるまでイベントを受け取ります。
永続的なイベント コンシューマーは、システム上に存在する次の WMI クラス、フィルター、および COM オブジェクトの組み合わせです。
- 物理コンシューマーと呼ばれる COM オブジェクト。 WMI には、いくつかの標準的な永続的コンシューマーが用意されています。 たとえば、Active Script イベント コンシューマーは、 イベントが発生したときにスクリプトを実行します。
- 新しい永続的コンシューマー クラス。
- 論理コンシューマーと呼ばれる永続的コンシューマー クラスのインスタンス。
- イベントのクエリを含むフィルター。
- コンシューマーとフィルターの間のリンケージ。
論理イベント コンシューマーのプロパティは、イベントの通知時に実行するアクションを指定しますが、関連付けられているイベント クエリは定義しません。 シグナルが送信されると、WMI は永続的なイベント コンシューマーを表す COM オブジェクトをアクティブ メモリに自動的に読み込みます。 通常、これは起動時またはトリガーイベントに応答して発生します。 アクティブ化された後、永続的なイベント コンシューマーは通常のイベント コンシューマーとして機能しますが、オペレーティング システムによって特にアンロードされるまで保持されます。
独自の永続的なイベント コンシューマーを記述することも、ActiveScriptEventConsumer などの WMI プレインストール済みの Standard コンシューマー クラスを使用することもできます。 詳細については、「 Standard Consumer クラス」、「Standard Consumer」を使用 したイベントの監視と対応、およびイベント の監視を参照してください。
次の手順では、独自の永続的なイベント コンシューマーを作成する方法について説明します。
独自の永続的なイベント コンシューマーを作成するには
受信するイベントの種類を決定します。
WMI では、組み込みイベントと extrinsic イベントがサポートされています。 組み込みイベントは WMI によって定義済みのイベントですが、extrinsic イベントはサード パーティプロバイダーによって定義されたイベントです。 詳細については、「 受信するイベントの種類の決定」を参照してください。
-
管理アプリケーションと 物理コンシューマー の主な違いは、ユーザーが管理アプリケーションを読み込んでアンロードするのに対し、WMI は物理コンシューマーを読み込んでアンロードすることです。 コーディングの大部分は、物理コンシューマーに含まれている必要があります。
注意
この手順は、簡単に説明するための手順の 1 つ目です。 コーディングの観点から、実際には物理コンシューマーを最後に作成する必要があります。 こうすることで、長いコーディングを開始する前に、永続的なイベント プロバイダーのパラメーターとロジックをレイアウトできます。 ただし、最初に物理コンシューマーを記述する場合に制限はありません。
物理コンシューマーを記述する新しいコンシューマー クラスを作成します。
コンシューマー クラスは、他のクラスと同様に、WMI に対する永続的なイベント コンシューマーの一般的なパラメーターを記述します。
-
他の WMI クラスと同様に、クラスを実装する場合は、コンシューマー クラスのインスタンスを作成する必要があります。 コンシューマー クラスのインスタンスは、 論理コンシューマーとも呼ばれます。 論理コンシューマーは、WMI に対する物理コンシューマーを表します。
-
永続的なイベント コンシューマーをアクティブにするイベント クエリは、 イベント フィルターと呼ばれます。 1 つのイベント フィルターを複数の論理イベント コンシューマーに関連付けることができます。 さらに、複数のイベント フィルターを 1 つの論理イベント コンシューマーに関連付けることができます。 フィルターは 、__EventFilterのインスタンスです。
永続的なイベント コンシューマーのクエリが失敗すると、NT ログ イベントが生成されます。 イベントのソースは WinMgmt、イベント ID は 10、イベントの種類は Error です。
-
イベント フィルターを論理コンシューマーにリンクすると、どのイベント フィルターがどの論理コンシューマーに属するかについて WMI に指示します。 論理イベント コンシューマーとイベント フィルターは、 __FilterToConsumerBindingの関連付けクラス インスタンスによってリンクされます。 イベント フィルターで説明されているイベント クエリに一致するイベントが受信されると、WMI は関連付けられた論理イベント コンシューマーを検索し、関連付けクラス インスタンスを確認します。 論理イベント コンシューマー インスタンスが見つけられた後、WMI は __EventConsumerProviderRegistration クラスのインスタンスを使用して、このインスタンスに関連付けられている物理イベント コンシューマーを見つけて実行します。
-
イベント コンシューマー プロバイダーは、WMI の物理コンシューマーを検索する COM オブジェクトです。