Share via


Windows PowerShell: Respondendo a eventos da WMI

Controlar, notificar e responder a eventos do sistema é algo que o Windows faz bem, mas você também pode fazer tudo isso com o Windows PowerShell.

Don Jones

Uma das coisas clara sobre o sistema operacional do Windows é o suporte para os eventos. Sempre que algo que ocorre no sistema operacional, ele gera um evento. Bits de código, como, por exemplo, aplicativos, podem se registrar para ser notificado sobre eventos específicos para que ele pode responder com alguma ação. Por exemplo, quando você clica em um botão em uma caixa de diálogo, o aplicativo recebe a notificação de um evento de “ clique ” e sabe fazer tudo o que deve fazer quando alguém clica nesse botão.

Windows Management Instrumentation (WMI) também podem gerar eventos e você pode registrar o Windows PowerShell v2 para receber esses eventos. Em seguida, você pode usar o shell para executar quaisquer comandos que você preferir em resposta a esses eventos. WMI geralmente irá disparar um de um número relativamente pequeno de eventos, mas ele pode fazê-lo para uma grande variedade de diferentes classes WMI.

Há três pontos-chave para o uso de eventos do WMI:

  • Sabendo qual evento deseja
  • sabendo que a classe para o qual você deseja que o evento
  • usando o cmdlet de WMIEvent Register para registrar para notificações de eventos

Eventos de simples

Algumas classes WMI geram eventos. Por exemplo, a classe Win32_ProcessStartTrace gera eventos sempre que um processo é iniciado. Ele também fará isso em outras situações. Quando o evento para um novo processo é criado, ele tem um identificador de origem “ processo iniciado ”. Para se registrar para eventos, você deve executar este comando:

Register-WmiEvent –class "Win32_ProcessStartTrace" 
–sourceIdentifier "Process Started"

É claro que, basta saber que um processo iniciado não seja útil. Você provavelmente desejará definir alguma ação para o processo de logon, envie um email ou mesmo interromper o processo.

Execute Get-EventSubscriber para ver a inscrição de notificação de evento que recém-criado. Para remover todos os registros de eventos, execute Get EventSubscriber | evento cancela o registro. Você também pode usar o evento cancela o registro para remover uma assinatura específica por número de identificação.

Eventos de melhores

Alguns dos eventos do nível do sistema que WMI pode produzir são ainda mais útil. Por exemplo, um evento chamado __instancecreationevent é acionado sempre que uma nova instância da classe do WMI é criada;__instancedeletionevent é acionado sempre que uma instância é excluída. Isso pode parecer útil, mas pense dele, quase todos os elementos de hardware do sistema operacional e o computador é representado por alguma instância de uma classe WMI. Por exemplo, Win32_LogicalDisk receberá uma nova instância quando você conecta um dispositivo de armazenamento removível. Classe Win32_Process perderá a uma instância quando encerra um processo.

Deseja exibir uma mensagem quando os usuários a inserir uma nova unidade USB?

Register-wmievent –query "select * from __instancecreationevent within 5 where targetinstance isa 'win32_logicaldisk'" –action { Write "You had better not put any proprietary information on that!" }

Essa consulta pode ser bem difícil dividir, portanto, eis o que está fazendo:

  • SELECT * FROM __instancecreationevent (ou seja, dois caracteres de sublinhado no nomes, a propósito) simplesmente especifica que todas as propriedades de evento devem ser recuperadas.
  • WITHIN 5 indica que apenas desejamos procurar eventos a cada cinco segundos. Não defina este número muito baixo ou você terminaria com bastante poder de computação gasto em Verificando constantemente as atualizações.
  • WHERE ISA INSTANCE 'Win32_LogicalDisk' de destino.informa ao WMI que desejamos somente eventos criou uma nova instância da classe Win32_LogicalDisk.

Finalmente, o parâmetro –action é um bloco de script — entre {chaves} — que contém a ação que queremos que ocorrem quando o evento é gerado.

Usando o parâmetro – ComputerName para se registrar para eventos que ocorrem em um computador remoto é um truque. Você precisa ser um administrador local no computador remoto e a ação que irá acontecer em seu computador, não na remota.

Como um aside, não se sentir tentado a registrar, por exemplo, eventos de criação da classe CIM_DataFile que representa os arquivos no disco. WMI não é muito eficiente no monitoramento da criação de novos arquivos. Ele provavelmente perderá eventos e pode impor uma sobrecarga muito pesada em tentar capturar tudo.

Advertências e truques

É claro que, as respostas para seus eventos só continuará para, desde que o shell está em execução. Quando você fechar o shell ou fecha sozinha por algum motivo, o registro de eventos não existe mais.

Que faz com que eventos WMI um pouco menos útil para a execução em máquinas ’ usuários, porque você é improvável que o shell de e em execução no computador de todos os usuários em todas as vezes. Isso pode ser um truque muito útil, no entanto, para o monitoramento de processos ou outros elementos em servidores em que você tem mais controle

No scriptblock –action, você tem acesso a um args automática variável chamada $, que contém os argumentos que são passados a partir do evento. Use o Write $ args o scriptblock –action para ver quais argumentos existem para um determinado evento WMI.

Ler um pouco mais sobre os eventos WMI e comandos de shell, sobre o monitoramento de eventos de WMI do TechNet página relacionados.

Don Jones

Don Jones é um fundador da Concentrated Technology e perguntas de respostas sobre o Windows PowerShell e outras tecnologias de ConcentratedTech.com. Ele também é autor de Nexus.Realtimepublishers.com, que faz com que muitos de seus livros disponíveis como livres edições eletrônicas por meio de seu site.

Conteúdo relacionado