Na primeira parte, Monitorando o Event Viewer com PowerShell e WMI Event Queries – Parte 1, nós vimos alguns conceitos importantes como WMI, WQL, intrinsic e extrinsic events. Vamos agora partir para os temporary events, tipos de intrinsic events e finalmente na terceira parte ver o Objeto $Event e registrar um evento no Event Viewer .
A finalidade de criar um evento, é o monitoramento quando necessário. Estes eventos precisam ter consumers , ou algum processo que fique rodando em background esperando a informação que o evento foi disparado e então fazer uma determinada ação Eles são chamados WMI Event Consumers
Existe 2 tipos de WMI Event Consumers :
Temporary Events Consumers : Este tipo de event consumer somente recebe as notificações enquanto ele estiver ativo (ou vivo). Isso quer dizer que enquanto sua sessão de PowerShell estiver aberta , na qual você registrou o evento usando o cmdlet Register-WMIEvent, seu evento (ou eventos) estarão ativos. Também um temporary event cria um PowerShell background job (veremos bem a fundo isso nos videos de treinamento) e você pode finalizar este evento usando os cmdlets de bakcground Jobs (Get-Job, Stop-Job, Remove-Job, Receive-Job..etc)
Como o uso deste tipo de evento fica restrito a vida da sessão PowerShell, o principal uso é quando você precisa monitorar algum recurso ou processo específico e por um certo período de tempo.
Permanent Event Consumers : Ao contrário do temporary event consumer , este tipo de event consumer não se limita a sessão de PowerShell. Este tipo de event consumer usa um conjunto de objetos persistentes e filtros para capturar o evento WMI.
Como ele le é registrado no repositório da WMI e implementado por um executável, mesmo quando você reebotar sua maquina eles continuarão ativos (enquanto o serviço de WMI estiver ativo claro)
Nosso foco hoje são os Temporary Event Consumers. Vimos que neste tipo de event consumer, temos 2 tipos de WMI events : Intrinsic e Extrinsic events. Para nosso objetivo, monitorar o Event Viewer, usaremos os Intrinsic events e com ele temos varias classes de sistema, mas as mais importantes são :
__InstanceCreationEvent : Esta classe WMI gerenérica é usada para monitorar , como o próprio nome diz, processos e recursos quando ele forem criados. Na primeira parte, Monitorando o Event Viewer com PowerShell e WMI Event Queries – Parte 1, vimos um código que monitar qualquer processo quando criado. Para filtrarmos por um determinado processo, por exexmplo quando abrir um notepad, temos que usar esta classe junto a WQL de Event Queries, que veremos logo abaixo.
__InstanceDeletionEvent : Nesta classe, todos os processos ou recursos filtrados pela WQL que forem parados serão monitorados. Se eu estiver monitorando o notepad por exemplo, quando eu fechá-lo esta classe será acionada.
__InstanceModificationEvent : Esta classe WMI monitora as mudanças ocorridas. Um bom exemplo é se quisermos por exemplo, monitorar o percentual de carga do processador e ser notificado caso ele ultrapasse algum valor.
Outro uso muito interessante, e eu tenho vários exemplos aqui no meu blog, é caso eu queira monitorar algum serviço (como o do SQL Server). Não preciso criar um evento para start e stop. Coloco um unico evento na classe __InstanceModificationEvent que vai ficar de olho nas mudanças deste serviço.
Para usarmos estas classes WMI, precisamos de um tipo especial de WQL . As Event Queries.
Não iremos a fundo na sintaxe dela,sendo que a WQL para Event Queries geral tem este formato :
SELECT <ListaDePropriedades> FROM <ClasseDeEvento> WITHIN <Intervalo>
WHERE TargetInstance | PreviousInstance ISA <NomeClasseWMI>
AND TargetInstance.<NomeDaPropriedade> = <AlgumValor>
Vamos entender um pouco mais esta sintaxe :
| SELECT <ListaDePropriedades> |
Aqui você especifica quais propriedades da classe WMI em questão você quer retornar quando o evento for disparado. Geralmente usamos o coringa * para trazer todas |
Select *, Select propriedade1,propriedade2, propriedade3…. |
| FROM <ClasseDeEvento> | Nesta parte você coloca qual classe de evento quer usar : __InstanceCreationEvent , __InstanceDeletionEvent e __InstanceModificationEvent . | From __InstanceCreationEvent From __InstanceDeletionEvent From __InstanceModificationEvent |
| WITHIN <Intervalo> | Neste caso você informa qual o pool em SEGUNDOS que você quer que o evento execute a ação. Por exemplo, quero que me envie um email 5 segundos após o serviço do SQL Server parar. | Within 5 Within 10 Within100 |
| WHERE TargetInstance | PreviousInstance ISA <NomeClasseWMI> |
Aqui você começa sua condição. Usamos ou TargetInstance ou PreviousInstance * mais a keyword ISA e o nome da classe a ser monitorada. | WHERE TargetInstance ISA ‘Win32_Process’ |
| AND TargetInstance .<NomeDaPropriedade> = <AlgumValor> |
E finalmente finalizamos a condição usando quantas propriedades e filtros quisermos, sempre com o AND. Por exemplo Quero monitorar quando um novo processo NOTEPAD começar, uso o AND.Name = ‘NOTEPAD.EXE’ | AND TargetInstance.Name = ‘NOTEPAD.EXE’ |
* TargetInstance e PreviousInstance representam o estado do objeto antes e depois do evento. PreviousIntance somente está disponivel no __InstanceModificationEvent . A keyword ISA é obrigatório pois desta maneira aplicamos o evento também as subclasses da classe especificada em <NomeClasseWMI>.
Então , como dito acima, para monitorar somente os processos notepad startados usamos a WQL :
“SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA ‘Win32_Process’ and TargetInstance.Name = ‘NOTEPAD.EXE’”
Rode este código e abra uma nova calculadora e espere 5 segundos :
$query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process' and TargetInstance.Name = 'CALC.EXE'"
#Register WMI event
Register-WMIEvent -Query $query -Action {Write-Host "Uma calculadora foi startada"}
Agora deixe a calculadora aberta e rode ..:
$query = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process' and TargetInstance.Name = 'CALC.EXE'"
#Register WMI event
Register-WMIEvent -Query $query -Action {Write-Host "Uma calculadora foi parada"}
agora feche ela..
Muito legal heim !!!!
É isso aí pessoal, vimos nesta segunda parte os tipos de Intrinsic Events mais usados, a WQL genérica para Event Queries e como registrar um evento caso um processo específico seja startado e parado.
Na terceira e e ultima parte deste artigo veremos o Objeto $Event e como trabalhar com ele (claro, precisamos das informações que a classe esta me retornando quando o evento é disparado) e finalmente como registrar um evento no Event Viewer .
Não se esqueçam que estou preparando as videos aulas dos treinamentos de PowerShell. Serão vídeos pequenos e acessíveis financeiramente e voltados para a programação do Shell e não como usar os cmdlets.
Curta nossa pagina no facebook :
Torne-se um especialista em PowerShell
Abs Pessoal. QQ duvida só me pingar !!!
Recursos :
WMI Query Language via PowerShell – Ravikanth Chaganti
Using PowerShell and WMI Events Queries for Powerful Notifications




