Compartilhar via


Monitorando eventos

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

  • Um serviço é interrompido inesperadamente.
  • Um servidor fica indisponível.
  • Uma unidade de disco preenche até 80% da capacidade.
  • Os eventos de segurança são relatados a um Log de Eventos NT.

O WMI dá suporte à detecção e entrega de eventos aos consumidores de eventos porque alguns provedores do WMI são provedores de eventos. Para obter mais informações, consulte Receber um evento do WMI.

Os consumidores de eventos são aplicativos ou scripts que solicitam notificação de eventos e, em seguida, executam tarefas quando eventos específicos ocorrem. Crie scripts ou aplicativos de monitoramento de eventos que monitoram temporariamente quando ocorrem eventos. O WMI também fornece um conjunto de provedores de eventos permanentes pré-instalados e as classes de consumidor permanentes que permitem monitorar permanentemente os eventos. Para obter mais informações, confira Monitoramento e resposta a eventos com consumidores padrão.

As seções a seguir serão abordadas neste tópico:

Como usar 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 evento. As consultas de evento 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. Visualize a saída do script iniciando Notepad.exe ou qualquer outro processo. O script é interrompido após cinco processos terem sido iniciados ou interrompidos.

Esse script chama SWbemServices.ExecNotificationQuery, que é a versão semissíncrona do método. Consulte o próximo script para obter um exemplo de como configurar uma assinatura de evento temporário assíncrona chamando o SWbemServices.ExecNotificationQueryAsync. Para obter mais informações, consulte Chamar um método. O script chama SWbemEventSource.NextEvent para obter e processar cada evento conforme ele chega. Salve o script em um arquivo com uma extensão .vbs e execute o script em uma linha de comando usando o 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 nas reinicializações do WMI ou nas reinicializações do sistema operacional. Um consumidor de evento temporário só pode processar eventos 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 de consumidor de eventos temporário da mesma maneira que você inicia um aplicativo WMI.

    As primeiras etapas de 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 Criar um aplicativo ou script do WMI.

  3. Defina a consulta de evento que 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 Monitorar dados de desempenho, Determinar o tipo de evento a receber e Consultar com WQL.

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

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

  5. Faça a chamada de 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 evento assíncronas, coloque o código nos vários métodos ou eventos do coletor de objetos. Para consultas de evento semissíncronas, cada objeto é retornado conforme 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 evento SWbemSink OnObjectReady.

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 comunicação semissíncrona ou síncrona. Para obter mais informações, consulte estes tópicos:

 

Como usar consumidores de eventos permanentes

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

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

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

  • Um objeto do COM que contém o código que implementa o consumidor permanente.
  • Uma nova classe de consumidores permanentes.
  • Uma instância da classe de consumidor permanente.
  • Um filtro que contém a consulta de evento.
  • Uma vinculação entre o consumidor e o filtro.

Para obter mais informações, consulte Receber eventos sempre.

O WMI fornece vários consumidores permanentes. As classes de consumidor e o objeto do COM que contém o código são pré-instalados. Por exemplo, crie e configure uma instância da classe ActiveScriptEventConsumer para executar um script quando ocorrer um evento. Para obter mais informações, confira Monitoramento e resposta a eventos com consumidores padrão. Para obter um exemplo de como usar ActiveScriptEventConsumer, consulte Executando um script com base em um evento.

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

Para criar um consumidor de evento permanente

  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 com suporte do provedor Win32 e é registrado por padrão com o namespace \root\cimv2.

    Observação

    Use a propriedade EventNamespace do __EventFilter usado no registro para criar uma assinatura de namespace cruzado. Para obter mais informações, consulte Implementar assinaturas de evento permanentes entre namespaces.

     

  2. Registre o provedor de consumidor de eventos com o namespace em que 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 eventos permanentes é 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 deseja usar.

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

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

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

    Defina os campos necessários para a instância de filtro de evento. Os campos necessários para __EventFilter são Nome, QueryLanguage e Consulta. A propriedade Nome pode ser qualquer nome exclusivo para uma instância dessa classe. A propriedade QueryLanguage é sempre definida como "WQL". A propriedade de Consulta é uma cadeia de caracteres que contém uma consulta de evento. Um evento é gerado quando a consulta de um consumidor de eventos 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 do evento associado ao evento que corresponde aos critérios especificados no filtro de evento. O WMI usa o provedor de consumidor de eventos para localizar o aplicativo de consumidor de eventos permanente a ser iniciado.