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 錯誤碼為 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

註冊系統登錄事件

決定要接收的事件種類

呼叫方法

在非同步呼叫上設定安全性