Żądanie danych usługi WMI na 64-bitowej platformie
Domyślnie aplikacja lub skrypt odbiera dane od odpowiedniego dostawcy, gdy istnieją dwie wersje dostawców. Dostawca 32-bitowy zwraca dane do aplikacji 32-bitowej, w tym wszystkich skryptów, a dostawca 64-bitowy zwraca dane do 64-bitowych aplikacji skompilowanych. Jednak aplikacja lub skrypt może żądać danych od dostawcy niedomyślnego, jeśli istnieje, powiadamiając o tym usługę WMI za pomocą flag w wywołaniach metod.
Flagi kontekstu
Flagi ciągów __ProviderArchitecture i __RequiredArchitecture mają zestaw wartości obsługiwanych przez usługę WMI, ale nie są zdefiniowane w plikach nagłówka zestawu SDK ani w plikach biblioteki typów. Wartości są umieszczane w parametrze kontekstu, aby zasygnalizować WMI, że powinno żądać danych od dostawcy spoza ustawień domyślnych.
Poniżej wymieniono flagi i ich możliwe wartości.
-
__ProviderArchitecture
-
Wartość całkowita, 32 lub 64, określająca wersję 32-bitową lub 64-bitową.
-
__WymaganaArchitektura
-
Wartość logiczna używana oprócz __ProviderArchitecture w celu wymuszenia załadowania określonej wersji dostawcy. Jeśli wersja jest niedostępna, usługa WMI zwraca błąd 0x80041013, wbemErrProviderLoadFailure dla języka Visual Basic i WBEM_E_PROVIDER_LOAD_FAILURE dla języka C++. Wartość domyślna dla tej flagi, jeśli nie jest określona, jest FALSE.
W 64-bitowym systemie, który ma równoległe wersje dostawcy, aplikacja 32-bitowa lub skrypt automatycznie odbiera dane od dostawcy 32-bitowego, chyba że te flagi są dostarczane i wskazują, że dane dostawcy 64-bitowego powinny zostać zwrócone.
Używanie flag kontekstu
Aplikacje języka C++ mogą używać interfejsu IWbemContext razem z IWbemServices::ExecMethod do przekazywania informacji o użyciu niestandardowego dostawcy do usługi WMI.
W skryptach i Visual Basic trzeba utworzyć obiekt SWbemNamedValueSet, który zawiera flagi dla parametru objWbemNamedValueSet w metodzie SWbemServices.ExecMethod. Aby uzyskać więcej informacji na temat konfigurowania obiektów parametrów dla tego wywołania, zobacz Konstruowanie obiektów InParameters i analizowanie obiektów OutParameters.
Skrypty i aplikacje można bezpiecznie uruchamiać przy użyciu flag kontekstowych w starszych systemach operacyjnych, ponieważ usługa WMI ignoruje je w systemach, w których nie są implementowane. Chociaż istnieją wersje 32-bitowe i 64-bitowe dostawcy rejestru systemowego, należy pamiętać, że istnieje tylko jedna wersja repozytorium WMI.
Dostęp do domyślnego hive rejestru
W poniższej serii przykładów użyto Registry Provider, który ma równoległe 32-bitowe i 64-bitowe wersje wstępnie zainstalowane w 64-bitowych systemach operacyjnych. W tych przykładach klienci 32-bitowi uzyskują dane zwracane przez dostawcę z 32-bitowego węzła HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. Klienci 64-bitowi uzyskują dane zwrócone przez dostawcę z węzła 64-bitowego HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.
Skrypty pokazują, jak wywołać metody Rejestru StdRegProv klasy za pomocą SWbemServices.ExecMethod uzyskać dane z 32-bitowego rejestru hive.
Poniższy skrypt pobiera dane od dostawcy zgodne z szerokością bitową wywołującego, czyli 64 bity, ponieważ działa w 64-bitowym hostie skryptów Windows (WSH). Skrypt pobiera wartość z 64-bitowego węzła rejestru HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging zamiast węzła 32-bitowego HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WBEM\CIMOM.
strComputer = "."
Const HKLM = &h80000002
Set objReg = Getobject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer _
& "\root\default:stdregprov")
'Set up inParameters object
Set Inparams = objReg.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objReg.ExecMethod_("GetStringValue", Inparams)
'Show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to " & Outparams.SValue
Jeśli wartość Rejestrowania w domyślnym hive jest ustawiona na 1, dane wyjściowe skryptu powinny wyglądać mniej więcej tak:
instance of __PARAMETERS
{
ReturnValue = 0;
sValue = "1";
};
WMI Logging is set to 1
Przykład: Specyficzne żądanie 32-bitowego obszaru rejestru na komputerze 64-bitowym
Poniższy zmodyfikowany przykład skryptu domyślnego używa flagi ciągu __ProviderArchitecture do żądania dostępu do danych rejestru 32-bitowego na komputerze 64-bitowym. Obiekt wywołujący jest połączony z 32-bitową gałęzią niezależnie od tego, czy jest to aplikacja 32-bitowa, czy 64-bitowa.
strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer(strComputer,"root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)
'show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to " & Outparams.SValue
Przykład: Wymuszanie w usłudze WMI dostępu do 32-bitowej gałęzi rejestru na komputerze 64-bitowym
Następująca modyfikacja powyższego skryptu przez dodanie flag __ProviderArchitecture i __RequiredArchitecture do parametru kontekstu wymusza w usłudze WMI załadowanie dostawcy 32-bitowego i pobranie danych 32-bitowych. Jeśli dostawca nie istnieje, wystąpi błąd ładowania dostawcy. Obiekt kontekstu należy podać w połączeniu z usługą WMI, wywołując SWbemLocator.ConnectServer.
strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
objCtx.Add "__RequiredArchitecture", TRUE
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer(strComputer,"root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
' Use ExecMethod to call the GetStringValue method
Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)
'Show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to " & Outparams.SValue
Tematy pokrewne