Udostępnij za pośrednictwem


Tworzenie wywołania asynchronicznego za pomocą języka VBScript

Wykonywanie asynchronicznego wywołania metody WMI lub metody dostawcy umożliwia dalsze wykonywanie skryptu, podczas gdy obiekty wracają do obiektu SWbemSink i są obsługiwane przez metody, takie jak SWbemSink.OnObjectReady. Jednak wywołania asynchroniczne nie są zalecane, ponieważ dane mogą być zwracane na niższym poziomie zabezpieczeń niż poziom, na którym wykonywane jest wywołanie.

W przypadku używania asynchronicznych wywołań ujścia, takich jak SWbemSink.OnObjectReady w celu uzyskania zwróconych danych, można ustawić następującą wartość rejestru.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault

Ustawienie tej wartości rejestru zapewnia uwierzytelnianie obiektów danych zwracanych do odbiornika. Jeśli UnsecAppAccessControlDefault jest ustawiona na jedną (1), usługa WMI przeprowadza sprawdzanie dostępu do zwracanych danych. Sprawdzanie dostępu sprawdza, czy dane pochodzą z poprawnego źródła. Aby uzyskać więcej informacji, zobacz Ustawianie zabezpieczeń dla wywołania asynchronicznego.

Metody asynchroniczne z nazwami kończącymi się na "Async_" zawsze zwracają się natychmiast po wywołaniu tak, aby program mógł kontynuować wykonywanie. Na przykład SWbemServices.ExecQuery jest synchroniczna i blokuje wykonywanie do momentu zwrócenia wszystkich obiektów. Metoda SWbemServices.ExecQueryAsync to nieblokująca wersja asynchroniczna. Bezpieczniejszym sposobem wywołania metody SWbemServices.ExecQuery w trybie nieblokującym jest wykonanie wywołania w trybie półz synchronizowanym. Aby uzyskać więcej informacji, zobacz Ustawianie zabezpieczeń dla wywołania asynchronicznego i Wykonywanie wywołania półsynchronicznego za pomocą VBScript.

Parametr iFlags dla wywołań asynchronicznych zawsze jest domyślnie równa zero (0). Metody asynchroniczne nie dostarczają kolekcji SWbemObjectSet do podprogramu odbierającego. Zamiast tego SWbemSink.OnObjectReady podprocedura zdarzeń w skrypcie lub aplikacji odbiera każdy obiekt w miarę ich dostarczania.

Po zakończeniu oryginalnego wywołania asynchronicznego wywołuje zdarzenie SWbemSink.OnCompleted odbiornika obiektu i wykonuje kod, który tam umieszczasz w celu przetworzenia wyniku wywołania.

Notatka

Strona aktywnego serwera (ASP) jako host skryptu nie obsługuje wywołania asynchronicznego.

 

Poniższa procedura opisuje sposób tworzenia asynchronicznego wywołania przy użyciu języka VBScript.

Aby wykonać wywołanie asynchroniczne przy użyciu języka VBScript

  1. Połącz się z usługą WMI i uzyskaj obiekt SWbemServices.

    Set Service = GetObject("Winmgmts:")
    
  2. Utwórz odbiornik obiektu przy użyciu CreateObject lub (tylko dla Windows Script Host 2.0) tagu OBJECT z atrybutem events ustawionym na TRUE.

    Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
    

    -lub-

    <OBJECT progid="WbemScripting.SWbemSink" ID="SINK" events="true"/>
    
  3. Utwórz podprocedurę dla każdego zdarzenia, które zdarzenie asynchroniczne może wyzwalać. Te zdarzenia są definiowane jako metody w SWbemObject. Na przykład usługa WMI wykonuje wywołanie zwrotne SWbemSink.OnObjectReady, jak każde wystąpienie jest zwracane.

    Podczas tworzenia podprocedury, umieść kod w podprocedurze, aby obsłużyć każde zdarzenie po jego odebraniu.

    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
    

    Sprawdź parametr iHresult zwrócony przez zdarzenie OnCompleted, aby określić, czy wywołanie asynchroniczne zakończyło się pomyślnie, czy też wystąpił błąd. W przypadku powodzenia wartość przekazana w parametrze iHresult jest równa zero (0). Każda inna wartość może wskazywać błąd i należy sprawdzić wartości w obiekcie błędu zwróconym w parametrze objErrorObject.

  4. Wykonaj wywołanie asynchroniczne i przekaż nazwę ujścia w parametrze objWbemSink.

    Service.InstancesOfAsync sink, "Win32_process"
    
  5. Wykonaj wywołanie, które uniemożliwia zakończenie skryptu przed odebraniem wszystkich zdarzeń. Jeśli skrypt można uruchomić za pomocą interfejsu graficznego, prostym sposobem jest użycie polecenia hosta skryptów systemu Windows (WSH) Echo, które jest pokazane w poniższym przykładzie.

    WScript.Echo "Waiting for instances."
    

    Po wykonaniu tego skryptu pierwsze pojawienie się instancji może pojawić się przed komunikatem Oczekiwanie na wystąpienia lub po nim. Jest to charakter przetwarzania asynchronicznego. Jeśli zamkniesz okno komunikatu Oczekiwanie na wystąpienia zbyt szybko, możesz nie zobaczyć wszystkich wystąpień.

  6. Jeśli masz wyniki z kilku różnych wywołań asynchronicznych zwracanych do tego samego odbiorcy, zapisz wszelkie niezbędne dane wyróżniające w parametrze kontekstu objWbemAsyncContext.

  7. Po zakończeniu używania odbiornika anuluj wywołanie asynchroniczne za pomocą metody Cancel.

    objwbemsink.Cancel()
    

    Metoda Cancel instruuje protokół WSH, aby anulował wszystkie wywołania asynchroniczne skojarzone z danym obiektem ujścia. W związku z tym można użyć oddzielnych zlewów dla operacji asynchronicznych, które to muszą być niezależne.

  8. Zwolnij obiekt ujścia, przypisując obiekt ujścia do Nothing.

    set objwbemsink= Nothing
    

Poniższy przykład kodu przedstawia asynchroniczne zapytanie dla wszystkich wystąpień Win32_Process na komputerze lokalnym. Aby zapoznać się z semisynchroniczną wersją tej samej metody, patrz Wywoływanie 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

Wywoływanie metody

Zarządzanie zabezpieczeniami WMI