SWbemServices.ExecNotificationQueryAsync 方法

SWbemServices 对象的 ExecNotificationQueryAsync 方法执行查询以接收事件。 此调用会立即返回,结果和状态通过传递到 objWbemSink 中指定的接收器的事件来返回到调用方。

查询中指定的事件可以是内部 Windows Management Instrumentation (WMI) 事件(例如 __InstanceCreationEvent)或外部事件(例如 Win32_IP4RouteTableEventRegistryKeyChangeEvent)。 有关详细信息,请参阅确定要接收的事件类型

此方法在异步模式下调用。 有关详细信息,请参阅调用方法

有关此语法的说明,请参阅脚本 API 的文档约定

语法

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

parameters

ObjWbemSink

必需。 异步接收事件通知的对象接收器。 创建 SWbemSink 对象来接收对象。

strQuery

必需。 包含与事件相关的查询的文本的字符串。 此参数不能为空。 若要详细了解如何生成 WMI 查询字符串,请查看使用 WQL 进行查询WQL 参考。

strQueryLanguage [可选]

包含要使用的查询语言的字符串。 如果已制定,此值必须为“WQL”。

iFlags [optional]

确定查询行为的整数。 此参数可设置为下列值之一。

wbemFlagSendStatus (128 (0x80))

使异步调用将状态更新发送到对象接收器的 OnProgress 事件处理程序。

wbemFlagDontSendStatus (0 (0x0))

防止异步调用将状态更新发送到对象接收器的 OnProgress 事件处理程序。

objwbemNamedValueSet [optional]

通常,未定义此参数。 否则,该参数是一个 SWbemNamedValueSet 对象,其元素表示可供处理请求的提供程序使用的上下文信息。 支持或需要此类信息的提供程序必须记录已识别的值名称、值数据类型、允许的值和语义。

objWbemAsyncContext [optional]

这是一个 SWbemNamedValueSet 对象,它返回到对象接收器以标识原始异步调用的源。 若要使用同一对象接收器进行多个异步调用,请使用此参数。 若要使用此参数,请创建 SWbemNamedValueSet 对象,并使用 SWbemNamedValueSet.Add 方法添加一个值,该值标识即将进行的异步调用。 SWbemNamedValueSet 对象返回到对象接收器,并且可以使用 SWbemNamedValueSet.Item 方法提取调用的源。 有关详细信息,请参阅调用方法

返回值

此方法不返回值。 如果成功,接收器将收到每个实例的 OnObjectReady 事件。 在最后一个实例之后,对象接收器会收到 OnCompleted 事件。

错误代码

完成 ExecNotificationQueryAsync 方法后,Err 对象可能包含以下列表中标识的错误代码之一。

wbemErrAccessDenied - 2147749891 (0x80041003)

当前用户无权查看结果集。

wbemErrFailed - 2147749889 (0x80041001)

错误。

wbemErrInvalidParameter - 2147749896 (0x80041008)

指定的参数无效。

wbemErrInvalidQuery - 2147749911 (0x80041017)

查询语法无效。

wbemErrInvalidQueryType - 2147749912 (0x80041018)

不支持请求的查询语言。

wbemErrOutOfMemory - 2147749894 (0x80041006)

内存不足,无法完成此操作。

备注

ExecNotificationQueryAsync 方法返回未来事件生成的事件类型对象。 ExecNotificationQueryAsync 请求的事件对象可以是内部对象(例如 __InstanceCreationEvent)或外部对象(例如 RegistryKeyChangeEvent 或 SNMP 事件)。 有关详细信息,请参阅确定要接收的事件类型

对 ExecNotificationQueryAsync 的调用会立即返回。 请求的对象和状态通过回调返回给调用方,该回调传递到 objWbemSink 中指定的接收器。 要在每个对象返回时对其进行处理,请创建 objWbemSink.OnObjectReady 事件子例程。 返回所有对象后,请执行最终处理以实现 objWbemSink.OnCompleted 事件。

异步回调会使未经身份验证的用户能够向接收器提供数据。 这会给脚本和应用程序带来安全风险。 要消除这些风险,请参阅设置异步调用的安全性

可在 WQL 查询中使用的 AND 和 OR 关键字存在数量限制。 复杂查询中使用大量的 WQL 关键字可能导致 WMI 返回 WBEM_E_QUOTA_VIOLATION 错误代码 asan HRESULT 值。 WQL 关键字的限制取决于查询的复杂程度。

示例

以下 VBScript 代码示例演示了一个脚本,该脚本正在等待指示进程已终止的 WMI 事件通知。 它正在等待 WMI 内部事件(即,事件类 __InstanceDeletionEvent 的实例)。 nstanceDeletionEvent 必须表示删除 Win32_Process的实例。 有关 WMI 内部事件的详细信息,请参阅确定要接收的事件的类型

以下脚本将无限期运行,直到计算机重启、WMI 停止或脚本停止。 若要手动停止脚本,请使用任务管理器来停止进程。 若要以编程方式停止它,请在 Win32_Process 类中使用 Terminate 方法。

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

要求

要求
最低受支持的客户端
Windows Vista
最低受支持的服务器
Windows Server 2008
标头
Wbemdisp.h
类型库
Wbemdisp.tlb
DLL
Wbemdisp.dll
CLSID
CLSID_SWbemServices
IID
IID_ISWbemServices

另请参阅

SWbemServices

SWbemServices.ExecQuery

SWbemServices.ExecQueryAsync

注册系统注册表事件

确定要接收的事件类型

调用方法

设置异步调用的安全性