Göra ett asynkront anrop med VBScript
Genom att göra ett asynkront anrop till en WMI-metod eller en providermetod kan ett skript fortsätta köras medan objekt återgår till ett SWbemSink--objekt och hanteras med metoder som SWbemSink.OnObjectReady. Asynkrona anrop rekommenderas dock inte eftersom data kanske inte returneras på samma säkerhetsnivå som anropet.
När du använder asynkrona mottagaranrop som SWbemSink.OnObjectReady för att hämta returnerade data kan du ange följande registervärde.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault
Att ange detta registervärde säkerställer säker autentisering av dataobjekten som returneras till sinken. Om UnsecAppAccessControlDefault är inställt på en (1) utför WMI åtkomstkontroll av datareturen. Åtkomstkontroller kontrollerar att data kommer från rätt källa. Mer information finns i Ställa in säkerhet på ett asynkront anrop.
Asynkrona metoder med namn som slutar med "Async_" returneras alltid omedelbart efter att ha anropats så att ett program kan fortsätta köras. Till exempel SWbemServices.ExecQuery är synkron och blockerar körning tills alla objekt returneras. Metoden SWbemServices.ExecQueryAsync är den asynkrona versionen som inte blockeras. Ett säkrare sätt att göra anropet till SWbemServices.ExecQuery icke-blockering är genom att göra anropet semisynkront. Mer information finns i Ställa in säkerhet på ett asynkront anrop och Att göra ett semisynkront anrop med VBScript-.
Parametern iFlags för asynkrona anrop är alltid noll (0). Asynkrona metoder tillhandahåller inte en SWbemObjectSet- samling till mottagarens underrutin. I stället tar SWbemSink.OnObjectReady händelseunderrutin i skriptet eller programmet emot varje objekt som det tillhandahålls.
När det ursprungliga asynkrona anropet är klart anropas SWbemSink.OnCompleted-händelsen för objektmottagaren och exekverar den kod du har placerat där för att behandla resultatet av anropet.
Not
En aktiv serversida (ASP) som skriptvärd stöder inte ett asynkront anrop.
Följande procedur beskriver hur du gör ett asynkront anrop med hjälp av VBScript.
Att göra ett asynkront anrop med VBScript-
Anslut till WMI och få ett objekt av typen från SWbemServices.
Set Service = GetObject("Winmgmts:")
Skapa objektmottagaren med antingen CreateObject- eller (endast för Windows Script Host 2.0) object-taggen med ett händelseattribut inställt på TRUE.
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
-eller-
<OBJECT progid="WbemScripting.SWbemSink" ID="SINK" events="true"/>
Skapa en underrutin för varje händelse som en asynkron händelse kan utlösa. Dessa händelser definieras som metoder på SWbemObject. WMI gör till exempel ett återanrop till SWbemSink.OnObjectReady när varje instans returnerar.
När du skapar underrutinen placerar du kod i underrutinen för att hantera varje händelse när den tas emot.
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
Granska parametern iHresult som returneras av händelsen OnCompleted för att avgöra om det asynkrona anropet lyckas eller inte, eller om ett fel uppstod. Om det lyckas är värdet som skickades i parametern iHresult lika med noll (0). Andra värden kan tyda på ett fel och du bör kontrollera värdena i felobjektet som returneras i parametern objErrorObject.
Gör ett asynkront anrop och skicka namnet på din sink i parametern objWbemSink.
Service.InstancesOfAsync sink, "Win32_process"
Ring ett anrop som förhindrar att skriptet slutar innan alla händelser tas emot. Om skriptet kan köras med ett skärmgränssnitt är ett enkelt sätt att göra detta att använda ett WSH-kommando (Windows Script Host)
Echo
som visas i följande exempel.WScript.Echo "Waiting for instances."
När du kör det här skriptet kan den första instansen returneras före Väntar på instanser meddelande eller så kan du se det efteråt. Det här är typen av asynkron bearbetning. Om du stänger meddelanderutan Väntar på instanser för tidigt kanske du inte ser alla instanser.
Om du har resultat från flera olika asynkrona anrop som återgår till samma mottagare lagrar du alla nödvändiga särskiljande data i objWbemAsyncContext kontextparameter.
När du är klar med mottagaren avbryter du ditt asynkrona anrop med metoden Avbryt.
objwbemsink.Cancel()
Metoden Avbryt instruerar WSH att avbryta alla asynkrona anrop som är associerade med ett visst mottagarobjekt. Därför kanske du vill använda separata enheter för asynkrona åtgärder som måste vara oberoende.
Frigör mottagarobjektet genom att tilldela mottagarobjektet till
Nothing
.set objwbemsink= Nothing
I följande kodexempel visas en asynkron fråga för alla instanser av Win32_Process på den lokala datorn. En semisynkron version av samma metod finns i Anropa en metod.
' 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
Relaterade ämnen