Begära WMI-data på en 64-bitars plattform
Som standard tar ett program eller skript emot data från motsvarande provider när det finns två versioner av providrar. 32-bitarsprovidern returnerar data till ett 32-bitarsprogram, inklusive alla skript, och 64-bitarsprovidern returnerar data till 64-bitars kompilerade program. Ett program eller skript kan dock begära data från nondefault-providern, om den finns, genom att meddela WMI via flaggor i metodanrop.
Kontextflaggor
__ProviderArchitecture- och __RequiredArchitecture-strängflaggor har en uppsättning värden som hanteras av WMI men som inte definieras i SDK-headerfiler eller typlibfiler. Värdena placeras i en kontextparameter för att signalera WMI att den ska begära data från nondefault-providern.
Nedan visas flaggorna och deras möjliga värden.
-
__ProviderArchitecture
-
Heltalsvärde, antingen 32 eller 64, som anger 32- eller 64-bitarsversionen.
-
__RequiredArchitecture
-
Booleskt värde som används utöver __ProviderArchitecture för att framtvinga inläsning av den angivna providerversionen. Om versionen inte är tillgänglig returnerar WMI felet 0x80041013, wbemErrProviderLoadFailure för Visual Basic och WBEM_E_PROVIDER_LOAD_FAILURE för C++. Standardvärdet för den här flaggan när den inte har angetts är FALSE.
I ett 64-bitarssystem som har sida vid sida-versioner av en provider tar ett 32-bitarsprogram eller skript automatiskt emot data från 32-bitarsprovidern, såvida inte dessa flaggor tillhandahålls och anger att 64-bitars providerdata ska returneras.
Använda kontextflaggor
C++-program kan använda gränssnittet IWbemContext med IWbemServices::ExecMethod för att kommunicera användningen av en nondefault-provider till WMI.
I skript och Visual Basic måste du skapa ett SWbemNamedValueSet- objekt som innehåller flaggorna för parametern objWbemNamedValueSet för SWbemServices.ExecMethod. Mer information om hur du konfigurerar parametrarna för det här anropet finns i Skapa InParameters-objekt och parsa OutParameters-objekt.
Du kan köra skript och program på ett säkert sätt med hjälp av kontextflaggor i äldre operativsystem, eftersom WMI ignorerar dem i system där de inte implementeras. Även om det finns 32-bitars- och 64-bitarsversioner av systemregisterprovidern bör du observera att det bara finns en version av WMI-lagringsplatsen.
Åtkomst till standardregisterstruktur
I följande serie med exempel används Registry Provider, som har 32-bitars- och 64-bitarsversioner förinstallerade på 64-bitars operativsystem sida vid sida. I de här exemplen får 32-bitarsklienter data som returneras av providern från 32-bitarsnoden HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. 64-bitarsklienter får data som returneras av providern från 64-bitarsnoden HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.
Skripten visar hur du anropar metoderna för klassen Registry StdRegProv via SWbemServices.ExecMethod för att hämta data från 32-bitars registerdatafilen.
Följande skript hämtar tillbaka data från providern som matchar bitbredden för anroparen, i det här fallet 64 bitar, eftersom det är ett skript som körs under 64-bitars Windows Script Host (WSH). Skriptet hämtar värdet från 64-bitars registernoden HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging i stället för 32-bitarsnoden 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
Om värdet loggning i standarddatafilen är inställt på 1 bör utdata från skriptet se ut ungefär så här:
instance of __PARAMETERS
{
ReturnValue = 0;
sValue = "1";
};
WMI Logging is set to 1
Exempel: Begär specifikt 32-bitars register hive på en 64-bitars dator
I följande ändrade exempel på standardskriptet används flaggan __ProviderArchitecture sträng för att begära åtkomst till 32-bitars registerdata på en 64-bitars dator. Anroparen är ansluten till 32-bitars hive oavsett om det är ett 32- eller 64-bitarsprogram.
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
Exempel: Tvinga WMI att komma åt 32-bitars registerdatafilen på en 64-bitars dator
Följande ändring av skriptet ovan genom att lägga till flaggorna __ProviderArchitecture och __RequiredArchitecture i kontextparametern tvingar WMI att läsa in 32-bitarsprovidern och hämta 32-bitarsdata. Om tjänsteleverantören inte finns uppstår ett fel vid inläsning av tjänsteleverantör. Kontextobjektet måste anges i anslutningen till WMI genom att anropa 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
Relaterade ämnen