Compartir a través de


Windows PowerShell: Responder a eventos WMI

Seguimiento, notificar y responder a eventos de nivel de sistema son algo que bueno a Windows, pero también puede hacerlo con Windows PowerShell.

Don Jones

Una de las cosas ordenadas sobre el sistema operativo Windows es su compatibilidad con eventos. Cada vez que se produce algo en el sistema operativo, se genera un evento. Fragmentos de código, como, por ejemplo, las aplicaciones, pueden registrarse para recibir una notificación de sucesos específicos, de modo que puedan responder con alguna acción. Por ejemplo, al hacer clic en un botón en un cuadro de diálogo, la aplicación recibe una notificación de un evento “ clic ” y sabe que tiene que para hacer todo lo se supone que para hacer cuando un usuario hace clic en ese botón.

Windows Management Instrumentation (WMI) también pueden generar eventos, y se puede registrar la versión 2 de Windows PowerShell para recibir los eventos. A continuación, puede utilizar el shell para ejecutar los comandos que se prefiere en respuesta a esos eventos. WMI normalmente, producirá una de un número relativamente pequeño de eventos, pero puede hacerlo para una amplia gama de diferentes clases WMI.

Existen tres puntos clave para el uso de eventos WMI:

  • saber qué evento desea
  • conocer la clase para el que desea que el evento.
  • mediante el cmdlet de WMIEvent del registro para registrar las notificaciones de eventos

Eventos simples

Algunas clases WMI para generar eventos. Por ejemplo, la clase Win32_ProcessStartTrace genera eventos siempre que se inicia un proceso. También lo hará en otras situaciones. Cuando se provoca el evento para un nuevo proceso, tiene un identificador de origen de “ Process Started. ” Para registrar eventos, ejecutaría este comando:

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

Por supuesto, basta con saber que un proceso iniciado no es útil. Probablemente deseará definir alguna acción para iniciar el proceso, envíe un correo electrónico o incluso eliminar el proceso.

Ejecutar Get-EventSubscriber para ver la suscripción de notificación de eventos que acaba de crear. Para quitar todos los registros de eventos, ejecute Get-EventSubscriber | eliminar del registro de sucesos. Puede utilizar también cancelar el registro de sucesos para eliminar una suscripción específica por número de identificación.

Eventos mejor

Algunos de los eventos de nivel del sistema que WMI puede producir son incluso más útiles. Por ejemplo, se desencadena un evento denominado __instancecreationevent, siempre que se crea una nueva instancia de una clase WMI;__InstanceDeletionEvent se desencadena cada vez que se elimina una instancia. Esto puede no parecer útil, pero piense acerca de él, casi todos los elementos del hardware del sistema operativo y el equipo se representa mediante alguna instancia de una clase WMI. Por ejemplo, Win32_LogicalDisk obtendrá una nueva instancia cuando se conecta un dispositivo de almacenamiento extraíbles. Win32_Process perderá una instancia cuando se cierra un proceso.

¿Desea mostrar un mensaje cuando los usuarios insertar una nueva unidad 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!" }

Dicha consulta puede ser muy difícil dividir, por lo que aquí es lo que está haciendo:

  • SELECT * FROM __instancecreationevent (es decir, dos caracteres de subrayado en el evento nombres, por cierto) simplemente especifica que se deben recuperar todas las propiedades de dicho evento.
  • En el plazo de 5 indica que sólo desea comprobar si hay eventos de cada cinco segundos. No establezca este número demasiado bajo o terminará con una gran cantidad de capacidad informática a comprueba constantemente si hay actualizaciones.
  • WHERE TARGET INSTANCE ISA "Win32_LogicalDisk"indica a WMI que queremos sólo sucesos que se creación una nueva instancia de la clase Win32_LogicalDisk.

Por último, el parámetro –action es un bloque de secuencia de comandos: agregar entre corchetes {}, que contiene la acción que desea que ocurra cuando se provoca el evento.

Utilizar el parámetro – computername para registrar eventos que se producen en un equipo remoto es un ingenioso truco. Debe ser un administrador local en el equipo remoto, y se producirá la acción en el equipo, no en el remoto.

Como, no se tenga la tentación de registrar, por ejemplo, los eventos de creación de la clase CIM_DataFile representa los archivos del disco. WMI no es muy eficiente en la supervisión de la creación de un archivo nuevo. Es probable que perderá eventos y puede suponer alguna sobrecarga muy pesado tratar de detectar todos los elementos.

Advertencias y trucos

Por supuesto, las respuestas a sus eventos sólo continuará para siempre y cuando se ejecuta el shell. Cuando se cierre el shell o cierra por sí mismo por algún motivo, el registro de sucesos ha desaparecido.

Que hace que los eventos WMI algo menos útil para que se ejecutan en equipos a los usuarios ’, ya que es poco probable que el shell de y se ejecuta en el equipo de todos los usuarios en todo momento. Esto puede ser un truco muy útil, sin embargo, para supervisar los procesos o de otros elementos en los servidores en el que tiene más control

En el bloque de script –action, tendrá acceso a un args $ llamado de variable automática, que contiene cualquier argumento que se pasa desde el evento. Utilizar escritura $ args en el bloque de script –action para ver qué argumentos hay un evento de WMI dada.

Leer un poco más acerca de los eventos WMI y relacionados con el comandos de shell, en la página de la supervisión de sucesos de WMI de TechNet .

Don Jones

Don Jones es un fundador de la tecnología concentrado y preguntas de respuestas sobre Windows PowerShell y otras tecnologías en ConcentratedTech.com. También es un autor de Nexus.Realtimepublishers.com, lo que muchos de sus libros disponibles, como las ediciones electrónicas gratuitas a través de su sitio web.

Contenido relacionado