標準コンシューマーを使用したイベントの監視と対応

インストールされている標準コンシューマー クラスを使用して、オペレーティング システムのイベントに基づいてアクションを実行できます。 標準コンシューマーは、既に登録されている単純なクラスであり、永続コンシューマー クラスを定義します。 各標準コンシューマーは、イベント通知を受信した後に特定のアクションを実行します。 たとえば、ActiveScriptEventConsumer のインスタンスを定義することで、コンピューターの空きディスク領域が指定したサイズと異なる場合にスクリプトを実行できます。

WMI は、オペレーティング システムに依存する既定の名前空間に標準コンシューマーをコンパイルします。次に例を示します。

  • Windows Server 2003 では、既定ですべての標準コンシューマーが "Root\Subscription" 名前空間にコンパイルされます。

注意

各 WMI クラスに固有の既定の名前空間とオペレーティング システムについては、各クラスのトピックの解説と要件に関するセクションを参照してください。

 

次の表では、WMI 標準コンシューマーをリストして説明しています。

標準コンシューマー 説明
ActiveScriptEventConsumer イベント通知を受信したときにスクリプトを実行します。 詳細については、「イベントに基づくスクリプトの実行」を参照してください。
LogFileEventConsumer イベント通知を受信したときに、カスタマイズされた文字列をテキスト ログ ファイルに書き込みます。 詳細については、「イベントに基づくログ ファイルへの書き込み」を参照してください。
NTEventLogEventConsumer 特定のメッセージをアプリケーション イベント ログに記録します。 詳細については、「イベントに基づく NT イベント ログへのログ記録」を参照してください。
SMTPEventConsumer イベントが配信されるたびに SMTP を使用して電子メール メッセージを送信します。 詳細については、「イベントに基づく電子メールの送信」を参照してください。
CommandLineEventConsumer イベントがローカル システムに配信されたときにプロセスを起動します。 許可されていないユーザーが実行可能ファイルを別の実行可能ファイルに置き換えられないようにするには、実行可能ファイルをセキュリティ保護された場所に置くか、強力なアクセス制御リスト (ACL) で保護する必要があります。 詳細については、「イベントに基づくコマンド ラインからのプログラムの実行」を参照してください。

 

以下の手順は、標準コンシューマーを使用してイベントを監視および応答する方法について説明しています。 この手順は、マネージド オブジェクト フォーマット (MOF) ファイル、スクリプト、またはアプリケーションについても同じです。

標準コンシューマーを使用してイベントを監視および応答する方法

  1. MOF プリプロセッサ コマンド #pragma namespace を使用して、MOF ファイルで名前空間を指定します。 スクリプトまたはアプリケーションで、WMI に接続するコードで名前空間を指定します。

    次の MOF コード例は、root\subscription 名前空間を指定する方法を示しています。

    #pragma namespace ("\\\\.\\root\\subscription")
    

    ほとんどの "内部イベント" は、root\cimv2 名前空間のクラス インスタンスへの変更に関連しています。 ただし、RegistryKeyChangeEvent などのレジストリ イベントは、システム レジストリ プロバイダーによって root\default 名前空間で発生します。

    コンシューマーは、イベントの __EventFilter クエリの EventNamespace プロパティで名前空間を指定することで、他の名前空間にあるイベント クラスを含めることができます。 __InstanceOperationEvent などの "内部イベント" クラスは、すべての名前空間で使用できます。

  2. 標準コンシューマー クラスのインスタンスを作成して設定します。

    このインスタンスは Name プロパティに一意の値を持つことができます。 同じ名前を再利用することで、既存のコンシューマーを更新できます。

    InsertionStringTemplates には、EventType で指定したイベントに挿入するテキストが含まれます。 リテラル文字列を使用することも、プロパティを直接参照することもできます。 詳細については、「標準文字列テンプレートの使用」および「イベント クエリの SELECT ステートメント」を参照してください。

    関連テキストなしで挿入文字列をサポートするイベント ログの既存のソースを使用します。

    次の MOF コード例は、WSH の既存のソースと EventID 値 8 を使用する方法を示しています。

    instance of NTEventLogEventConsumer as $Consumer
    {
        Name = "RunKeyEventlogConsumer";
        SourceName = "WSH";               
        EventID = 8;
        // Warning                              
        EventType = 2;
        // One string supplies the entire message          
        NumberOfInsertionStrings = 1;             
        // the %Hive% and %KeyPath% are properties of
        // the RegistryKeyChangeEvent instance 
        InsertionStringTemplates = 
            {"The key %Hive%\\%RootPath% has been modified."
            "Check if the change is intentional"};
    };
    
  3. __EventFilter のインスタンスを作成し、イベントのクエリを定義します。

    次の例では、フィルターによって、スタートアップ プログラムが登録されているレジストリ キーを監視します。 許可されていないプログラムがキーの下に自身を登録することができ、コンピューターの起動時に起動されるようになるため、このレジストリ キーを監視することが重要な場合があります。

    instance of __EventFilter as $Filter
    {
    Name = "RunKeyFilter";
    QueryLanguage = "WQL"; 
    Query = "Select * from RegistryTreeChangeEvent"
        " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
        "RootPath = \"Software\\\\Microsoft\\\\Windows"
        "\\\\CurrentVersion\\\\Run\")";
    
    // RegistryTreeChangeEvents only fire in root\default namespace
    EventNamespace = "root\\default";                       
    };
    
  4. 監視するイベントを特定し、イベント クエリを作成します。

    使用する内部イベントまたは外部イベントがあるかどうかを確認できます。 たとえば、レジストリ プロバイダーの RegistryTreeChangeEvent クラスを使用して、システム レジストリへの変更を監視します。

    監視する必要があるイベントを記述するクラスが存在しない場合は、独自のイベント プロバイダーを作成し、新しい外部イベント クラスを定義する必要があります。 詳細については、「イベント プロバイダーの作成」を参照してください。

    MOF ファイルでは、フィルターおよびコンシューマーの "エイリアス" を定義できます。これにより、インスタンス パスを簡単に記述できるようになります。

    次の例は、フィルターおよびコンシューマーの "エイリアス" を定義する方法を示しています。

    instance of __EventFilter as $FILTER
    instance of LogFileEventConsumer as $CONSUMER
    
  5. __FilterToConsumerBinding のインスタンスを作成して、フィルターとコンシューマー クラスを関連付けます。 このインスタンスは、指定したフィルターに一致するイベントが発生したときに、コンシューマーによって指定されたアクションが発生する必要があることを決定します。 __EventFilter__EventConsumer、および __FilterToConsumerBinding は、CreatorSID プロパティに同じ個別のセキュリティ識別子 (SID) を持つ必要があります。 詳細については、「論理コンシューマーを使用してイベント フィルターをバインドする」を参照してください。

    次の例は、オブジェクト パスでインスタンスを識別する方法、またはエイリアスをオブジェクト パスの短縮表記として使用する方法を示しています。

    instance of __EventFilter as $FILTER
    instance of NTEventLogEventConsumer as $CONSUMER
    

    次の例では、エイリアスを使用してフィルターをコンシューマーにバインドします。

    instance of __FilterToConsumerBinding
    {
        Filter = $FILTER;
        Consumer = $CONSUMER;
    
    };
    

    1 つのフィルターを複数のコンシューマーにバインドできます。これは、一致するイベントが発生したときに、いくつかのアクションを実行する必要があることを示します。または、1 つのコンシューマーを複数のフィルターにバインドできます。これは、いずれかのフィルターに一致するイベントが発生したときにアクションを実行する必要があることを示します。

    コンシューマーとイベントの条件に基づいて、次のアクションが実行されます。

    • 永続コンシューマーの 1 つに問題が発生した場合、イベントを要求した他のコンシューマーが通知を受け取ります。
    • イベントがドロップされると、WMI は __EventDroppedEvent を発生させます。
    • このイベントにサブスクライブすると、ドロップされたイベントが返され、__EventConsumer への参照は問題が発生したコンシューマーを表します。
    • コンシューマーに問題が発生した場合、WMI は __ConsumerFailureEvent を発生させます。これには、ErrorCodeErrorDescription、および ErrorObject の各プロパティに詳細情報が含まれている場合があります。

    詳細については、「論理コンシューマーを使用してイベント フィルターをバインドする」を参照してください。

次の例は、NTEventLogEventConsumer のインスタンスの MOF を示しています。 この MOF をコンパイルした後、レジストリ パス HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run の値を作成、削除、または変更しようとすると、アプリケーション イベント ログのソース "WSH" の下にエントリが記録されます。

#pragma namespace ("\\\\.\\root\\subscription")
 
instance of __EventFilter as $Filter
{
    Name = "RunKeyFilter";
    QueryLanguage = "WQL";
    Query = "Select * from RegistryTreeChangeEvent"
            " where (Hive = \"HKEY_LOCAL_MACHINE\" and "
            "KeyPath = \"Software\\\\Microsoft\\\\Windows"
            "\\\\CurrentVersion\\\\Run\")";

    // RegistryTreeChangeEvents only fire
    // in root\default namespace
    EventNamespace = "root\\default";   
};
 
instance of NTEventLogEventConsumer as $Consumer
{
    Name = "RunKeyEventlogConsumer";
    SourceName = "WSH";               
    EventID = 8;
    EventType = 2;                            // Warning
    Category = 0;
    NumberOfInsertionStrings = 1;

    // the %Hive% and %KeyPath% are properties
    // of the RegistryKeyChangeEvent instance 
    InsertionStringTemplates = {"The key %Hive%\\%RootPath% "
        "has been modified. Check if the change is intentional"};
};
 

// Bind the filter to the consumer
instance of __FilterToConsumerBinding
{
    Filter = $Filter;
    Consumer = $Consumer;
};

安全にイベントを受信する