Compartir a través de


Recibir notificaciones de eventos sincrónicas y semisincrónicas

Usar SWbemServices.ExecQuery para solicitar todos los eventos existentes.

En el ejemplo de código siguiente se muestra cómo consultar los eventos de un registro.

Select * from Win32_NTLogEvent

Para obtener más información, consulte Determinar el tipo de evento que se va a recibir, Recibir notificaciones de eventos y WQL (SQL para WMI).

La llamada predeterminada a SWbemServices.ExecNotificationQuery usa comunicación semisincrónica. El parámetro iflags tiene las marcas wbemFlagForwardOnly y wbemFlagReturnImmediately establecidas de forma predeterminada. Para obtener más información, consulte Llamar a un método.

En el procedimiento siguiente se describe cómo recibir notificaciones de eventos semisincrónicos mediante VBScript.

Para recibir notificaciones de eventos semisincrónicos en VBScript

  1. Cree una consulta para el tipo de evento que desea recibir. Para obtener más información, consulte Determinar el tipo de evento que se va a recibir.

  2. Si solicita un tipo de instancia de evento como __InstanceCreationEvent, indique en la consulta un tipo de instancia de destino, por ejemplo, Win32_LogicalDisk.

  3. Si es necesario, especifique una instancia, por ejemplo, el nombre de un espacio de nombres al solicitar futuras instancias de __NamespaceModificationEvent para un espacio de nombres específico.

  4. Especifique un intervalo de sondeo para Instrumental de administración de Windows (WMI) en una consulta, como "WITHIN 10", para sondear cada 10 segundos. Para obtener más información, consulte Cláusula WITHIN.

  5. Llame a SWbemServices.ExecNotificationQuery mediante la consulta.

  6. Recorra en bucle la colección que reciba.

En el ejemplo siguiente se muestra cómo supervisar la inserción y eliminación de discos de una unidad de disco disquete en un equipo local. El script solicita instancias ___InstanceModificationEvent para la unidad de instancia de disquete Win32_LogicalDisk y sondea cada 10 segundos para las nuevas instancias. Este script es un ejemplo de un consumidor de eventos temporal y continúa ejecutándose hasta que se detenga en el Administrador de tareas o se reinicie el sistema. Para obtener más información, consulte Recibir eventos para la duración de la aplicación.

Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
    ("Select * from __InstanceModificationEvent within 10 WHERE " _
        & "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
    Set strDiskChange = colMonitoredDisks.NextEvent
    If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
        If strDiskChange.TargetInstance.Size > 0 Then
            Wscript.Echo "A disk has been inserted" & _
                " into the floppy drive."
    Else
            Wscript.Echo "A disk has been removed" & _
                " from the floppy drive."
        End If
    End If
Loop

En el procedimiento siguiente se describe cómo recibir notificaciones de eventos semisincrónicos mediante C++.

Para recibir notificaciones de eventos semisincrónicos en C++

  1. Configure la aplicación con llamadas a las funciones CoInitializeEx y CoInitializeSecurity.

    Dado que WMI está basado en COM, llamar a CoInitializeEx y CoInitializeSecurity es necesario para una aplicación WMI. Para obtener más información, consulte Crear una aplicación WMI o un script.

  2. Determine el tipo de eventos que desea recibir.

    WMI admite eventos intrínsecos y extrínsecos. Un evento intrínseco es un evento predefinido por WMI. Un evento extrínseco es un evento definido por un proveedor de terceros. Para obtener más información, consulte Determinar el tipo de evento que se va a recibir.

  3. Regístrese para recibir una clase específica de eventos con una llamada al método IWbemServices::ExecNotificationQuery.

    Haga que cada consulta de la manera más específica posible. El objetivo del registro es registrarse para recibir solo las notificaciones necesarias. Notificaciones que no son necesarias para el procesamiento de residuos y el tiempo de entrega.

    Puede diseñar un consumidor de eventos para recibir varios eventos. Por ejemplo, un consumidor podría requerir la notificación de eventos de modificación de instancias para una clase específica de eventos de infracción de seguridad y dispositivo. En este caso, las tareas que realiza un consumidor al recibir un evento de modificación de instancia son diferentes para los dos eventos. Por lo tanto, el consumidor debe realizar una llamada a IWbemServices::ExecNotificationQuery para registrarse para eventos de modificación de instancias y otra llamada a ExecNotificationQuery para registrarse para eventos de infracción de seguridad.

    En la llamada a ExecNotificationQuery, establezca el parámetro lFlags en WBEM_FLAG_RETURN_IMMEDIATELY y WBEM_FLAG_FORWARD_ONLY. La marca WBEM_FLAG_RETURN_IMMEDIATELY solicita procesamiento semisincrónico y la marca WBEM_FLAG_FORWARD_ONLY solicita un enumerador de solo avance. Para obtener más información, consulte Llamar a un método. La función ExecNotificationQuery devuelve un puntero a una interfaz IEnumWbemClassObject.

  4. Sondee las notificaciones de eventos registradas realizando llamadas repetidas al método IEnumWbemClassObject::Next.

  5. Cuando termine, libere el enumerador que apunta al objeto IEnumWbemClassObject.

    Puede liberar el puntero IWbemServices asociado al registro. Liberar el puntero IWbemServices hace que WMI deje de entregar eventos a todos los consumidores temporales asociados.