Monitorando o Event Viewer com PowerShell e WMI Event Queries – Parte 2


 

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 :

APRENDA POWERSHELL

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

Laerte Junior – Simple-Talk

About Laerte Junior

Laerte Junior Laerte Junior is a SQL Server specialist and an active member of WW SQL Server and the Windows PowerShell community. He also is a huge Star Wars fan (yes, he has the Darth Vader´s Helmet with the voice changer). He has a passion for DC comics and living the simple life. "May The Force be with all of us"
This entry was posted in Algo que Esqueci de Categorizar. Bookmark the permalink.

1 Response to Monitorando o Event Viewer com PowerShell e WMI Event Queries – Parte 2

  1. SqlChow says:

    Just read this using google translate. Cool post. Waiting for the final part to come out 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s