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
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).
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.
Crie uma instância de __FilterToConsumerBinding para associar o filtro à instância de NTEventLogEventConsumer.
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
Copie a listagem do MOF abaixo em um arquivo de texto e salve-o com uma extensão .mof.
Em uma janela de Comando, compile o arquivo MOF usando o comando a seguir:
Nome do arquivoMofcomp**.mof**
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.
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";
};
Tópicos relacionados