Wywoływanie metody WMI
WMI dostarcza metody w interfejsie API COM i interfejsie API skryptów w celu uzyskania informacji lub manipulacji obiektami w systemie przedsiębiorstwa. Na przykład metoda skryptowa WMI SWbemServices.ExecQuery zapytuje o dane. Dostawcy mają również metody zdefiniowane w klasach, które rejestrują. Przykłady to metody Win32_LogicalDisk Chkdsk i ScheduleAutoChk dostarczone przez dostawcę Win32.
W tym temacie omówiono następujące sekcje:
Metody WMI w porównaniu z metodami dostawcy
Używając wywołań metody WMI połączonych z wywołaniami metody dostawcy , można pobierać i manipulować informacjami o swoim przedsiębiorstwie. Aby uzyskać więcej informacji, zobacz Wywoływanie metody WMI i Wywoływanie metody dostawcy.
Metody obiektu skryptowego usługi WMI SWbemObject mają specjalny stan, ponieważ mogą być stosowane do dowolnej klasy danych usługi WMI. Aby uzyskać więcej informacji, zobacz Scripting with SWbemObject.
Poniższy przykład kodu wywołuje metody WMI i dostawcy.
Następujące metody usługi WMI i dostawcy znajdują się w interfejsie API skryptów dla usługi WMI:
- objWMIService.ExecQuery wywołuje metodę skryptu usługi WMI SWbemServices.ExecQuery
- objService.StopService() wywołuje metodę dostawcy Win32_Service.StopService
Możesz wyszukać kod, który może pojawić się w sekcji "Return" w sekcji Kody powrotu dla Win32_Service.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
Return = objService.StopService()
If Return <> 0 Then
Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return
Else
WScript.Echo "Succeeded"
End If
Next
$colServices= Get-WmiObject -Class Win32_Service -Filter 'Name = "Alerter"'
foreach ($objService in $colServices)
{
$objService.StopService()
}
tryby Method-Calling w usłudze WMI
Tryb wywołania półsynchronicznego zwykle zapewnia najlepszą równowagę między zabezpieczeniami a wydajnością.
Aby uzyskać więcej informacji na temat każdego z możliwych trybów, zobacz następujące artykuły:
- synchroniczne
- asynchroniczne
- półsynchroniczne
Tryb synchroniczny
Tryb synchroniczny występuje, gdy program lub skrypty wstrzymują się do momentu, aż wywołanie metody zwróci obiekt kolekcji SWbemObjectSet. Usługa WMI kompiluje tę kolekcję w pamięci przed zwróceniem obiektu kolekcji do wywołującego programu lub skryptu.
Tryb synchroniczny może mieć negatywny wpływ na działanie programu lub skryptu na komputerze z uruchomionym programem lub skryptem. Na przykład synchroniczne pobieranie tysięcy zdarzeń z dziennika zdarzeń może zająć dużo czasu i używać dużej ilości pamięci, ponieważ usługa WMI tworzy obiekt z każdego zdarzenia, a następnie umieszcza te obiekty w kolekcji przed przekazaniem kolekcji do metody .
Należy wywoływać tylko metody, które nie zwracają dużych zestawów danych w trybie synchronicznym. Następujące metody SWbemServices można bezpiecznie wywoływać w trybie synchronicznym:
Wszystkie metody SWbemServices bez słowa "Async" w nazwie mogą być wywoływane w trybie synchronicznym, ustawiając wartość wbemFlagReturnWhenComplete w parametrze iFlags.
Tryb asynchroniczny
Tryb asynchroniczny występuje, gdy program lub skrypt będzie nadal działać po wywołaniu metody . Usługa WMI zwraca wszystkie obiekty z metody do obiektu SWbemSink podczas tworzenia każdego obiektu. Program wywołujący lub skrypt musi mieć obiekt SWbemSink oraz obsługę zdarzeń SWbemSink.OnObjectReady w celu przetworzenia zwróconych obiektów. Aby uzyskać więcej informacji na temat tworzenia programu obsługi zdarzeń dla trybu asynchronicznego, zobacz Odbieranie zdarzenia WMI.
Chociaż ten tryb nie ma wydajności i kary za zasoby trybu synchronicznego, tryb asynchroniczny może powodować poważne zagrożenia bezpieczeństwa, ponieważ wyniki przechowywane w SWbemSink obiektu mogą nie pochodzić z programu wywołującego lub skryptu. Usługa WMI obniża poziom uwierzytelniania w obiekcie SWbemSink, dopóki metoda nie odniesie sukcesu. Aby uzyskać więcej informacji na temat ograniczania tych zagrożeń bezpieczeństwa, zobacz Ustawianie zabezpieczeń w asynchronicznych wywołaniach.
Metody dołączane z wyrazem Async są metodami trybu asynchronicznego. Następujące metody to wywołania asynchroniczne:
- SWbemServices.AssociatorsOfAsync
- SWbemServices.DeleteAsync
- SWbemServices.ExecMethodAsync
- SWbemServices.ExecNotificationQueryAsync
- SWbemServices.ExecQueryAsync
- SWbemServices.InstancesOfAsync
- SWbemServices.ReferencesToAsync
- SWbemServices.SubclassesOfAsync
Aby uzyskać więcej informacji na temat trybu asynchronicznego, zobacz:
- wykonywanie wywołania asynchronicznego za pomocą języka C++
- wykonywanie wywołania asynchronicznego przy użyciu języka VBScript
Tryb półsynchroniczny
Tryb semisynchroniczny jest podobny do trybu asynchronicznego, ponieważ program lub skrypt nadal działa po wywołaniu metody. W trybie półsynchronicznym usługa WMI pobiera obiekty w tle, ponieważ skrypt lub program nadal działa. Funkcja WMI zwraca każdy obiekt zwrócony do metody wywołującej bezpośrednio po utworzeniu obiektu.
Ponieważ usługa WMI zarządza obiektem, tryb semisynchroniczny jest bezpieczniejszy niż tryb asynchroniczny. Jeśli jednak używasz trybu semisynchronicznego z ponad 1000 wystąpieniami, pobieranie wystąpień może zmonopolizować dostępne zasoby, co może obniżyć wydajność programu lub skryptu i komputera przy użyciu programu lub skryptu. Każdy obiekt pobiera niezbędne zasoby do momentu zwolnienia pamięci.
Aby obejść ten warunek, można wywołać metodę za pomocą parametru iFlags ustawionego za pomocą parametru wbemFlagForwardOnly i wbemFlagReturnImmediately flagi, aby usługa WMI zwróciła SWbemObjectSet. Tryb jednokierunkowy SWbemObjectSet eliminuje problem z wydajnością spowodowany dużym zestawem danych, zwalniając pamięć po enumeracji obiektu.
Każda metoda SWbemServices, której nie można wywołać w trybie synchronicznym lub asynchronicznym, jest wywoływana w trybie półsynchronicznym.
Następujące metody są wywoływane w trybie półsynchronicznym:
- SWbemServices.AssociatorsOf
- SWbemServices.Delete
- SWbemServices.ExecMethod
- SWbemServices.ExecNotificationQuery
- SWbemServices.ExecQuery
- SWbemServices.Get
- SWbemServices.InstancesOf
- SWbemServices.ReferencesTo
- SWbemServices.SubclassesOf
- SWbemServices.Put
Aby uzyskać więcej informacji na temat trybu semisynchronicznego, zobacz Making a Semisynchronous Call with C++ and Making a Semisynchronous Call with VBScript.
Tematy pokrewne
-
Skrypty za pomocą SWbemObject