Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Provedení asynchronního volání metody rozhraní WMI nebo metody poskytovatele umožňuje skript pokračovat v provádění, zatímco se objekty vrátí do objektu SWbemSink a zpracovávají se metodami, jako je SWbemSink.OnObjectReady. Asynchronní volání se však nedoporučuje, protože data nemusí být vrácena na stejné úrovni zabezpečení jako volání.
Při použití asynchronních volání úložiště, například SWbemSink.OnObjectReady, pro získání vrácených dat můžete nastavit následující hodnotu registru.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault
Nastavením této hodnoty registru zajistíte ověření datových objektů vrácených do jímky. Pokud je UnsecAppAccessControlDefault nastavená na jednu (1), služba WMI provede kontrolu přístupu vrácených dat. Access kontroluje, jestli data pocházejí ze správného zdroje. Další informace naleznete v tématu Nastavení zabezpečení asynchronního volání.
Asynchronní metody s názvy, které končí na "Async_", se vždy vrátí okamžitě po zavolání, aby program mohl pokračovat v provádění. Například SWbemServices.ExecQuery je synchronní a blokuje provádění, dokud se nevrátí všechny objekty. Metoda SWbemServices.ExecQueryAsync je neblokující asynchronní verze. Bezpečnější způsob, jak provést volání SWbemServices.ExecQuery tak, aby bylo neblokující, je provést volání polosynchronně. Další informace najdete v tématu Nastavení zabezpečení asynchronního volání a Vytvoření polosynchronního volání pomocíjazyka VBScript .
Parametr iFlags pro asynchronní volání se vždy nastaví na nulu (0). Asynchronní metody neposkytují kolekci SWbemObjectSet do zachycovacího podprogramu. Místo toho podprogram události SWbemSink.OnObjectReady ve vašem skriptu nebo aplikaci obdrží každý objekt, jakmile je poskytován.
Po dokončení původního asynchronního volání vyvolá událost SWbemSink.OnCompleted objektového snímače a spustí kód, který jste tam umístili pro zpracování výsledku volání.
Poznámka
Stránka asp (Active Server Page) jako hostitel skriptu nepodporuje asynchronní volání.
Následující postup popisuje, jak provést asynchronní volání pomocí jazyka VBScript.
Provedení asynchronního volání pomocí jazyka VBScript
Připojte se k WMI a získejte objekt SWbemServices.
Set Service = GetObject("Winmgmts:")Vytvořte jímku objektu pomocí CreateObject nebo (pouze pro Windows Script Host 2.0) značku OBJECT s atributem události nastavenou na TRUE.
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")-nebo-
<OBJECT progid="WbemScripting.SWbemSink" ID="SINK" events="true"/>Vytvořte podprogram pro každou událost, která může aktivovat asynchronní událost. Tyto události jsou definovány jako metody SWbemObject. Například rozhraní WMI provádí zpětné volání na SWbemSink.OnObjectReady, jakmile se vrátí každá instance.
Při vytváření podprogramu umístěte kód do podprogramu, který bude zpracovávat každou událost při přijetí.
Sub SINK_OnCompleted( iHResult, objErrorObject, objAsyncContext ) WScript.Echo "Asynchronous operation is done." End Sub Sub SINK_OnObjectReady(objObject, objAsyncContext) WScript.Echo (objObject.Name) End SubZkontrolujte parametr iHresult vrácený událostí OnCompleted a zjistěte, jestli asynchronní volání proběhlo úspěšně nebo jestli došlo k chybě. V případě úspěchu se hodnota předaná v iHresult parametru rovná nule (0). Jakákoli jiná hodnota může znamenat chybu a měli byste zkontrolovat hodnoty v objektu chyby, který je vrácen v objErrorObject parametru.
Proveďte asynchronní volání a předejte název jímky v parametru objWbemSink.
Service.InstancesOfAsync sink, "Win32_process"Proveďte volání, které brání ukončení skriptu před přijetím všech událostí. Pokud skript může běžet s rozhraním obrazovky, jednoduchým způsobem, jak to udělat, je použít windows Script Host (WSH)
Echopříkaz, který je znázorněn v následujícím příkladu.WScript.Echo "Waiting for instances."Při spuštění tohoto skriptu se může zobrazit výsledek první instance před zprávou Čekání na instance, nebo se může zobrazit po ní. Toto je povaha asynchronního zpracování. Pokud zavřete okno zprávy Čekání na instance příliš brzy, nemusí se zobrazit všechny instance.
Pokud máte výsledky z několika různých asynchronních volání vracející se do stejné jímky, uložte všechna nezbytná rozlišující data do objWbemAsyncContext parametr kontextu.
Po dokončení jímky zrušte asynchronní volání metodou Cancel.
objwbemsink.Cancel()Metoda Cancel dává WSH pokyn, aby zrušila všechna asynchronní volání přidružená k danému objektu jímky. Proto můžete chtít použít samostatné jímky pro asynchronní operace, které musí být nezávislé.
Uvolněte objekt jímky přiřazením objektu jímky k
Nothing.set objwbemsink= Nothing
Následující příklad kódu ukazuje asynchronní dotaz pro všechny instance Win32_Process na místním počítači. Polosynchronní verze stejné metody naleznete v tématu Volání metody.
' 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
Související témata