SWbemServices.ExecNotificationQuery 方法
SWbemServices物件的ExecNotificationQuery方法會執行查詢來接收事件。 呼叫會立即傳回。 使用者可以在抵達時輪詢傳回的列舉值以取得事件。
方法會在半非同步模式中呼叫。 如需詳細資訊,請參閱 呼叫方法。
如需此語法的說明,請參閱 腳本 API 的檔慣例。
語法
objwbemEventsource = .ExecNotificationQuery( _
ByVal strQuery, _
[ ByVal strQueryLanguage ], _
[ ByVal iFlags ], _
[ ByVal objWbemNamedValueSet ] _
)
參數
-
strQuery
-
必要。 包含事件相關查詢文字的字串。 此參數不可為空白。 如需建置 WMI 查詢字串的詳細資訊,請參閱 使用 WQL 查詢和 WQL 參考。
-
strQueryLanguage [選擇性]
-
包含要使用的查詢語言的字串。 如果指定,此值必須是 「WQL」。
-
iFlags [選擇性]
-
這是決定查詢行為的整數。 預設值為wbemFlagReturnImmediately + wbemFlagForwardOnly。 如果您指定此參數,這個參數必須同時設定為 wbemFlagReturnImmediately 和 wbemFlagForwardOnly ,否則呼叫會失敗。 此參數可以接受下列值。
-
wbemFlagForwardOnly (32 (0x20) )
-
導致傳回順向列舉值。 順向列舉值通常較傳統列舉值更快,而且使用記憶體比傳統列舉值少,但不允許呼叫 SWbemObject.Clone_。
-
wbemFlagReturnImmediately (16 (0x10) )
-
導致呼叫立即傳回。
objWbemNamedValueSet [選擇性]
一般而言,這是未定義的。 否則,這是 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 |
標頭 |
|
類型程式庫 |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |