SWbemServices.ExecNotificationQueryAsync 方法
SWbemServices 对象的 ExecNotificationQueryAsync 方法执行查询以接收事件。 此调用会立即返回,结果和状态通过传递到 objWbemSink 中指定的接收器的事件来返回到调用方。
查询中指定的事件可以是内部 Windows Management Instrumentation (WMI) 事件(例如 __InstanceCreationEvent)或外部事件(例如 Win32_IP4RouteTableEvent 或 RegistryKeyChangeEvent)。 有关详细信息,请参阅确定要接收的事件类型。
此方法在异步模式下调用。 有关详细信息,请参阅调用方法。
有关此语法的说明,请参阅脚本 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 |
标头 |
|
类型库 |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |