Compartir a través de


Registro en el registro de eventos NT basado en un evento

La clase NTEventLogEventConsumer escribe un mensaje en el registro de eventos de Windows cuando se produce un evento especificado. Esta clase es un consumidor de eventos estándar que proporciona WMI.

Nota

De forma predeterminada, los usuarios autenticados no pueden registrar eventos en el registro de aplicaciones en un equipo remoto. Como resultado, el ejemplo descrito en este tema producirá un error si usa la propiedad UNCServerName de la clase NTEventLogEventConsumer y especifica un equipo remoto como su valor. Para obtener información sobre cómo cambiar la seguridad del registro de eventos, vea este artículo de KB.

 

El procedimiento básico para usar un consumidor estándar se describe en Supervisión y respuesta a eventos con consumidores estándar. A continuación se indican pasos adicionales más allá del procedimiento básico, necesarios al usar la clase NTEventLogEventConsumer. Los pasos describen cómo crear un consumidor de eventos que escriba en el registro de eventos de la aplicación.

En este procedimiento se describe cómo crear un consumidor de eventos que escriba en el registro de eventos NT.

Procedimientos para crear un consumidor de eventos que escriba en el registro de eventos de Windows

  1. En un archivo Managed Object Format (MOF), cree una instancia de NTEventLogEventConsumer para recibir los eventos que solicita en la consulta. Para obtener más información sobre la escritura de código MOF, vea Diseño de clases de Managed Object Format (MOF).

  2. Cree y asigne un nombre a una instancia de __EventFilter y, después, cree una consulta para especificar el tipo de evento que desencadena la escritura en el registro de eventos NT.

    Para obtener más información, vea Consulta con WQL.

  3. Cree una instancia de __FilterToConsumerBinding para asociar el filtro a la instancia de NTEventLogEventConsumer.

  4. Compile el archivo MOF mediante Mofcomp.exe.

Ejemplo

El ejemplo de esta sección está en código MOF, pero puede crear las instancias mediante programación con la API de scripting para WMI o la API COM para WMI. En el ejemplo se muestra cómo crear un consumidor para escribir en el registro de eventos de aplicación mediante NTEventLogEventConsumer. MOF crea una clase denominada "NTLogCons_Example", un filtro de eventos para consultar las operaciones, como la creación, en una instancia de esta clase nueva y un enlace entre el filtro y el consumidor. Como la última acción de MOF es crear una instancia de NTLogCons_Example, puede ver inmediatamente el evento en el registro de eventos de la aplicación ejecutando Eventvwr.exe.

EventID=0x0A for SourceName="WinMgmt" identifica un mensaje con el texto siguiente. "%1", "%2", "%3" son marcadores de posición para las cadenas correspondientes especificadas en la matriz 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.

En este procedimiento se describe cómo usar el ejemplo.

Procedimientos para usar el ejemplo

  1. Copie el código MOF que aparece a continuación en un archivo de texto y guárdelo con una extensión .mof.

  2. En una ventana Comandos, compile el archivo MOF con este comando:

    MofcompNombreDeArchivo**.mof**

  3. Run Eventvwr.exe. Examine el registro de eventos de la aplicación. Debería ver un evento con ID = 10 (el EventID), Source = "WMI", y Type = Error.

  4. Haga doble clic en el mensaje Tipo de información de WMI con 10 en la columna Evento. Se mostrará esta descripción para el evento.

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

Supervisión y respuesta a eventos con consumidores estándar