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

Posted in Algo que Esqueci de Categorizar | Leave a comment

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

Posted in Algo que Esqueci de Categorizar | 1 Comment

SQLSaturday 245 – Rio de Janeiro – 31 de Agosto

 

Pessoal , com grande satisfação informamos que  teremos mais uma edição do SQLSaturday no Rio de Janeiro, dia 31 de Agosto de 2013.

Preparem-se para um dia inteiro de treinamento free de SQL Server. Parabéns ao Dennes Torres pela iniciativa e vamos la.

http://www.sqlsaturday.com/245/eventhome.aspx

O call for speakers esta aberto. Submetam suas sessões :

http://www.sqlsaturday.com/245/callforspeakers.aspx

 

SQLSAT245_print

Posted in Algo que Esqueci de Categorizar | 2 Comments

Evento de 10 anos do codificando .Net

Reblogged from Freccia's Blog:

Olá pessoal,

A comunidade comunidade Codificando .Net e SQL estará realizando no mês de junho/2013 seu evento em comemoração aos 10 anos de vida . A comunidade do Codificando .Net já é bastante conhecida no cenário brasileiro e para quem quiser saber mais sobre a mesma acesse o site da comunidade.

Estou vindo aqui para então divulgar que a submissão de palestras para o evento está aberta e para quem quiser compartilhar seus conhecimentos essa é uma ótima oportunidade.

Read more… 85 more words

Posted in Algo que Esqueci de Categorizar | Leave a comment

SQLBITS XI..again…unforgettable

 

For the second time I had the honor of being chosen as a speaker for the largest SQL Server event in Europe. the SQLBITS.
My journey began in Amsterdam, Leiden and Noordwijk a week before from SQLBITS , where I met fantastic places and generous people. I can say that Netherlands is a amazing country and it is something that was in my Bucket List.

So I flew to Nottingham, home of Robin Hood. On the first day, INeil Hambly and Tom La Rock headed out to explore the city. An amazing place, filled with several local history. Of course, we are talking about Europe, the birthplace of human history.

On Friday, the SQLBITS started with a Keynote of Conor Cunningham talking about Azure. I didn’t know that Connor was in the Azure team, and I can say that was an amazing presentation and we can wait a BIG stuff coming soon with Azure. Well, Buck Woody, Bob Ward and Conor Cunningham talking about Azure…hummm…we really need to get our eyes to the Cloud.

Then I went to the Kalen Delaney’s session – Seeking SQL Server Secrets..again I learned a  LOT of new stuff with trace flags..of course. She is the SQLQueen.  I’ve heard people saying things that she knows stuff about SQL Server that the SQL Server team  does not know (LOL).

On Saturday was my sessions. It had something like 50 people and all of them interested and making questions. It was amazing. All my demos worked and I could show a bit about the Power of PowerShell side of the force.

After that I got the Allen White’s session about PowerShell (of course) He is one of the master Jedi about this.

Our day finished with a great dinner with the #sqlfamily in a ..guess where … Brazilian restaurant (barbecue) funny lol

Again, it was a amazing conference, very well organized of course, and ..perfect..everything was perfect..at least for me.

I just need to thanks again to the SQLBITS team for the opportunity . I am deeply grateful and honored to be a part for the second time this fantastic conference.  And also to the amazing attendees of my session. You guys rock !!!!

Thanks guys !!! Specially to my good friend Neil Hambly . You are the man bro !!!!

DOWNLOAD THE CODE AND PRESENTATION !!!

 

PS – Are stuff like this that makes me keep sharing and learning :

image

or with the Blog post from a new friend that I did in SQLBITS and a good PowerShell scripter too

Sir Rob Sewell :

Powershell won’t save when running as a scheduled job

Or, How SQLBits put me in touch with Laerte and solved a problem

Thanks for the kind words man. I am honored  and glad that I could help :)

I have  pictures of course..you guys know me. All the pictures are in my Facebook (crap..I have Facebook now)

Laerte Junior Facebook

But don’t expect so much from me in Facebook..it is too much information LOL !!!

 

Thanks !!!!!

Posted in Algo que Esqueci de Categorizar | Leave a comment

E o Virtual PASS PT volta a ativa

Reblogged from Freccia's Blog:

Olá pessoal,

Desde o começo do ano o Virtual PASS PT ainda não tinha dado as caras com sua programação mensal de sempre, claro que isso acontece por alguns motivos, e eles podem ser muito bons. Acredito que aqui todos saibam, mas o Virtual PASS PT até meados de Abril/2013 era liderado pelo MVP Felipe Ferreira(Twitter|Blog) em parceria com o PASS Regional Mentor Laerte Junior(

Read more… 184 more words

Posted in Algo que Esqueci de Categorizar | Leave a comment

Instalando Hyper-V Failover Clustering no seu Note

 

Galera, montei um video em portugues de como instalar e configurar  Hyper-V  Failover Clustering no seu laptop, com uma maquina fisica somente. bem legal pra quem quiser fazer teste de live migration com o SQL Server.

Recomendo também os videos do Nirtão Pinheiro sobre SQL Server Failover clustering end-to end.

Acesse www.mcdbabrasil.com.br do lado esquerdo. Estão lá

Você pode baixar o video de Hyper-V Failover Clustering aqui –>  http://migre.me/eeWgn

Abs e que a força esteja com vocês. :)

Posted in Algo que Esqueci de Categorizar | 1 Comment