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 ] _
)

参数

objWbemSink

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

strQuery

必需。 包含与事件相关的查询的文本的字符串。 此参数不能为空。 有关生成 WMI 查询字符串的详细信息,请参阅使用 WQL 和 WQL 参考进行查询

strQueryLanguage [可选]

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

iFlags [可选]

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

wbemFlagSendStatus (128 (0x80) )

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

wbemFlagDontSendStatus (0 (0x0) )

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

objwbemNamedValueSet [可选]

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

objWbemAsyncContext [可选]

这是一个 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 中指定的接收器的回调返回到调用方。 若要在返回对象时处理每个对象,请创建 objWbemSinkOnObjectReady 事件子例程。 返回所有对象后,执行最终处理来实现 objWbemSinkOnCompleted 事件。

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

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

示例

以下 VBScript 代码示例显示了一个脚本,该脚本正在等待 WMI 事件通知,该通知指示进程已终止。 它正在等待 WMI 内部事件,即事件类 的实例__InstanceDeletionEvent__InstanceDeletionEvent必须表示删除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

注册系统注册表事件

确定要接收的事件类型

调用方法

在异步调用上设置安全性