Share via


Protokollierung im NT-Ereignisprotokoll basierend auf einem Ereignis

Die NTEventLogEventConsumer-Klasse schreibt eine Nachricht in das Windows-Ereignisprotokoll, wenn ein angegebenes Ereignis auftritt. Diese Klasse ist ein Standardereignisconsumer, den WMI bereitstellt.

Hinweis

Authentifizierte Benutzer können auf einem Remotecomputer standardmäßig keine Ereignisse im Anwendungsprotokoll protokollieren. Daher schlägt das in diesem Thema beschriebene Beispiel fehl, wenn Sie die UNCServerName-Eigenschaft der NTEventLogEventConsumer-Klasse verwenden und einen Remotecomputer als Wert angeben. Informationen zum Ändern der Ereignisprotokollsicherheit finden Sie in diesem KB-Artikel.

 

Die grundlegende Vorgehensweise für die Verwendung von Standardconsumern wird unter Überwachen von Ereignissen und Reagieren auf Ereignisse mit Standardconsumern beschrieben. Im Folgenden sind weitere Schritte aufgeführt, die über die grundlegende Vorgehensweise hinausgehen, die bei Verwendung der NTEventLogEventConsumer-Klasse erforderlich sind. In den Schritten wird beschrieben, wie Sie einen Ereignisconsumer erstellen, der in das Anwendungsereignisprotokoll schreibt.

In der folgenden Vorgehensweise wird beschrieben, wie Sie einen Ereignisconsumer erstellen, der in das NT-Ereignisprotokoll schreibt.

So erstellen Sie einen Ereignisconsumer, der in das Windows-Ereignisprotokoll schreibt

  1. Erstellen Sie in der MOF-Datei (Managed Object Format) eine Instanz von NTEventLogEventConsumer, um die Ereignisse zu empfangen, die Sie in der Abfrage anfordern. Weitere Informationen zum Entwickeln von MOF-Code finden Sie unter Entwerfen von MOF-Klassen (Managed Object Format).

  2. Erstellen Sie eine Instanz von __EventFilter, und erstellen Sie dann eine Abfrage, um den Typ des Ereignisses anzugeben, der das Schreiben in das NT-Ereignisprotokoll auslöst.

    Weitere Informationen finden Sie unter Abfragen mit WQL.

  3. Erstellen Sie eine Instanz von __FilterToConsumerBinding, um den Filter der Instanz von NTEventLogEventConsumer zuzuordnen.

  4. Kompilieren Sie die MOF-Datei mit Mofcomp.exe.

Beispiel

Die Beispiele in diesem Abschnitt befinden sich im MOF-Code, aber Sie können die Instanzen programmgesteuert erstellen, indem Sie die Skript-API für WMI oder die COM-API für WMI verwenden. Das Beispiel zeigt, wie Sie mithilfe von NTEventLogEventConsumer einen Consumer zum Schreiben in das Anwendungsereignisprotokoll erstellen. Anhand des MOF-Codes wird eine neue Klasse mit dem Namen „NTLogCons_Example“, ein Ereignisfilter zum Abfragen von Vorgängen wie das Erstellen auf einer Instanz dieser neuen Klasse und eine Bindung zwischen Filter und Consumer erstellt. Da die letzte Aktion im MOF darin besteht, eine Instanz von NTLogCons_Example zu erstellen, können Sie das Ereignis sofort im Anwendungsereignisprotokoll sehen, wenn Sie Eventvwr.exe ausführen.

EventID=0x0A for SourceName="WinMgmt" identifiziert eine Meldung mit dem folgenden Text. „%1“, „%2“ und „%3“ sind Platzhalter für entsprechende Zeichenfolgen, die im Array InsertionStringTemplates angegeben sind.

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.

Nachfolgend wird beschrieben, wie Sie das Beispiel verwenden können.

So verwenden Sie das Beispiel

  1. Kopieren Sie die MOF-Liste in eine Textdatei, und speichern Sie sie mit der Erweiterung „.mof“.

  2. Kompilieren Sie die MOF-Datei in einem Befehlsfenster mit dem folgenden Befehl:

    MofcompDateiname**.mof**

  3. Führen Sie Eventvwr.exe aus. Sehen Sie sich das Anwendungsereignisprotokoll an. Es sollte ein Ereignis mit der ID = 10 (die EventID), Source = "WMI" und Type = Error angezeigt werden.

  4. Doppelklicken Sie in WMI auf die Meldung Informationstyp mit 10 in der Spalte Ereignis . Die folgende Beschreibung wird für das Ereignis angezeigt.

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

Überwachen von Ereignissen und Reagieren auf Ereignisse mit Standardconsumern