Supervisión de eventos

Los administradores del sistema pueden usar WMI para supervisar eventos en una red. Por ejemplo:

  • Un servicio se detiene inesperadamente.
  • Un servidor deja de estar disponible.
  • Una unidad de disco se llena hasta un 80 % de capacidad.
  • Los eventos de seguridad se notifican a un registro de eventos NT.

WMI admite la detección y entrega de eventos a los consumidores de eventos porque algunos proveedores de WMI son proveedores de eventos. Para más información, consulte Recepción de un evento WMI.

Los consumidores de eventos son aplicaciones o scripts que solicitan notificaciones de eventos y, a continuación, realizan tareas cuando se producen eventos específicos. Puede crear scripts o aplicaciones de supervisión de eventos que supervisen temporalmente cuando se producen eventos. WMI también proporciona un conjunto de proveedores de eventos permanentes preinstalados y las clases de consumidor permanentes que permiten supervisar eventos de forma permanente. Para más información, vea Supervisión y respuesta a eventos con consumidores estándar.

En este tema se describen las secciones siguientes:

Uso de consumidores de eventos temporales

Los consumidores de eventos temporales son scripts o aplicaciones que devuelven los eventos que coinciden con una consulta o filtro de eventos. Las consultas de eventos temporales suelen usar IWbemServices::ExecNotificationQuery en aplicaciones de C++ o SWbemServices.ExecNotificationQuery en scripts y Visual Basic.

Una consulta de eventos solicita instancias de una clase de eventos que especifica un determinado tipo de evento, como Win32_ProcessTrace o RegistryKeyChangeEvent.

El siguiente ejemplo de código VBScript solicita una notificación cuando se crea una instancia de Win32_ProcessTrace. Una instancia de esta clase se genera cuando se inicia o detiene un proceso.

Para ejecutar el script, cópielo en un archivo denominado event.vbs y use la siguiente línea de comandos: cscript event.vbs. Puede ver la salida del script iniciando Notepad.exe o cualquier otro proceso. El script se detiene después de que se hayan iniciado o detenido cinco procesos.

Este script llama a SWbemServices.ExecNotificationQuery, que es la versión semisynchronous del método. Consulte el siguiente script para obtener un ejemplo de configuración de una suscripción de eventos temporales asincrónica mediante una llamada a SWbemServices.ExecNotificationQueryAsync. Para más información, vea Llamada a un método. El script llama a SWbemEventSource.NextEvent para obtener y procesar cada evento a medida que llega. Guarde el script en un archivo con una extensión.vbs y ejecute el script en una línea de comandos mediante CScript: cscript file.vbs.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

Los consumidores de eventos temporales deben iniciarse manualmente y no deben conservarse en los reinicios de WMI ni en los reinicios del sistema operativo. Un consumidor de eventos temporales solo puede procesar eventos mientras se ejecuta.

El siguiente procedimiento describe cómo crear un consumidor de eventos temporal.

Para crear un consumidor de eventos temporal

  1. Decida qué lenguaje de programación se va a usar.

    El lenguaje de programación determina la API que se va a usar.

  2. Comience a codificar una aplicación de consumidor de eventos temporal de la misma manera que inicia una aplicación WMI.

    Los primeros pasos de codificación dependen del lenguaje de programación. Normalmente, inicia sesión en WMI y configura la configuración de seguridad. Para más información, consulte Crear una aplicación WMI o un script.

  3. Defina la consulta de eventos que desea usar.

    Para obtener algunos tipos de datos de rendimiento, es posible que tenga que usar clases proporcionadas por proveedores de alto rendimiento. Para más información, vea Supervisión de datos de rendimiento, Determinación del tipo de evento que se va a recibir y Consulta con WQL.

  4. Decida si realizar una llamada asincrónica o una llamada semisincrónica y elija el método de API.

    Las llamadas asincrónicas permiten evitar la sobrecarga de sondeo de datos. Sin embargo, las llamadas semisincrónicas proporcionan un rendimiento similar con mayor seguridad. Para más información, vea Llamada a un método.

  5. Realice la llamada al método asincrónico o semisincrónico e incluya una consulta de eventos como parámetro strQuery.

    Para las aplicaciones de C++, llame a los métodos siguientes:

    En el caso de los scripts, llame a los métodos siguientes:

  6. Escriba el código para procesar el objeto de evento devuelto.

    En el caso de las consultas de eventos asincrónicas, coloque el código en los distintos métodos o eventos del receptor del objeto. Para las consultas de eventos semisincrónicos, cada objeto se devuelve a medida que WMI lo obtiene, por lo que el código debe estar en el bucle que controla cada objeto.

El siguiente ejemplo de código de script es una versión asincrónica del script Win32_ProcessTrace. Dado que las operaciones asincrónicas se devuelven inmediatamente, un cuadro de diálogo mantiene activo el script mientras espera eventos.

En lugar de llamar a SWbemEventSource.NextEvent para recibir cada evento, el script tiene un controlador de eventos para el evento SWbemSink OnObjectReady.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

Nota

Una devolución de llamada asincrónica, como una devolución de llamada controlada por la subrutina SINK_OnObjectReady, permite a un usuario no autenticado proporcionar datos al receptor. Para mejorar la seguridad, use la comunicación semisincrónica o la comunicación sincrónica. Para obtener más información, vea los temas siguientes:

 

Uso de consumidores de eventos permanentes

Un consumidor de eventos permanente se ejecuta hasta que se cancela explícitamente su registro y, a continuación, se inicia cuando se reinicia WMI o el sistema.

Un consumidor de eventos permanente es una combinación de clases, filtros y objetos COM de WMI en un sistema.

En la lista siguiente se identifican los elementos necesarios para crear un consumidor de eventos permanente:

  • Objeto COM que contiene el código que implementa el consumidor permanente.
  • Una nueva clase de consumidor permanente.
  • Instancia de la clase de consumidor permanente.
  • Un filtro que contiene la consulta de eventos.
  • Vínculo entre el consumidor y el filtro.

Para más información, consulte Recepción de eventos en todo momento.

WMI proporciona varios consumidores permanentes. Las clases de consumidor y el objeto COM que contiene el código están preinstalados. Por ejemplo, puede crear y configurar una instancia de la clase ActiveScriptEventConsumer para ejecutar un script cuando se produce un evento. Para más información, vea Supervisión y respuesta a eventos con consumidores estándar. Para obtener un ejemplo del uso de ActiveScriptEventConsumer, consulte Ejecución de un script basado en un evento.

En el procedimiento siguiente se describe cómo crear un consumidor de eventos permanente.

Para crear un consumidor de eventos permanente

  1. Registre el proveedor de eventos con el espacio de nombres que está usando.

    Algunos proveedores de eventos solo pueden usar un espacio de nombres específico. Por ejemplo, __InstanceCreationEvent es un evento intrínseco compatible con el proveedor de Win32 y se registra de forma predeterminada con el espacio de nombres \root\cimv2.

    Nota

    Puede usar la propiedad EventNamespace del __EventFilter usado en el registro para crear una suscripción entre espacios de nombres. Para más información, consulte Implementación de suscripciones de eventos permanentes entre espacios de nombres.

     

  2. Registre el proveedor de consumidores de eventos con el espacio de nombres donde se encuentran las clases de eventos.

    WMI usa un proveedor de consumidores de eventos para buscar un consumidor de eventos que sea permanente. El consumidor de eventos permanentes es la aplicación que WMI inicia cuando se recibe un evento. Para registrar el consumidor de eventos, los proveedores crean instancias de __EventConsumerProviderRegistration.

  3. Cree una instancia de la clase que representa el consumidor de eventos permanente que desea usar.

    Las clases de consumidor de eventos se derivan de la clase __EventConsumer. Establezca las propiedades que requiere la instancia del consumidor de eventos.

  4. Registre el consumidor con COM mediante la utilidad regsvr32.

  5. Cree una instancia de la clase de filtro de eventos __EventFilter.

    Establezca los campos obligatorios para la instancia de filtro de eventos. Los campos necesarios para __EventFilter son Name, QueryLanguage y Query. La propiedad Name puede ser cualquier nombre único para una instancia de esta clase. La propiedad QueryLanguage se establece siempre en "WQL". La propiedad Query es una cadena que contiene una consulta de eventos. Se genera un evento cuando se produce un error en la consulta de un consumidor de eventos permanente. El origen del evento es WinMgmt, el identificador del evento es 10 y el tipo de evento es Error.

  6. Cree una instancia de la clase __FilterToConsumerBinding para asociar un consumidor de eventos lógicos a un filtro de eventos.

    WMI usa una asociación para buscar el consumidor de eventos asociado al evento que coincide con los criterios especificados en el filtro de eventos. WMI usa el proveedor de consumidores de eventos para buscar la aplicación de consumidor de eventos permanente que se va a iniciar.