Freigeben über


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 standardmäßiger Ereignisconsumer, den WMI bereitstellt.

Hinweis

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

 

Das grundlegende Verfahren für die Verwendung eines Standardconsumers wird unter Überwachung von und Reaktion auf Ereignisse mit Standardconsumern beschrieben. Im Folgenden finden Sie weitere Schritte, die über die grundlegende Prozedur hinausgehen und bei Verwendung der NTEventLogEventConsumer-Klasse erforderlich sind. In den Schritten wird beschrieben, wie sie einen Ereignisconsumer erstellen, der in das Anwendungsereignisprotokoll schreibt.

Das folgende Verfahren beschreibt, wie ein Ereignisconsumer erstellt wird, der in das NT-Ereignisprotokoll schreibt.

So erstellen Sie einen Ereignisconsumer, 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 NTEventLogEventConsumer zuzuordnen.

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

Beispiel

Das Beispiel in diesem Abschnitt verwendet MOF-Code, Sie können die Instanzen aber auch programmgesteuert erstellen, indem Sie die Skript-API für WMI oder die COM-API für WMI verwenden. Das Beispiel zeigt, wie ein Consumer zum Schreiben in das Anwendungsereignisprotokoll mithilfe von NTEventLogEventConsumer erstellt wird. Das MOF erstellt eine neue Klasse mit dem Namen „NTLogCons_Example“, einen Ereignisfilter zum Abfragen von Vorgängen, z. B. Erstellen, für eine Instanz dieser neuen Klasse sowie 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.

EventID=0x0A for SourceName="WinMgmt" identifiziert eine Meldung 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 wird die Verwendung des Beispiels näher beschrieben.

So verwenden Sie das Beispiel

  1. Kopieren Sie den MOF-Eintrag unten in eine Textdatei, und speichern Sie ihn mit der Erweiterung .mof.

  2. Kompilieren Sie die MOF-Datei in einem Eingabeaufforderungsfenster mithilfe des folgenden Befehls:

    Mofcomp filename**.mof**

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

  4. Doppelklicken Sie auf die Meldung zum Informationstyp von WMI 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 und Reagieren auf Ereignisse mit Standardconsumern