Partilhar via


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

A classeNTEventLogEventConsumer 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 classeNTEventLogEventConsumere especificar um computador remoto como seu valor. Para saber como alterar a segurança do log de eventos, consulte este artigo da KB.

 

O procedimento básico para usar um consumidor padrão é descrito em Monitoramento e resposta a eventos com consumidores padrão. A seguir estão etapas adicionais além do procedimento básico, necessárias quando se utiliza 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 (Managed Object Format), 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 Designing Managed Object Format (MOF) Classes.

  2. Crie e nomeie uma instância de __EventFiltere, em seguida, 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 Consultando 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 eventos 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 de 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 seguinte texto. 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 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 seguinte comando:

    Mofcompnome do arquivo**.mof**

  3. Execute Eventvwr.exe. Observe o log de eventos do aplicativo. Você deverá ver um evento com ID = 10 (ID do Evento), Fonte = "WMI" e Tipo = Erro.

  4. Clique duas vezes na mensagem tipo de Informação do WMI na coluna Evento com 10. A seguinte descrição 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";
};

Monitoramento e Resposta a Eventos com Consumidores Padrão