Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Als u een asynchrone aanroep naar een WMI-methode of een providermethode maakt kunt u een script blijven uitvoeren terwijl objecten terugkeren naar een SWbemSink object en worden verwerkt door methoden zoals SWbemSink.OnObjectReady-. Asynchrone aanroepen worden echter niet aanbevolen omdat de gegevens mogelijk niet worden geretourneerd op hetzelfde beveiligingsniveau als de aanroep.
Wanneer u asynchrone sink-aanroepen gebruikt, zoals SWbemSink.OnObjectReady- om geretourneerde gegevens op te halen, kunt u de volgende registerwaarde instellen.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault
Als u deze registerwaarde instelt, zorgt u ervoor dat de gegevensobjecten die naar de sink worden geretourneerd, worden geverifieerd. Als UnsecAppAccessControlDefault- is ingesteld op één (1), voert WMI toegangscontroles uit van de gegevens die worden geretourneerd. Er wordt gecontroleerd of de gegevens afkomstig zijn van de juiste bron. Zie Beveiliging instellen voor een Asynchrone aanroepvoor meer informatie.
Asynchrone methoden met namen die eindigen op 'Async_' retourneren altijd onmiddellijk nadat ze zijn aangeroepen, zodat een programma kan doorgaan met uitvoeren. SWbemServices.ExecQuery- is bijvoorbeeld synchroon en blokkeert de uitvoering totdat alle objecten worden geretourneerd. De SWbemServices.ExecQueryAsync methode is de niet-blokkerende asynchrone versie. Een veiligere manier om de aanroep naar SWbemServices.ExecQuery niet-blokkering te maken, is door de aanroep semisynchroonte maken. Zie voor meer informatie Beveiliging instellen voor een asynchrone aanroep en een semisynchrone aanroep maken met VBScript.
De iFlags-parameter voor asynchrone aanroepen wordt altijd standaard ingesteld op nul (0). Asynchrone methoden leveren geen SWbemObjectSet verzameling aan de sinksubroutine. In plaats daarvan ontvangt de SWbemSink.OnObjectReady gebeurtenissubroutine in uw script of toepassing elk object zoals het is opgegeven.
Wanneer de oorspronkelijke asynchrone aanroep is voltooid, wordt de SWbemSink.OnCompleted gebeurtenis van de objectsink aangeroepen en wordt de code uitgevoerd die u daar plaatst om het resultaat van de aanroep te verwerken.
Notitie
Een Active Server Page (ASP) als scripthost biedt geen ondersteuning voor een asynchrone aanroep.
In de volgende procedure wordt beschreven hoe u een asynchrone aanroep maakt met behulp van VBScript.
Een asynchrone aanroep maken met behulp van VBScript-
Maak verbinding met WMI en haal een SWbemServices--object op.
Set Service = GetObject("Winmgmts:")Maak de objectsink met behulp van CreateObject of (alleen voor Windows Script Host 2.0) de OBJECT-tag met een gebeurteniskenmerk ingesteld op TRUE.
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")-of-
<OBJECT progid="WbemScripting.SWbemSink" ID="SINK" events="true"/>Maak een subroutine voor elke gebeurtenis die een asynchrone gebeurtenis kan activeren. Deze gebeurtenissen worden gedefinieerd als methoden voor SWbemObject. WMI maakt bijvoorbeeld een callback naar SWbemSink.OnObjectReady- zodra elke instantie terugkeert.
Wanneer u de subroutine maakt, plaatst u code in de subroutine om elke gebeurtenis te verwerken wanneer deze wordt ontvangen.
Sub SINK_OnCompleted( iHResult, objErrorObject, objAsyncContext ) WScript.Echo "Asynchronous operation is done." End Sub Sub SINK_OnObjectReady(objObject, objAsyncContext) WScript.Echo (objObject.Name) End SubBekijk de iHresult-parameter die wordt geretourneerd door de OnCompleted gebeurtenis om te bepalen of de asynchrone aanroep succesvol is, of dat er een fout is opgetreden. Als dit lukt, is de waarde die is doorgegeven in de parameter iHresult gelijk aan nul (0). Elke andere waarde kan een fout aangeven. Controleer de waarden in het foutobject dat wordt geretourneerd in de parameter objErrorObject.
Maak een asynchrone aanroep en geef de naam van uw sink door in de objWbemSink parameter.
Service.InstancesOfAsync sink, "Win32_process"Maak een aanroep waarmee het script niet kan worden beëindigd voordat alle gebeurtenissen worden ontvangen. Als uw script kan worden uitgevoerd met een scherminterface, kunt u dit eenvoudig doen door een WSH-opdracht (Windows Script Host) te gebruiken
Echo, zoals wordt weergegeven in het volgende voorbeeld.WScript.Echo "Waiting for instances."Wanneer u dit script uitvoert, kan het eerste exemplaar terugkeren voordat het bericht Wachten op exemplaren verschijnt, of u kunt het daarna zien. Dit is de aard van asynchrone verwerking. Als u het Wachten op instanties berichtvak te snel sluit, ziet u mogelijk niet alle instanties.
Als u resultaten hebt van verschillende asynchrone aanroepen die terugkeren naar dezelfde sink, slaat u de benodigde onderscheidsgegevens op in de objWbemAsyncContext contextparameter.
Wanneer u klaar bent met de sink, annuleert u de asynchrone aanroep met de methode Cancel.
objwbemsink.Cancel()Met de methode Cancel wordt WSH geïnstrueerd alle asynchrone aanroepen te annuleren die zijn gekoppeld aan een bepaald sink-object. Daarom kunt u afzonderlijke sinks gebruiken voor asynchrone bewerkingen die onafhankelijk moeten zijn.
Laat het sinkobject los door het sinkobject toe te wijzen aan
Nothing.set objwbemsink= Nothing
In het volgende codevoorbeeld ziet u een asynchrone query voor alle exemplaren van Win32_Process op de lokale computer. Zie Een methode aanroepenvoor een semisynchrone versie van dezelfde methode.
' 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
Verwante onderwerpen