Método SWbemServices.ExecNotificationQueryAsync

El método ExecNotificationQueryAsync del objeto SWbemServices ejecuta una consulta para recibir eventos. Esta llamada se devuelve inmediatamente y los resultados y el estado se devuelven al autor de la llamada a través de eventos entregados al receptor especificado en objWbemSink.

Los eventos que se especifican en la consulta pueden ser eventos intrínsecos de Windows Management Instrumentation (WMI), como __InstanceCreationEvent, o eventos extrínsecos, como Win32_IP4RouteTableEvent o RegistryKeyChangeEvent. Para obtener más información, consulte Determinar el tipo de evento que se va a recibir.

Se llama al método en el modo asincrónico. Para más información, vea Llamada a un método.

Para obtener una explicación de esta sintaxis, vea Convenciones de documentación para la API de scripting.

Sintaxis

SWbemServices.ExecNotificationQueryAsync( _
  ByVal objWbemSink, _
  ByVal strQuery, _
  [ ByVal strQueryLanguage ], _
  [ ByVal iFlags ], _
  [ ByVal objwbemNamedValueSet ], _
  [ ByVal objWbemAsyncContext ] _
)

Parámetros

objWbemSink

Necesario. Receptor de objetos que recibe la notificación de eventos de forma asincrónica. Cree un objeto SWbemSink para recibir los objetos.

strQuery

Necesario. Cadena que contiene el texto de la consulta relacionada con eventos. Este parámetro no puede estar en blanco. Para más información sobre la creación de cadenas de consulta WMI, vea Consulta con WQL y la referencia WQL.

strQueryLanguage [opcional]

Cadena que contiene el lenguaje de consulta que se va a usar. Si se especifica, este valor debe ser "WQL".

iFlags [opcional]

Entero que determina el comportamiento de la consulta. Este parámetro puede establecerse en uno de los valores siguientes.

wbemFlagSendStatus (128 (0x80))

Hace que las llamadas asincrónicas envíen actualizaciones de estado al controlador de eventos OnProgress para el receptor de objetos.

wbemFlagDontSendStatus (0 (0x0))

Impide que las llamadas asincrónicas envíen actualizaciones de estado al controlador de eventos OnProgress para el receptor de objetos.

objwbemNamedValueSet [opcional]

Normalmente, esto no está definido. De lo contrario, se trata de un objeto SWbemNamedValueSet cuyos elementos representan la información de contexto que puede usar el proveedor que atiende la solicitud. Un proveedor que admita o necesite esa información debe documentar los nombres de valor reconocidos, el tipo de datos del valor, los valores permitidos y la semántica.

objWbemAsyncContext [opcional]

Se trata de un objeto SWbemNamedValueSet que se devuelve al receptor del objeto para identificar el origen de la llamada asincrónica original. Use este parámetro para realizar varias llamadas asincrónicas con el mismo receptor de objetos. Para usar este parámetro, cree un objeto SWbemNamedValueSet y use el método SWbemNamedValueSet.Add para agregar un valor que identifique la llamada asincrónica que realiza. El objeto SWbemNamedValueSet se devuelve al receptor del objeto y el origen de la llamada se puede extraer mediante el método SWbemNamedValueSet.Item. Para obtener más información, vea Llamada a un método.

Valor devuelto

Este método no devuelve ningún valor. Si se ejecuta correctamente, el receptor recibe un evento OnObjectReady por cada instancia. Después de la última instancia, el receptor del objeto recibe un evento OnCompleted.

Códigos de error

Después de completar el método ExecNotificationQueryAsync, el objeto Err puede contener uno de los códigos de error identificados en la lista siguiente.

wbemErrAccessDenied - 2147749891 (0x80041003)

El usuario actual no está autorizado para ver el conjunto de resultados.

wbemErrFailed - 2147749889 (0x80041001)

Error no especificado.

wbemErrInvalidParameter - 2147749896 (0x80041008)

Se ha especificado un parámetro no válido.

wbemErrInvalidQuery - 2147749911 (0x80041017)

La sintaxis de la consulta no es válida.

wbemErrInvalidQueryType: 2147749912 (0x80041018)

El lenguaje de la consulta solicitada no se admite.

wbemErrOutOfMemory: 2147749894 (0x80041006)

No hay suficiente memoria para completar la operación.

Comentarios

El método ExecNotificationQueryAsync devuelve objetos de tipo de evento que generan eventos futuros. Los objetos de evento que ExecNotificationQueryAsync solicita pueden ser intrínsecos (por ejemplo, __InstanceCreationEvent), o extrínsecos (por ejemplo, RegistryKeyChangeEvent o eventos SNMP). Para obtener más información, consulte Determinar el tipo de evento que se va a recibir.

La llamada a ExecNotificationQueryAsync se devuelve inmediatamente. Los objetos y el estado solicitados se devuelven al autor de la llamada mediante devoluciones de llamada entregadas al receptor especificado en objWbemSink. Para procesar cada objeto cuando se devuelva, cree una subrutina de eventos objWbemSink.OnObjectReady. Una vez devueltos todos los objetos, realice el procesamiento final para implementar el evento objWbemSink.OnCompleted.

Una devolución de llamada asincrónica permite a un usuario no autenticado proporcionar datos al receptor. Esto supone riesgos de seguridad para los scripts y las aplicaciones. Para eliminar los riesgos, consulte Establecimiento de la seguridad en una llamada asincrónica.

Existen límites en el número de palabras clave AND y OR que pueden utilizarse en las consultas WQL. Un gran número de palabras clave WQL utilizadas en una consulta compleja puede hacer que WMI devuelva el código de error WBEM_E_QUOTA_VIOLATION como valor HRESULT. El límite de palabras clave WQL que pueda usarse dependerá de la complejidad de la consulta.

Ejemplos

En el siguiente ejemplo de código de VBScript se muestra un script que está esperando una notificación de eventos WMI que indica que un proceso ha finalizado. Está esperando un evento intrínseco de WMI, una instancia de la clase de eventos __InstanceDeletionEvent. El __InstanceDeletionEvent debe representar la eliminación de una instancia de Win32_Process. Para obtener más información sobre los eventos intrínsecos de WMI, vea Determinar el tipo de evento que se va a recibir.

El siguiente script se ejecuta indefinidamente hasta que se reinicia el equipo, se detiene WMI o se detiene el script. Para detener el script manualmente, use el Administrador de tareas para detener el proceso. Para detenerlo mediante programación, use el método Terminate en la clase Win32_Process.

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

objWMIservice.ExecNotificationQueryAsync MySink, "SELECT * FROM __InstanceCreationEvent WITHIN 1 " _
                                               & "WHERE TargetInstance ISA 'Win32_Process'"

WScript.Echo "Waiting for events..."

While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    WScript.Echo "Event occurred."
End Sub

Sub SINK_OnCompleted(objObject, objAsyncContext)
    WScript.Echo "Event call complete."
End Sub

Requisitos

Requisito Value
Cliente mínimo compatible
Windows Vista
Servidor mínimo compatible
Windows Server 2008
Encabezado
Wbemdisp.h
Biblioteca de tipos
Wbemdisp.tlb
Archivo DLL
Wbemdisp.dll
CLSID
CLSID_SWbemServices
IID
IID_ISWbemServices

Consulte también

SWbemServices

SWbemServices.ExecQuery

SWbemServices.ExecQueryAsync

Registro para eventos del Registro del sistema

Determinación del tipo de evento que se va a recibir

Llamar a un método

Establecer la seguridad en una llamada asincrónica