對 WMI 方法進行異步呼叫 或 提供者方法 可讓腳本繼續執行,而物件會傳回 SWbemSink 物件,並由 SWbemSink.OnObjectReady等方法處理。 不過,不建議使用異步呼叫,因為數據可能不會以與呼叫相同的安全性層級傳回。
使用 SWbemSink.OnObjectReady 等異步接收呼叫來取得傳回的數據時,您可以設定下列登錄值。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault
設定此登錄值可確保傳回至接收端的數據物件的驗證。 如果 UnsecAppAccessControlDefault 設置為 1,則 WMI 會執行資料回傳的存取檢查。 存取檢查會確認數據是否來自正確的來源。 如需詳細資訊,請參閱在異步呼叫上設定安全性 。
名稱為 「Async_」 的異步方法,在呼叫之後一律會立即傳回,讓程式可以繼續執行。 例如,SWbemServices.ExecQuery 是同步的,而且會封鎖執行,直到傳回所有對象為止。 SWbemServices.ExecQueryAsync 方法是非阻塞的異步版本。 若要對 SWbemServices.ExecQuery 進行呼叫, 非封鎖,更安全的方式是在進行呼叫。 如需詳細資訊,請參閱 在異步呼叫 上設定安全性,使用 VBScript 進行半同步呼叫。
異步呼叫的 iFlags 參數一律預設為零 (0)。 異步方法不會將 SWbemObjectSet 集合提供給接收子程式。 相反地,SWbemSink.OnObjectReady 腳本或應用程式中的事件子程式會依提供而接收每個物件。
當原始異步呼叫完成時,它會呼叫物件匯集器中的 SWbemSink.OnCompleted 事件,並執行您放置在該處用以處理呼叫結果的程式代碼。
注意
作為腳本主機的作用中伺服器頁面 (ASP) 不支援異步呼叫。
下列程式描述如何使用 VBScript 進行異步呼叫。
使用 VBScript 進行異步呼叫
聯機到 WMI 並取得 SWbemServices 物件。
Set Service = GetObject("Winmgmts:")使用 CreateObject 或(僅適用於 Windows Script Host 2.0)設定具有事件屬性的 OBJECT 標籤為 TRUE來建立物件接收器。
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")-或-
<OBJECT progid="WbemScripting.SWbemSink" ID="SINK" events="true"/>為每個可能由異步事件觸發的事件建立子程式。 這些事件會定義為 SWbemObject上的方法。 例如,WMI 在每個實例傳回時,會調用 SWbemSink.OnObjectReady。
當您建立子程式時,請將程式代碼放在子程式中,以在收到事件時處理每個事件。
Sub SINK_OnCompleted( iHResult, objErrorObject, objAsyncContext ) WScript.Echo "Asynchronous operation is done." End Sub Sub SINK_OnObjectReady(objObject, objAsyncContext) WScript.Echo (objObject.Name) End Sub檢查 OnCompleted 事件所傳回 iHresult 參數,以判斷異步呼叫是否成功,或是否發生錯誤。 如果成功,iHresult 參數中傳遞的值會等於零 (0)。 任何其他值可能表示錯誤,您應該檢查錯誤對象中傳回 objErrorObject 參數中的值。
進行異步呼叫,並將接收接口的名稱傳遞至 objWbemSink 參數中。
Service.InstancesOfAsync sink, "Win32_process"進行呼叫,防止腳本在收到所有事件之前結束。 如果您的腳本可以使用螢幕介面執行,最簡單的方法是使用 Windows 腳本主機 (WSH)
Echo命令,如下列範例所示。WScript.Echo "Waiting for instances."當您執行此腳本時,您可能會在 等候實例 訊息之前或之後看到第一個實例返回。 這是異步處理的性質。 如果您關閉 等候實例 消息框太快,您可能不會看到所有實例。
如果您有數個不同的異步呼叫傳回相同接收的結果,請將任何必要的辨別數據儲存在 objWbemAsyncContext context 參數。
當完成與接收器的操作後,請使用 Cancel 方法來取消您的非同步呼叫。
objwbemsink.Cancel()Cancel 方法會指示 WSH 取消與指定接收對象相關聯的所有異步呼叫。 因此,您可能想要為必須獨立的異步操作使用不同的接收器。
將匯入物件指派給
Nothing,以釋放匯入物件。set objwbemsink= Nothing
下列程式代碼範例顯示本機計算機上所有 Win32_Process 實例的異步查詢。 如需相同方法的半同步版本,請參閱 呼叫方法。
' Create an object sink
set oSink = WScript.CreateObject("wbemscripting.swbemsink","sink_")
' Connect to WMI and the cimv2 namespace, and obtain
' an SWbemServices object
set oSvc = GetObject("winmgmts:root\cimv2")
bdone = false
' Query for all Win32_Process objects
osvc.ExecQueryAsync oSink, "SELECT Name FROM Win32_Process"
' Wait until all instances are returned.
' The bdone flag prevents the script from exiting until
' the sink.OnCompleted subroutine is executed when
' all the objects are returned.
while not bdone
wscript.sleep 1000
wend
' The sink subroutine to handle the OnObjectReady
' event. This is called as each object returns.
sub sink_OnObjectReady(oInst, octx)
WScript.Echo "Got Instance: " & oInst.Name
end sub
' The sink subroutine to handle the OnCompleted event.
' This is called when all the objects are returned.
' The oErr parameter obtains an SWbemLastError object,
' if available from the provider.
sub sink_OnCompleted(HResult, oErr, oCtx)
WScript.Echo "ExecQueryAsync completed"
bdone = true
end sub
相關主題