Partilhar via


Monitoramento de eventos

Os administradores de sistema podem usar o WMI para monitorar eventos em uma rede. Por exemplo:

  • Um serviço para inesperadamente.
  • Um servidor fica indisponível.
  • Uma unidade de disco preenche até 80% capacidade.
  • Os eventos de segurança são reportados a um registo de eventos NT.

O WMI oferece suporte à deteção e entrega de eventos para consumidores de eventos porque alguns provedores WMI são provedores de eventos. Para obter mais informações, consulte Recebendo um evento WMI.

Consumidores de eventos são aplicativos ou scripts que solicitam notificação de eventos e, em seguida, executam tarefas quando eventos específicos ocorrem. Você pode criar scripts de monitoramento de eventos ou aplicativos que monitoram temporariamente quando os eventos ocorrem. WMI também fornece um conjunto de provedores de eventos permanentes pré-instalados e as classes consumidoras permanentes que permitem monitorizar eventos de forma permanente. Para obter mais informações, consulte Monitorização e Resposta a Eventos com Consumidores Padrão.

As seguintes seções são discutidas neste tópico:

Usando consumidores de eventos temporários

Os consumidores de eventos temporários são scripts ou aplicativos que retornam os eventos que correspondem a uma consulta ou filtro de eventos. As consultas de eventos temporárias geralmente usam IWbemServices::ExecNotificationQuery em aplicativos C++ ou SWbemServices.ExecNotificationQuery em scripts e Visual Basic.

Uma consulta de evento solicita instâncias de uma classe de evento que especifica um determinado tipo de evento, como Win32_ProcessTrace ou RegistryKeyChangeEvent.

O exemplo de código VBScript a seguir solicita notificação quando uma instância de Win32_ProcessTrace é criada. Uma instância dessa classe é gerada quando um processo é iniciado ou interrompido.

Para executar o script, copie-o para um arquivo chamado event.vbs e use a seguinte linha de comando: cscript event.vbs. Você pode ver a saída do script iniciando Notepad.exe ou qualquer outro processo. O script para após cinco processos terem começado ou sido interrompidos.

Esse script chama SWbemServices.ExecNotificationQuery, que é a versãosemissíncronado método. Consulte o próximo script para obter um exemplo de configuração de uma assinatura de evento temporária assíncrona chamando SWbemServices.ExecNotificationQueryAsync. Para obter mais informações, consulte chamando um método. O script chama SWbemEventSource.NextEvent para obter e processar cada evento à medida que ele chega. Salve o script em um arquivo com uma extensão .vbs e execute o script em uma linha de comando usando CScript: cscript file.vbs.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

Os consumidores de eventos temporários devem ser iniciados manualmente e não devem persistir durante reinicializações do WMI ou reinicializações do sistema operacional. Um consumidor de eventos temporário pode processar eventos somente enquanto estiver em execução.

O procedimento a seguir descreve como criar um consumidor de evento temporário.

Para criar um consumidor de evento temporário

  1. Decida qual linguagem de programação usar.

    A linguagem de programação determina a API a ser usada.

  2. Comece a codificar um aplicativo consumidor de evento temporário da mesma forma que inicia um aplicativo WMI.

    Os primeiros passos da codificação dependem da linguagem de programação. Normalmente, você faz logon no WMI e configura as configurações de segurança. Para obter mais informações, consulte Criando um aplicativo WMI ou um script.

  3. Defina a consulta de evento que você deseja usar.

    Para obter alguns tipos de dados de desempenho, talvez seja necessário usar classes fornecidas por provedores de alto desempenho. Para obter mais informações, consulte Monitorizar Dados de Desempenho, Determinando o tipo de evento a recebere Consultas com WQL.

  4. Decida fazer uma chamada assíncrona ou uma chamada semissíncrona e escolha o método API.

    As chamadas assíncronas permitem evitar a sobrecarga da sondagem de dados. No entanto, chamadas semissíncronas fornecem desempenho semelhante com maior segurança. Para mais informações, veja Chamar um Método.

  5. Faça a chamada do método assíncrono ou semissíncrono e inclua uma consulta de evento como o parâmetro strQuery.

    Para aplicativos C++, chame os seguintes métodos:

    Para os scripts, chame os seguintes métodos:

  6. Escreva o código para processar o objeto de evento retornado.

    Para consultas de eventos assíncronos, coloque o código nos vários métodos ou eventos do coletor de objetos. Para consultas de eventos semissíncronas, cada objeto é retornado à medida que o WMI o obtém, portanto, o código deve estar no loop que manipula cada objeto.

O exemplo de código de script a seguir é uma versão assíncrona do script Win32_ProcessTrace. Como as operações assíncronas retornam imediatamente, uma caixa de diálogo mantém o script ativo enquanto aguarda eventos.

Em vez de chamar SWbemEventSource.NextEvent para receber cada evento, o script tem um manipulador de eventos para o SWbemSink OnObjectReady evento.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

Observação

Um retorno de chamada assíncrono, como um retorno de chamada manipulado pela sub-rotina SINK_OnObjectReady, permite que um usuário não autenticado forneça dados ao coletor. Para maior segurança, use a comunicação semissíncrona ou a comunicação síncrona. Para obter mais informações, consulte os seguintes tópicos:

 

Usando consumidores de eventos permanentes

Um consumidor de evento permanente é executado até que seu registro seja explicitamente cancelado e, em seguida, inicia quando o WMI ou o sistema é reiniciado.

Um consumidor de evento permanente é uma combinação de classes WMI, filtros e objetos COM num sistema.

A lista a seguir identifica as partes necessárias para criar um consumidor permanente de eventos:

  • Um objeto COM que contém o código que implementa o consumidor permanente.
  • Uma nova classe de consumidores permanentes.
  • Um exemplo da classe de consumidores permanente.
  • Um filtro que contém a consulta de eventos.
  • Uma ligação entre o consumidor e o filtro.

Para obter mais informações, consulte Receção de Eventos em Qualquer Momento.

A WMI fornece vários consumidores permanentes. As classes de consumidor e o objeto COM que contém o código são pré-instalados. Por exemplo, você pode criar e configurar uma instância da classeActiveScriptEventConsumer para executar um script quando ocorre um evento. Para obter mais informações, consulte Monitorização e Resposta a Eventos com Consumidores Padrão. Para obter um exemplo de como usar ActiveScriptEventConsumer, consulte Executando um script baseado em um evento.

O procedimento a seguir descreve como criar um consumidor de evento permanente.

Criar um evento permanente para o consumidor

  1. Registre o provedor de eventos com o namespace que você está usando.

    Alguns provedores de eventos só podem usar um namespace específico. Por exemplo, __InstanceCreationEvent é um evento intrínseco que é suportado pelo provedor Win32 e é registrado por padrão com o namespace \root\cimv2.

    Observação

    Você pode usar a propriedade EventNamespace do __EventFilter usado no registo para criar uma assinatura inter-namespace. Para obter mais informações, consulte Implementação de Assinaturas Permanentes de Eventos Entre Espaços de Nomes.

     

  2. Registre o provedor consumidor de eventos com o namespace onde as classes de evento estão localizadas.

    O WMI usa um provedor de consumidor de eventos para encontrar um consumidor de eventos permanente. O consumidor de evento permanente é o aplicativo que o WMI inicia quando um evento é recebido. Para registrar o consumidor do evento, os provedores criam instâncias de __EventConsumerProviderRegistration.

  3. Crie uma instância da classe que representa o consumidor de evento permanente que você deseja usar.

    As classes de consumidor de evento são derivadas da classe __EventConsumer. Defina as propriedades que a instância do consumidor de evento requer.

  4. Registe o consumidor com o COM usando o utilitário regsvr32.

  5. Crie uma instância da classe de filtro de eventos __EventFilter.

    Defina os campos obrigatórios para a instância do filtro de eventos. Os campos obrigatórios para __EventFilter são Nome, QueryLanguagee Query. A propriedade Name pode ser qualquer nome exclusivo para uma instância dessa classe. A propriedade QueryLanguage é sempre definida como "WQL". A propriedade Query é uma cadeia de caracteres que contém uma consulta de evento. Um evento é gerado quando a consulta do consumidor de um evento permanente falha. A origem do evento é WinMgmt, a ID do evento é 10 e o tipo de evento é Error.

  6. Crie uma instância da classe __FilterToConsumerBinding para associar um consumidor de evento lógico a um filtro de evento.

    O WMI usa uma associação para localizar o consumidor de evento associado ao evento que corresponde aos critérios especificados no filtro de eventos. WMI usa o provedor de consumidor de eventos para encontrar a aplicação de consumidor de eventos permanente a ser iniciada.