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


 

Esta noite passei pela mesma situação que alguns anos atras, mas desta vez eu fui acionado para verificar um problema que estava dando em uma aplicação. Verificamos que o problema não era o Banco de Dados e me foi informado que ficaria uma pessoa na empresa terceira (do software) a noite inteira somente para resolver e precisavamos de uma maneira de monitorar o Event Viewer para que quando a exception ocorresse enviar um email para esta pessoa.

Bom.. quem me conhece sabe que eu automatizo tudo que eu posso e claro, esta situação não foi diferente. Não irei a fundo nos tópicos, estou preparando as videos aulas aonde veremos um pouco mais a fundo alguns topicos como WMI, WQL e varios outros assuntos do PowerShell, mas vamos ver o que vocês podem esperar :

O que é WMI ?

Existe um conjunto de padrões que dita e unifica o gerenciamento de ambientes de computação distribuida. Este conjunto de tecnologias é chamado WBEM ( Web-Based Enterprise Management). WMI ou Windows Management Instrumentation é a implementação da Microsoft em cima do WBEM.  Com WMI você consegue gerenciar internamente todos os componentes dos sistemas operacionais baseados em Windows com um padrão de linguagem e interface. Ë um conjunto de classes,objetos e membros que controla cada componente interno de sistemas baesados em Windows.

Todos os schemas do WMI (que guardam as definições das classes) são armazenados em um repositório chamado CIM (Commom Information Model). Este repositorio não guarda dados porque estes são acessados dinamicamente conforme requirido. Ele armazena todos as informações dos schemas que nos possibilitam gerenciar uma variedade de diferentes recursos uniformemente.

Todas as classes CIM são organizadas em namespaces, sendo que cada uma contém um grupo lógico de classes que representam um determinado recurso ou área de gerenciamento no Windows.

A namespace mais importante é a root\cimv2. Ela armazena as classes com o prefixo Win32_ que gerenciam praticamente todos os componentes de um sistema baseado em windows

Basicamente, a WMI tem a capacidade de avisar aos consumers quando algum dado de schema foi mudado..

Bom se o Event viewer é um componente do Windows, então eu posso gerenciar ele. Claro !!!

Primeiramente tenho que saber qual a WMI que corresponde ao Event Viewer. Isso é simple..basta googlar ou bingar.

Ela é a ‘Win32_NTLogEvent’. A partir dai eu usei um programinha que adoro chamado wmiexplorer para me conectar na namespace e ver as propriedades e metodos desta classe. Ele é free e simples. Existem outras maneiras como usando o Wbemtest que é default do Windows. It is up to you !!!

Usando o wmiexplorer eu me conecto na namespace root\cimv2  e pode ser localmente. Mesmo se eu for registrar um evento remotamente, a classe e seus membros é a mesma 🙂

 

image

Após isso é somente buscar pela classe ‘Win32_NTLogEvent’. em Search e verificar suas propriedades e métodos :

image

Todas essas propriedades eu posso usar para procurar algum evento especifico usando WQL. Mas eu quero colocar um gatilho para disparar quando ocorrer um evento especifico. No meu caso, um determinado SourceName e EventCode no Application

Usamos o cmdlet Register-WMIEvent para registrar esse gatilho. Vamos tentar então ? Vou registrar um gatilho para o EventCode 500 . Para isso vamos usar WQL.

O que é WQL ?

Windows Query Language é um braço da American National Standards Institute Structured Query Language (ANSI SQL) Ela é muito parecida com SQL mas com algumas alterações para suportar o acesso a WMI. 

Em uma WQL Normal com uma Classe WMI que é Classe de Evento, usamos o Select * from Classe where <condição> para registrar o evento.

Vamos criar a WQL para acessar a Classe WMI Win32_NTLogEvent :

$Query = “select * from Win32_NTLogEvent where sourcename = ‘AlgumSource’ and eventcode = 500”

Se tentarmos registrar o evento na WMI :

image

Ha. “Register-WMIEvent : Class is not an event class. “

Isso porque existem classes que não possuem eventos relacionados a ela . Quando isso acontece, podemos trabalhar com eventos também, mas utilizando uma diferente maneira de queries.

Como saber quando uma classe é de evento ou não ? Nos vídeos de  Treinamento eu irei mais a fundo em WMI.

Como a classe Win32_ProcessStartTrace ja podemos trabalho com WQL normal ou ate mesmo diretamente com a Classe, pois ela é uma classe de evento.

Register-WMIEvent -Class Win32_ProcessStartTrace -SourceIndentifier "Monitorar Processos" - Action {

    Write-Host "$($Event.SourceEventArgs.NewEvent.ProcessName) Foi Startado"

}

Este código monitora qualquer processo startado localmente.O Objeto  $Event contém toda a informação do processo. Veremos ele na segunda parte deste post. Rode este codigo e abra um notepad e veja o que acontece 🙂

Bom, neste caso, que a Win32_NTLogEvent não é uma classe de evento, temos que partir para as Event Queries

Nas Event Queries temos 3 tipos de eventos : intrinsic events, extrinsic events e timer events.  Veremos somente os dois primeiros. Até hoje não vi um uso interessante para o timer.

Intrinsic Events são usados para monitorar recursos que são associados com uma classe WMI. Toda vez que uma instância é criada, modificada ou deletada um intrinsic event é gerado na namespace.

Diferente, os Extrinsic Events não são representados por uma classe WMI. Desta maneira, não existem conjuntos comuns de extrinsic events. Quando você quer monitorar nesta condição, tem que fazer individualmente. para o recurso.

Um exemplo de extrinsic events, são os do Registry. Ele tem que usar extrinsic events pois não existe nenhuma classe WMI associada a ele individualmente (os intrinsic events associados a classe Win32_Registry representam o Registry como um todo). Os extrinsic events relacionados ao registry são RegistryKeyChangeEvent, RegistryTreeChangeEvent, e RegistryValueChangeEvent,e estão na  namespace root\default .

Na segunda parte deste post veremos os tipos de Intrinsic Events (__InstanceCreationEvent,__InstanceDeletionEvent e __InstanceModificationEvent) a sintaxe WQL para Event Queries , o objeto $event e finalmente como registrar um evento no Event Viewer

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 1

  1. Pingback: Monitorando o Event Viewer com PowerShell e WMI Event Queries – Parte 2 | $hell Your Experience !!!

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