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 Standardereignis-Consumer, der von WMI zur Verfügung steht.

Hinweis

Authentifizierte Benutzer können standardmäßig keine Ereignisse im Anwendungsprotokoll auf einem Remotecomputer 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 Sicherheit von Ereignisprotokollen finden Sie in diesem KB-Artikel.

Das grundlegende Verfahren für die Verwendung eines Standard-Consumers wird unter Überwachen und Reagieren auf Ereignisse mit Standardverbrauchernbeschrieben. Im Folgenden finden Sie zusätzliche Schritte, die über die grundlegende Prozedur hinausgehen und bei Verwendung der NTEventLogEventConsumer-Klasse erforderlich sind. In den Schritten wird beschrieben, wie Sie einen Ereignisverbraucher erstellen, der in das Anwendungsereignisprotokoll schreibt.

Im folgenden Verfahren wird beschrieben, wie sie einen Ereignisverbraucher erstellen, der in das NT-Ereignisprotokoll schreibt.

So erstellen Sie einen Ereignisverbraucher, der in das Windows Ereignisprotokoll schreibt

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

  2. Erstellen Und benennen Sie eine Instanz von _ _ EventFilter,und erstellen Sie dann eine Abfrage, um den Ereignistyp 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 NTEventLogEventConsumerzuzuordnen.

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

Beispiel

Das Beispiel in diesem Abschnitt befindet sich im MOF-Code. Sie können die Instanzen jedoch programmgesteuert erstellen, indem Sie die Skript-API für WMI oder die COM-API für WMIverwenden. Das Beispiel zeigt, wie ein Consumer erstellt wird, um mit NTEventLogEventConsumerin das Anwendungsereignisprotokoll zu schreiben. Die MOF erstellt eine neue Klasse namens "NTLogCons _ Example", einen Ereignisfilter zum Abfragen von Vorgängen wie der Erstellung für eine Instanz dieser neuen Klasse und eine Bindung zwischen Filter und Consumer. Da die letzte Aktion im MOF darin besteht, eine Instanz von NTLogCons Example zu _ erstellen, können Sie das Ereignis sofort im Anwendungsereignisprotokoll anzeigen, indem Sie Eventvwr.exe ausführen.

Identifiziert EventID=0x0A for SourceName="WinMgmt" eine Nachricht mit dem folgenden Text. "%1", "%2", "%3" sind Platzhalter für entsprechende Zeichenfolgen, die im InsertionStringTemplates-Array 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.

Im folgenden Verfahren wird die Verwendung des Beispiels beschrieben.

So verwenden Sie das Beispiel

  1. Kopieren Sie die unten stehende MOF-Auflistung in eine Textdatei, und speichern Sie sie mit der Erweiterung MOF.

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

    Mofcomp-Dateiname}.mof*

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

  4. Doppelklicken Sie in der Spalte Ereignis auf die Meldung Informationstyp von WMI mit 10. 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 und Reagieren auf Ereignisse mit Standard-Consumern