SWbemSink 物件
SWbemSink物件是由用戶端應用程式實作,以接收非同步作業和事件通知的結果。 若要進行非同步呼叫,您必須建立 SWbemSink 物件的實例,並將它當做 ObjWbemSink 參數傳遞。 當您實作 SWbemSink 中的事件會在傳回狀態或結果時觸發,或呼叫完成時觸發。 VBScript CreateObject 呼叫會建立此物件。
SWbemSink物件具有下列類型的成員:
SWbemSink物件具有這些方法。
方法 | 描述 |
---|---|
取消 | 取消與此接收相關聯的所有非同步作業。 |
非同步回呼可讓未驗證的使用者將資料提供給接收。 這對您的腳本和應用程式造成安全性風險。 若要消除風險,請使用半同步通訊或同步通訊。 如需詳細資訊,請參閱 呼叫方法。
您可以在觸發事件時實作要呼叫的副程式。 例如,如果您想要處理非同步查詢呼叫所傳回的每個物件,例如 SWbemServices.ExecQueryAsync,請使用非同步呼叫中指定的接收建立副程式,如下列範例所示。
Sub SinkName_OnObjectReady(objObject, objAsyncContext)
使用下表作為識別事件和觸發程式描述的參考。
事件 | 描述 |
---|---|
OnCompleted | 非同步作業完成時觸發。 |
OnObjectPut | 非同步 Put 作業完成時觸發。 |
OnObjectReady | 當非同步呼叫所提供的物件可供使用時觸發。 |
OnProgress | 觸發以提供非同步作業的狀態。 |
以非同步方式擷取事件記錄檔統計資料
WMI 同時支援非同步和半同步腳本。 從事件記錄檔擷取事件時,非同步腳本通常會更快擷取此資料。
在非同步腳本中,會發出查詢,並立即將控制權傳回至腳本。 當腳本開始立即處理傳回的資訊時,查詢會繼續在不同的執行緒上處理。 非同步腳本是事件驅動:每次擷取事件記錄時,就會引發 OnObjectReady 事件。 當查詢完成時,將會引發 OnCompleted 事件,而且腳本可以根據傳回所有可用記錄的事實繼續執行。
相反地,在半同步腳本中,會發出查詢,然後腳本會先排入大量擷取的資訊,再對其採取行動。 對於許多物件,半同步處理就足夠了;例如,查詢磁片磁碟機的屬性時,在發出查詢的時間和傳回信息的時間之間,可能只有分割秒。 這主要是因為傳回的資訊量相對小。
不過,查詢事件記錄檔時,發出查詢的時間與半同步腳本可以完成傳回並處理資訊可能需要數小時的時間之間的間隔。 除此之外,腳本可能會用盡記憶體,並在完成之前自行失敗。
對於具有大量記錄的事件記錄檔,處理時間的差異可能相當大。 在事件記錄檔中有 2,000 筆記錄的 Windows 2000 型測試電腦上,擷取所有事件的半同步查詢,並在命令視窗中顯示它們需要 10 分鐘 45 秒。 執行相同作業的非同步查詢需要 54 秒的時間。
下列 VBScript 會以非同步方式查詢所有記錄的事件記錄檔。
Const POPUP_DURATION = 10
Const OK_BUTTON = 0
Set objWSHShell = Wscript.CreateObject("Wscript.Shell")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.InstancesOfAsync objSink, "Win32_NTLogEvent"
errReturn = objWshShell.Popup("Retrieving events", POPUP_DURATION, _
"Event Retrieval", OK_BUTTON)
Sub SINK_OnCompleted(iHResult, objErrorObject, objAsyncContext)
WScript.Echo "Asynchronous operation is done."
End Sub
Sub SINK_OnObjectReady(objEvent, objAsyncContext)
Wscript.Echo "Category: " & objEvent.Category
Wscript.Echo "Computer Name: " & objEvent.ComputerName
Wscript.Echo "Event Code: " & objEvent.EventCode
Wscript.Echo "Message: " & objEvent.Message
Wscript.Echo "Record Number: " & objEvent.RecordNumber
Wscript.Echo "Source Name: " & objEvent.SourceName
Wscript.Echo "Time Written: " & objEvent.TimeWritten
Wscript.Echo "Event Type: " & objEvent.Type
Wscript.Echo "User: " & objEvent.User
End Sub
需求 | 值 |
---|---|
最低支援的用戶端 |
Windows Vista |
最低支援的伺服器 |
Windows Server 2008 |
標頭 |
|
Idl |
|
DLL |
|
CLSID |
CLSID_SWbemSink CLSID_SWbemSinkEvents |
IID |
IID_ISWbemSink IID_ISWbemSinkEvents |