次の方法で共有


イベント フィルターの作成

イベント フィルターは、WMI が物理コンシューマーに配信するイベントを記述する WMI クラスです。 たとえば、イベント フィルターは、コンシューマーにすべての電源管理イベント、またはすべてのシステム再起動イベントを配信するように WMI に指示できます。 イベント フィルターでは、WMI がイベントを配信する条件も記述します。 イベント フィルターでは、組み込みまたは外因性イベントを指定できます。フィルターは、名前空間 (フィルターの名前空間以外) で発生するイベントを参照できます。 永続コンシューマーは、コンシューマー、フィルター、およびバインド インスタンスで同じ CreatorSID を持っている必要があります。 詳細については、「イベントを安全に受信する」を参照してください。

以下の手順は、イベント フィルターを作成する方法を示します。

イベント フィルターを作成するには

  1. WMI __EventFilter システム クラスのインスタンスを作成します。

  2. Name プロパティを使用して、次の 2 つの方法のいずれかでフィルターの一意識別子を作成します。

    • プライベート スキームを使用します。

      他のフィルターの名前付けスキームと競合しない限り、イベント フィルターの任意の名前付けは機能します。 Name 値が重複するインスタンスを追加すると、古いインスタンスが上書きされるため、名前の競合を回避する必要があります。

    • グローバル一意識別子 (GUID) を使用します。

      Name を空のままにすると、WMI によって Name に GUID が入力されます。

  3. Query プロパティを使用してフィルター処理するイベントの種類について説明します。

    Query プロパティには、フィルター処理するイベントの種類を記述する WMI クエリ言語 (WQL) クエリが含まれています。 WQL に対するさまざまな演算子と拡張機能を使用して、正確なフィルター処理を実現できます。

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

    WMI は、広範なクエリよりも制限的で具体的なクエリの方が効率よく処理できます。 特定のクエリを作成することで、不要なプロセス間通信とネットワーク トラフィックを回避できます。 プロバイダーによって生成されたイベントの場合、WMI はプロバイダーに対して処理中にフィルター処理を実行します。これにより、フィルターに一致するイベントのみがプロセス間通信コストを発生させることが確実になります。 詳細については、「WMI のクエリ」を参照してください。

  4. QueryLanguage プロパティを、Query プロパティで使用するクエリ言語の種類に設定します。

    ほとんどの場合、QueryLanguage を "WQL" に設定します。

次のコード例では、WMI が root\cimv2 名前空間に __TimerEvent クラスのインスタンスを作成するたびにイベントを通知するイベント フィルターについて説明します。

instance of __EventFilter as $FILTER
{
    Name = "MyFilterName";
    Query = "select * from __TimerEvent where TimerID=\"MyTimer\"";
    QueryLanguage = "WQL";
    EventNamespace = "\root\cimv2";

    // 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}; 
};

EventNamespace プロパティは、イベントの発生元となる名前空間を指定します。 イベントの発生元の名前空間にフィルターのインスタンスを作成する必要はありません。 名前空間を指定しない場合、WMI によって既定の名前空間にフィルターが作成されます。 __InstanceOperationEvent などの組み込みイベント クラスは、すべての名前空間で使用できます。

イベント通知用に論理コンシューマーを登録するには、イベント フィルターを論理コンシューマーにバインドする必要があります。 詳細については、「論理コンシューマーを使用してイベント フィルターをバインドする」を参照してください。