Anfordern von WMI-Daten auf einer 64-Bit-Plattform
Standardmäßig empfängt eine Anwendung oder ein Skript Daten vom entsprechenden Anbieter, wenn zwei Versionen von Anbietern vorhanden sind. Der 32-Bit-Anbieter gibt Daten an eine 32-Bit-Anwendung zurück, einschließlich aller Skripts, und der 64-Bit-Anbieter gibt Daten an die kompilierten 64-Bit-Anwendungen zurück. Eine Anwendung oder ein Skript kann jedoch Daten vom nicht standardmäßigen Anbieter anfordern – sofern vorhanden –, indem WMI über Flags in Methodenaufrufen benachrichtigt wird.
Kontextflags
Die Zeichenfolgenflags __ProviderArchitecture und __RequiredArchitecture verfügen über eine Reihe von Werten, die von WMI verarbeitet werden, aber nicht in SDK-Header- oder Typbibliotheksdateien definiert sind. Die Werte werden in einem Kontextparameter platziert, um WMI zu signalisieren, dass Daten vom nicht standardmäßigen Anbieter anzufordern sind.
Im Folgenden werden die Flags und ihre möglichen Werte aufgelistet.
-
__ProviderArchitecture
-
Ein ganzzahliger Wert – entweder 32 oder 64 –, der die 32-Bit- bzw. die 64-Bit-Version angibt.
-
__RequiredArchitecture
-
Ein boolescher Wert, der zusätzlich zu __ProviderArchitecture verwendet wird, um das Laden der angegebenen Anbieterversion zu erzwingen. Wenn die Version nicht verfügbar ist, gibt WMI den Fehler 0x80041013 zurück: wbemErrProviderLoadFailure für Visual Basic und WBEM_E_PROVIDER_LOAD_FAILURE für C++. Der Standardwert für dieses Flag, wenn es nicht anderweitig angegeben ist, ist FALSE.
Auf einem 64-Bit-System mit parallelen Versionen eines Anbieters empfängt eine 32-Bit-Anwendung oder ein 32-Bit-Skript automatisch Daten vom 32-Bit-Anbieter, es sei denn, diese Flags sind angegeben und weisen darauf hin, dass Daten des 64-Bit-Anbieters zurückgegeben werden sollen.
Verwenden der Kontextflags
C++-Anwendungen können die IWbemContext-Schnittstelle mit der IWbemServices::ExecMethod verwenden, um WMI die Verwendung eines nicht standardmäßigen Anbieters mitzuteilen.
Unabhängig davon, ob Sie ein Skript schreiben oder Visual Basic verwenden, müssen Sie ein SWbemNamedValueSet-Objekt erstellen, das die Flags für den objWbemNamedValueSet-Parameter der SWbemServices.ExecMethod enthält. Weitere Informationen zum Einrichten der Parameterobjekte für diesen Aufruf finden Sie unter Erstellen von InParameters-Objekten und Analysieren von OutParameters-Objekten.
Sie können Skripts und Anwendungen mit Kontextflags sicher in älteren Betriebssystemen ausführen, da WMI diese in Systemen ignoriert, in denen sie nicht implementiert sind. Es gibt zwar 32-Bit- und 64-Bit-Versionen des Systemregistrierungsanbieters, aber nur eine Version des WMI-Repositorys.
Zugreifen auf die Standardregistrierungsstruktur
In den folgenden Beispielen wird der Registrierungsanbieter verwendet, für den 32-Bit- und 64-Bit-Versionen unter 64-Bit-Betriebssystemen parallel vorinstalliert sind. In diesen Beispielen erhalten 32-Bit-Clients vom Anbieter zurückgegebene Daten aus dem 32-Bit-Knoten HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. 64-Bit-Clients erhalten vom Anbieter zurückgegebene Daten aus dem 64-Bit-Knoten HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.
Die Skripts zeigen, wie die Methoden der StdRegProv-Registrierungsklasse über SWbemServices.ExecMethod aufgerufen werden, um Daten aus der 32-Bit-Registrierungsstruktur abzurufen.
Das folgende Skript ruft Daten aus dem Anbieter ab, der der Bitbreite der aufrufenden Funktion entspricht – in diesem Fall 64 Bit, da es sich um ein Skript handelt, das im 64-Bit-Windows Script Host (WSH) ausgeführt wird. Das Skript ruft den Wert aus dem 64-Bit-Registrierungsknoten HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging ab, nicht aus dem 32-Bit-Knoten 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
Wenn der Wert für die Protokollierung in der Standardstruktur auf 1 festgelegt ist, sollte die Ausgabe des Skripts ungefähr wie folgt aussehen:
instance of __PARAMETERS
{
ReturnValue = 0;
sValue = "1";
};
WMI Logging is set to 1
Beispiel: Spezifisches Anfordern der 32-Bit-Registrierungsstruktur auf einem 64-Bit-Computer
Das folgende geänderte Beispiel des Standardskripts verwendet das Zeichenfolgenflag __ProviderArchitecture, um auf einem 64-Bit-Computer Zugriff auf die 32-Bit-Registrierungsdaten anzufordern. Die aufrufende Funktion ist mit der 32-Bit-Struktur verbunden, unabhängig davon, ob es sich um eine 32- oder 64-Bit-Anwendung handelt.
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
Beispiel: Erzwingen des Zugriffs von WMI auf die 32-Bit-Registrierungsstruktur auf einem 64-Bit-Computer
Die folgende Änderung des obigen Skripts durch Hinzufügen der Flags __ProviderArchitecture und __RequiredArchitecture zum Kontextparameter zwingt WMI, den 32-Bit-Anbieter zu laden und 32-Bit-Daten abzurufen. Wenn der Anbieter nicht vorhanden ist, tritt ein Fehler beim Laden des Anbieters auf. Das Kontextobjekt muss in der Verbindung mit WMI durch Aufruf von SWbemLocator.ConnectServer angegeben werden.
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
Zugehörige Themen