SWbemServices.ExecNotificationQuery 方法

SWbemServices 对象的 ExecNotificationQuery 方法执行查询以接收事件。 调用会立即返回。 用户可在事件到达时轮询为这些事件返回的枚举器。

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

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

语法

objwbemEventsource = .ExecNotificationQuery( _
  ByVal strQuery, _
  [ ByVal strQueryLanguage ], _
  [ ByVal iFlags ], _
  [ ByVal objWbemNamedValueSet ] _
)

parameters

strQuery

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

strQueryLanguage [可选]

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

iFlags [optional]

这是用于确定查询行为的整数。 默认值为 wbemFlagReturnImmediately + wbemFlagForwardOnly。 如果指定此参数,则必须将此参数同时设置为 wbemFlagReturnImmediately 和 wbemFlagForwardOnly,否则调用将失败。 此参数可接受以下值。

wbemFlagForwardOnly (32 (0x20))

导致返回只进枚举器。 通常,相较于传统枚举器,只进枚举器快得多并且使用的内存更少,但它们不允许调用 SWbemObject.Clone_

wbemFlagReturnImmediately (16 (0x10))

使调用立即返回。

objWbemNamedValueSet [optional]

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

返回值

如果未发生错误,此方法将返回 SWbemEventSource 对象。 可调用 SWbemEventSource.NextEvent 方法,以便在事件到达时检索事件。

错误代码

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

wbemErrAccessDenied - 2147749891 (0x80041003)

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

wbemErrFailed - 2147749889 (0x80041001)

错误。

wbemErrInvalidParameter - 2147749896 (0x80041008)

指定的参数无效。

wbemErrInvalidQuery - 2147749911 (0x80041017)

查询语法无效。

wbemErrInvalidQueryType - 2147749912 (0x80041018)

不支持所请求的查询语言。

wbemErrOutOfMemory - 2147749894 (0x80041006)

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

备注

SWbemServices.ExecQueryAsync 方法不同,ExecNotificationQuery 返回由未来事件生成的事件类型对象,而不是返回现有对象。 ExecNotificationQuery 请求的事件对象可以是内部对象(例如 __InstanceCreationEvent)或外部事件(例如 RegistryKeyChangeEvent 之类的注册表提供程序事件或 SNMP 事件。 有关详细信息,请参阅确定要接收的事件类型接收事件通知

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

示例

以下 VBScript 代码示例监视对本地计算机上的卷的更改。 请注意,Win32_VolumeChangeEvent 是提供程序定义的外部事件,而不是 WMI 定义的内部事件。 有关详细信息,请参阅确定要接收的事件类型

Set colMonitoredEvents = _
   GetObject("Winmgmts:").ExecNotificationQuery_
      ("Select * from Win32_VolumeChangeEvent")

Do While i = 0
   Set strLatestEvent = colMonitoredEvents.NextEvent
   Wscript.Echo strLatestEvent.DriveName & "Time Created = " _
      & strLatestEvent.Time_Created

    Select Case strLatestEvent.EventType 
       Case 1        
            WScript.Echo "EventType = Configuration Changed"
       Case 2
            WScript.Echo "EventType = Device Arrival"
       Case 3
            WScript.Echo "EventType = Device Removal"
       Case 4
            WScript.Echo "EventType = Docking"

       Case Else
            WScript.Echo "Unrecognized EventType"
       End Select
Loop

以下 VBScript 代码示例监视进程删除。 如果在任务管理器中删除进程,或者关闭应用程序,脚本将显示一条消息。 请注意,此脚本查询 WMI 定义的内部事件 - __InstanceDeletionEvent

Set objWMIService = GetObject( _
    "Winmgmts:{impersonationLevel=impersonate}" )
Set colMonitoredProcesses = _
    objWMIService.ExecNotificationQuery( _
    "SELECT * FROM __InstanceDeletionEvent WITHIN 10 WHERE " _
    & "TargetInstance ISA 'Win32_Process'")
i = 0
Do While i < 11
    Set strLatestProcess = colMonitoredProcesses.NextEvent
    WScript.Echo strLatestProcess.TargetInstance.Name
    WScript.Sleep 10000
    i= i + 1
Loop

要求

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

另请参阅

SWbemServices

SWbemEventSource.NextEvent

SWbemServices.ExecQuery

接收 WMI 事件

使用 WQL 进行查询

WQL (SQL for WMI)

确定要接收的事件类型