Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O WMI contém uma infraestrutura de eventos que produz notificações sobre alterações nos dados e serviços WMI. WMI classes de eventos fornecem notificações quando ocorrem eventos específicos.
As seguintes seções são discutidas neste tópico:
- Consultas de eventos
- Exemplo
- Consumidores de Eventos
- Organizar Eventos
- Quotas de Subscrição
- Tópicos relacionados
Consultas de eventos
Você pode criar uma semissíncrona ou assíncrona consulta para monitorar alterações em logs de eventos, criação de processos, status do serviço, disponibilidade do computador ou espaço livre na unidade de disco e outras entidades ou eventos. Em scripts, o método SWbemServices.ExecNotificationQuery é usado para assinar eventos. Em C++, IWbemServices::ExecNotificationQuery é usado. Para obter mais informações, consulte a secção Chamar um Método.
A notificação de uma alteração no modelo de dados WMI padrão é chamada de evento intrínseco . __InstanceCreationEvent ou __NamespaceDeletionEvent são exemplos de eventos intrínsecos. A notificação de uma alteração que um fornecedor faz para definir um evento do fornecedor é chamada de evento extrínseco. Por exemplo, o System Registry Provider, Power Management Event Providere Win32 Provider definem seus próprios eventos. Para obter mais informações, consulte Determinação do Tipo de Evento a Receber.
Exemplo
O exemplo de código de script a seguir é uma consulta para o evento intrínseco __InstanceCreationEvent da classe de evento Win32_NTLogEvent. Você pode executar este programa em segundo plano e quando há um evento, uma mensagem aparece. Se você fechar a caixa de diálogo Aguardando eventos, o programa para de aguardar eventos. Esteja ciente de que a SeSecurityPrivilege deve ser ativada.
Sub SINK_OnObjectReady(objObject, objAsyncContext)
WScript.Echo (objObject.TargetInstance.Message)
End Sub
Set objWMIServices = GetObject( _
"WinMgmts:{impersonationLevel=impersonate, (security)}")
' Create the event sink object that receives the events
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
' Set up the event selection. SINK_OnObjectReady is called when
' a Win32_NTLogEvent event occurs
objWMIServices.ExecNotificationQueryAsync sink,"SELECT * FROM __InstanceCreationEvent " & "WHERE TargetInstance ISA 'Win32_NTLogEvent' "
WScript.Echo "Waiting for events"
# Define event Query
$query = "SELECT * FROM __InstanceCreationEvent
WHERE TargetInstance ISA 'Win32_NTLogEvent' "
<# Register for event - also specify an action that
displays the log event when the event fires.#>
Register-WmiEvent -Source Demo1 -Query $query -Action {
Write-Host "Log Event occured"
$global:myevent = $event
Write-Host "EVENT MESSAGE"
Write-Host $event.SourceEventArgs.NewEvent.TargetInstance.Message}
<# So wait #>
"Waiting for events"
O exemplo de código VBScript a seguir mostra o evento extrínseco __RegistryValueChangeEvent que o provedor do Registro define. O script cria um consumidor temporário usando a chamada para SWbemServices.ExecNotificationQueryAsynce só recebe eventos quando o script está em execução. O script a seguir é executado indefinidamente até que o computador seja reinicializado, o WMI seja interrompido ou o script seja interrompido. Para parar o script manualmente, use o Gerenciador de Tarefas para parar o processo. Para pará-lo programaticamente, use o método Terminate na classe Win32_Process. Para obter mais informações, consulte Definindo a segurança em uma chamada assíncrona.
strComputer = "."
Set objWMIServices=GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")
set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIServices.ExecNotificationQueryAsync objSink, _
"Select * from RegistryValueChangeEvent Where Hive = 'HKEY_LOCAL_MACHINE' and KeyPath = 'SYSTEM\\ControlSet001\\Control' and ValueName = 'CurrentUser'"
WScript.Echo "Waiting for events..."
While (True)
WScript.Sleep (1000)
Wend
WScript.Echo "Listening for Registry Change Events..." & vbCrLf
While(True)
WScript.Sleep 1000
Wend
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
WScript.Echo "Received Registry Value Change Event" & vbCrLf & wmiObject.GetObjectText_()
End Sub
Consumidores de Eventos
Você pode monitorar ou consumir eventos usando os seguintes consumidores enquanto um script ou aplicativo está em execução:
Consumidores temporários de eventos
Um consumidor temporário é um aplicativo cliente WMI que recebe um evento WMI. O WMI inclui uma interface exclusiva que é usada para especificar os eventos a serem enviados pelo WMI para um aplicativo cliente. Um consumidor de evento temporário é considerado temporário porque só funciona quando carregado especificamente por um utilizador. Para obter mais informações, consulte Recebendo eventos durante a duração do seu aplicativo.
Consumidores de eventos permanentes
Um consumidor permanente é um objeto COM que pode receber um evento WMI a todo o momento. Um consumidor de evento permanente usa um conjunto de objetos persistentes e filtros para capturar um evento WMI. Como um consumidor de evento temporário, você configura uma série de objetos WMI e filtros que capturam um evento WMI. Quando ocorre um evento que corresponde a um filtro, o WMI carrega o consumidor de evento permanente e o notifica sobre o evento. Como um consumidor permanente é implementado no repositório WMI e é um arquivo executável registrado no WMI, o consumidor de evento permanente opera e recebe eventos depois de ser criado e mesmo após uma reinicialização do sistema operacional, desde que o WMI esteja em execução. Para obter mais informações, consulte Receber eventos a qualquer hora.
Os scripts ou aplicativos que recebem eventos têm considerações especiais de segurança. Para obter mais informações, consulte Protegendo os eventos WMI.
Uma aplicação ou script pode usar um provedor de eventos WMI interno que fornece classes de consumidor padrão. Cada classe de consumidor padrão responde a um evento com uma ação diferente, enviando uma mensagem de email ou executando um script. Não é necessário escrever código de provedor para usar uma classe de consumidor padrão para criar um consumidor de evento permanente. Para obter mais informações, consulte Monitorização e Resposta a Eventos com Consumidores Padrão.
Proporcionar Eventos
Um provedor de eventos é um componente COM que envia um evento para o WMI. Você pode criar um provedor de eventos para enviar um evento em um aplicativo C++ ou C#. A maioria dos provedores de eventos gerencia um objeto para WMI, por exemplo, um aplicativo ou item de hardware. Para obter mais informações, consulte Escrevendo um provedor de eventos.
Um evento cronometrado ou repetitivo é um evento que ocorre em um momento predeterminado.
O WMI fornece as seguintes maneiras de criar eventos cronometrados ou repetitivos para seus aplicativos:
- A infraestrutura de eventos padrão da Microsoft.
- Uma classe de temporizador especializada.
Para obter mais informações, consulte Receber um evento cronometrado ou repetitivo. Ao escrever um provedor de eventos, considere as informações de segurança identificadas em Fornecendo eventos com segurança.
É recomendável que as assinaturas de eventos permanentes sejam compiladas no namespace \root\subscription. Para obter mais informações, consulte Implementação de Assinaturas Permanentes de Eventos entre Namespaces.
Quotas de Subscrição
A sondagem de eventos pode degradar o desempenho de provedores que oferecem suporte a consultas em conjuntos de dados enormes. Além disso, qualquer usuário que tenha acesso de leitura a um namespace com provedores dinâmicos pode executar um ataque de negação de serviço (DoS). O WMI mantém cotas para todos os usuários combinados e para cada consumidor de evento na instância única de __ArbitratorConfiguration localizada no namespace \root. Essas cotas são globais e não para cada namespace. Não é possível alterar as quotas.
Atualmente, o WMI impõe cotas usando as propriedades de __ArbitratorConfiguration. Cada cota tem uma versão por usuário e uma versão total que inclui todos os usuários combinados, não por namespace. A tabela a seguir lista as cotas que se aplicam às propriedades __ArbitratorConfiguration.
| Total/PerUsuário | Quota |
|---|---|
| Total de Subscrições Temporárias Assinaturas Temporárias Por Utilizador |
10.000 1,000 |
| Total de Assinaturas Permanentes AssinaturasPermanentesPorUtilizador |
10.000 1,000 |
| InstruçõesTotaisDeVotação InstruçõesDeVotaçãoPorUtilizador |
10.000 1,000 |
| PollingMemoryTotal MemóriaDeVotaçãoPorUtilizador |
10.000.000 (0x989680) bytes 5.000.000 (0x4CB40) bytes |
Um administrador ou um usuário com permissão FULL_WRITE no namespace pode modificar a instância singleton do __ArbitratorConfiguration. O WMI rastreia a cota por usuário.