Compartilhar via


Registrando no log de eventos do NT com base em um evento

A classe NTEventLogEventConsumer grava uma mensagem no log de eventos do Windows quando ocorre um evento especificado. Essa classe é um consumidor de evento padrão que o WMI fornece.

Observação

Os usuários autenticados não podem, por padrão, registrar eventos no log do aplicativo em um computador remoto. Como resultado, o exemplo descrito neste tópico falhará se você usar a propriedade UNCServerName da classe NTEventLogEventConsumer e especificar um computador remoto como seu valor. Para saber como alterar a segurança do log de eventos, consulte este artigo da base de conhecimento.

 

O procedimento básico para usar um consumidor padrão é descrito em Monitorando e respondendo a eventos com consumidores padrão. Veja a seguir etapas adicionais além do procedimento básico, necessárias ao usar a classe NTEventLogEventConsumer. As etapas descrevem como criar um consumidor de eventos que grava no log de eventos do aplicativo.

O procedimento a seguir descreve como criar um consumidor de eventos que grava no Log de Eventos do NT.

Para criar um consumidor de eventos que grava no Log de Eventos do Windows

  1. Em um arquivo MOF (Formato de Objeto Gerenciado), crie uma instância de NTEventLogEventConsumer para receber os eventos solicitados na consulta. Para obter mais informações sobre como escrever código MOF, consulte Criando classes MOF (Formato de Objeto Gerenciado).

  2. Crie e nomeie uma instância de __EventFilter e crie uma consulta para especificar o tipo de evento que dispara a gravação no Log de Eventos do NT.

    Para obter mais informações, consulte Consultar com WQL.

  3. Crie uma instância de __FilterToConsumerBinding para associar o filtro à instância de NTEventLogEventConsumer.

  4. Compile o arquivo MOF usando Mofcomp.exe.

Exemplo

O exemplo nesta seção está no código MOF, mas você pode criar as instâncias programaticamente usando a API de Script para WMI ou a API COM para WMI. O exemplo mostra como criar um consumidor para gravar no log de eventos do aplicativo usando NTEventLogEventConsumer. O MOF cria uma nova classe chamada "NTLogCons_Example", um filtro de evento para consultar operações, como criação, em uma instância dessa nova classe e uma associação entre filtro e consumidor. Como a última ação no MOF é criar uma instância do NTLogCons_Example, você pode ver imediatamente o evento no log de eventos do aplicativo executando Eventvwr.exe.

O EventID=0x0A for SourceName="WinMgmt" identifica uma mensagem com o texto a seguir. Os "%1", "%2", "%3" são espaços reservados para cadeias de caracteres correspondentes especificadas na 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.

O procedimento a seguir descreve como usar o exemplo.

Para usar o exemplo

  1. Copie a listagem do MOF abaixo em um arquivo de texto e salve-o com uma extensão .mof.

  2. Em uma janela de Comando, compile o arquivo MOF usando o comando a seguir:

    Nome do arquivoMofcomp**.mof**

  3. Execute Eventvwr.exe. Examine o log de eventos do aplicativo. Você deve ver um evento com ID = 10 (o EventID), Source = "WMI" e Type = Error.

  4. Clique duas vezes na mensagem Tipo de informação do WMI com 10 na coluna Evento. A descrição a seguir será exibida para o 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";
};

Monitorando e respondendo a eventos com consumidores padrão