イベントに基づく NT イベント ログへのログ記録

NTEventLogEventConsumer クラスは、指定したイベントが発生したときに Windows イベント ログにメッセージを書き込みます。 このクラスは、WMI が提供する標準的なイベント コンシューマーです。

Note

認証されたユーザーは、既定では、リモート コンピューター上のアプリケーション ログにイベントを記録できません。 その結果、このトピックで説明する例は、NTEventLogEventConsumer クラスの UNCServerName プロパティを使用し、その値としてリモート コンピューターを指定すると、失敗します。 イベント ログのセキュリティを変更する方法については、こちらの KB の記事を参照してください。

 

標準コンシューマーを使用するための基本的な手順については、「標準コンシューマーを使用したイベントの監視と対応」で説明されています。 NTEventLogEventConsumer クラスを使用する場合に必要な、基本的なプロシージャ以外の追加手順を次に示します。 この手順では、アプリケーション イベント ログに書き込むイベント コンシューマーを作成する方法について説明します。

次の手順では、NT イベント ログに書き込むイベント コンシューマーを作成する方法について説明します。

Windows イベント ログに書き込むイベント コンシューマーを作成する方法

  1. Managed Object Format (MOF) ファイルで、クエリで要求したイベントを受信するための NTEventLogEventConsumer のインスタンスを作成します。 MOF コードの記述の詳細については、「Managed Object Format (MOF) クラスの設計」を参照してください。

  2. __EventFilter のインスタンスを作成して名前を付け、NT イベント ログへの書き込みをトリガーするイベントの種類を指定するクエリを作成します。

    詳細については、「WQL を使用したクエリの実行」を参照してください。

  3. フィルターを NTEventLogEventConsumer のインスタンスに関連付ける __FilterToConsumerBinding のインスタンスを作成します。

  4. Mofcomp.exe を使用して MOF ファイルをコンパイルします。

このセクションのサンプルは MOF コードですが、WMI 用のスクリプト API または WMI 用の COM API を使用してプログラムでインスタンスを作成することができます。 このサンプルでは、NTEventLogEventConsumer を使用してアプリケーション イベント ログに書き込むコンシューマーを作成する方法を示しています。 MOF は、「NTLogCons_Example」という名前の新しいクラス、この新しいクラスのインスタンスで作成などの操作をクエリするイベント フィルター、およびフィルターとコンシューマーの間のバインドを作成します。 MOF の最後のアクションは、NTLogCons_Example のインスタンスを作成するため、Eventvwr.exe を実行すると、アプリケーション イベント ログでイベントをすぐに確認することができます。

EventID=0x0A for SourceName="WinMgmt" は、次のテキストを含むメッセージを識別します。 "%1"、"%2"、"%3" は、InsertionStringTemplates 配列で指定された対応する文字列のプレースホルダーです。

Event filter with query "%2" could not be [re]activated in 
namespace "%1" because of error %3. Events may not be delivered 
through this filter until the problem is corrected.

サンプルの使用方法を次の手順で説明します。

サンプルを使用する方法

  1. 以下の MOF リストをテキスト ファイルにコピーし、拡張子 .mof で保存します。

  2. コマンド ウィンドウで、次のコマンドを使用して MOF ファイルをコンパイルします。

    Mofcomp filename**.mof**

  3. Eventvwr.exe を実行します。 アプリケーション イベント ログを確認します。 ID = 10 (EventID)、Source = "WMI"、Type = Error のイベントが表示されます。

  4. Event 列が 10 の、WMI からの情報の種類メッセージをダブルクリックします。 イベントの次の説明が表示されます。

    Event filter with query "STRING2" could not be [re]activated in 
    namespace "STRING1" because of error STRING3. Events cannot be 
    delivered through this filter until the problem is corrected.
    
// Set the namespace as root\subscription.
// The NTEventLogEventConsumer is already
// compiled in the root\subscription namespace. 

#pragma namespace ("\\\\.\\Root\\subscription")
class NTLogCons_Example
{
 [key] string name;
 string InsertionString;
};

// Create an instance of the NT Event log consumer
// and give it the alias $CONSUMER

instance of NTEventLogEventConsumer as $CONSUMER
{
    // Unique instance name
    Name = "NTConsumerTest"; 
    // System component that generates the event
    SourceName = "WinMgmt";
    // Event message WBEM_MC_CANNOT_ACTIVATE_FILTER
    EventID = 0xC000000A;
    // EVENTLOG_ERROR_TYPE
    EventType = 1;
    // WMI event messages do not have multiple categories
    Category = 0;
    // Number of strings in InsertionStringTemplates property
    NumberOfInsertionStrings = 3;

    InsertionStringTemplates =
       {"%TargetInstance.Name%",
        "%TargetInstance.InsertionString%",
        "STRING3"};
};

// Create an instance of the event filter
// and give it the alias $FILTER
// The filter queries for any instance operation event
// for instances of the NTLogCons_Example class

instance of __EventFilter as $FILTER
{
    // Unique instance name
    Name = "NTLogConsFilter";
    Query = "SELECT * from __InstanceOperationEvent"
            " WHERE TargetInstance ISA \"NTLogCons_Example\"";
    QueryLanguage = "WQL";
};

// Create an instance of the binding
// between filter and consumer instances.

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

// Create an instance of this class right now. 

instance of NTLogCons_Example
{
   Name = "STRING1";
   InsertionString = "STRING2";
};

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