論理コンシューマーとイベント フィルターとバインドする

論理イベント コンシューマーとイベント フィルターを作成した後、それらをリンクする必要があります。これにより、フィルターで指定されたイベントに関する通知を受け取るように論理コンシューマーが登録されます。

次の手順では、イベント フィルターを論理コンシューマーとバインドする方法について説明します。

論理コンシューマーをイベント フィルターとバインドするには

  1. WMI リポジトリに __FilterToConsumerBinding システム クラスのインスタンスを作成します。

    __FilterToConsumerBinding クラスは、イベント フィルター インスタンスと論理コンシューマー インスタンスを FilterConsumer の各参照プロパティを介してリンクさせる関連付けクラスです。 詳細については、「関連付けクラスの宣言」を参照してください。

  2. Filter プロパティをフィルターのインスタンスに設定します。

  3. Consumer プロパティを論理コンシューマーのインスタンスに設定します。

  4. DeliverSynchronously プロパティを設定して、必要な配信の種類を決定します。

    DeliverSynchronously プロパティは、WMI がイベント通知を配信するタイミング (同期的または非同期的) を決定します。 このプロパティを TRUE に設定すると、同期配信が要求されます。 同期配信は、永続コンシューマーが約 100 マイクロ秒以内にイベントを処理できる場合にのみ使用してください。

    注意

    シンクへのコールバックはクライアントが必要とするのと同じ認証レベルでは返されない可能性があるため、非同期ではなく半同期通信を使用することをお勧めします。 詳細については、メソッドの呼び出しに関するページを参照してください。

     

  5. 論理イベント コンシューマーの登録を解除するときは、__FilterToConsumerBinding インスタンスを必ず削除してください。

    __FilterToConsumerBinding インスタンスは、特定のイベント通知の登録を表します。 バインドを削除すると、WMI によってこの登録が非アクティブ化されます。 実装によっては、登録を非アクティブ化するために論理コンシューマーおよびイベント フィルター インスタンスを削除する必要がある場合があります。

次のコード例は、ActiveScriptEventConsumer クラスのインスタンスを特定のイベント フィルターに関連付ける __FilterToConsumerBinding インスタンスを示しています (イベント コンシューマーのインスタンスは、「論理コンシューマーの作成」トピックで作成したもので、イベント フィルターは「イベント フィルターの作成」トピックで作成したものです)。

instance of __FilterToConsumerBinding
{
    Filter = $FILTER;
    Consumer = $CONSUMER;
    DeliverSynchronously=FALSE;

    // this is the Administrators SID in array of bytes format
    CreatorSID = {1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0}; 
};

ActiveScriptEventConsumerCommandLineEventConsumer の 2 つのコンシューマーは、作成者がローカル Administrators グループのメンバーでない限り機能しません。

: 管理者がサブスクリプションを作成したとき、その SID は CreatorSID プロパティには使用されず、代わりにローカルの Administrators グループの SID が使用されます。 そのため、別の管理者がインスタンスを作成することができ、その場合もサブスクリプションは機能します。 詳細については、「イベントを安全に受信する」を参照してください。

フィルターが論理コンシューマーにバインドされると、イベントは Event Tracing for Windows (ETW) によって記録されます。 詳細については、「WMI アクティビティのトレース」を参照してください。

常にイベントを受信する