Demande de données WMI sur une plateforme 64 bits

Par défaut, une application ou un script reçoit des données du fournisseur correspondant lorsqu’il existe deux versions de fournisseurs. Le fournisseur 32 bits retourne des données à une application 32 bits, y compris tous les scripts, et le fournisseur 64 bits retourne des données aux applications compilées 64 bits. Toutefois, une application ou un script peut demander des données au fournisseur non défini par défaut, s’il existe, en informant WMI par le biais d’indicateurs sur les appels de méthode.

Indicateurs de contexte

Les indicateurs de chaîne __ProviderArchitecture et __RequiredArchitecture ont un ensemble de valeurs gérées par WMI, mais non définies dans les fichiers d’en-tête ou de bibliothèque de types du SDK. Les valeurs sont placées dans un paramètre de contexte pour signaler à WMI qu’il doit demander des données au fournisseur non défini par défaut.

Voici la liste des indicateurs et de leurs valeurs possibles.

__ProviderArchitecture

Valeur entière, 32 ou 64, qui spécifie la version 32 bits ou 64 bits.

__RequiredArchitecture

Valeur booléenne utilisée en plus de __ProviderArchitecture pour forcer le chargement de la version du fournisseur spécifiée. Si la version n’est pas disponible, WMI retourne l’erreur 0x80041013, wbemErrProviderLoadFailure pour Visual Basic et WBEM_E_PROVIDER_LOAD_FAILURE pour C++. La valeur par défaut de cet indicateur, lorsqu’il n’est pas défini, est FAUX.

Sur un système 64 bits ayant des versions côte à côte d’un fournisseur, une application ou un script 32 bits reçoit automatiquement les données du fournisseur 32 bits, sauf si ces indicateurs sont fournis et indiquent que les données du fournisseur 64 bits doivent être retournées.

Utilisation des indicateurs de contexte

Les applications C++ peuvent utiliser l’interface IWbemContext avec IWbemServices::ExecMethod pour communiquer l’utilisation d’un fournisseur non défini par défaut à WMI.

Dans les scripts et Visual Basic, vous devez créer un objet SWbemNamedValueSet contenant les indicateurs du paramètre objWbemNamedValueSet de SWbemServices.ExecMethod. Pour plus d’informations sur la configuration des objets de paramètres concernant cet appel, consultez Construction d’objets InParameters et Analyse des objets OutParameters.

Vous pouvez exécuter en toute sécurité des scripts et des applications à l’aide des indicateurs de contexte dans les systèmes d’exploitation plus anciens, car WMI les ignore dans les systèmes dans lesquels ils ne sont pas implémentés. Bien qu’il existe des versions 32 bits et 64 bits du fournisseur System Registry, notez qu’il n’existe qu’une seule version du dépôt WMI.

Accès à la ruche de registre par défaut

La série d’exemples suivante utilise le fournisseur de Registre, qui a des versions 32 bits et 64 bits côte à côte préinstallées sur les systèmes d’exploitation 64 bits. Dans ces exemples, les clients 32 bits obtiennent les données retournées par le fournisseur à partir du nœud 32 bits HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. Dans ces exemples, les clients 64 bits obtiennent les données retournées par le fournisseur à partir du nœud 64 bits HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.

Les scripts montrent comment appeler les méthodes du registre de classe StdRegProv via SWbemServices.ExecMethod pour obtenir des données à partir de la ruche de registre 32 bits.

Le script suivant récupère les données du fournisseur qui correspondent à la largeur de bits de l’appelant, en l’occurrence 64 bits, car il s’agit d’un script s’exécutant sous l’hôte de script Windows (WSH) 64 bits. Le script obtient la valeur du nœud de Registre 64 bits HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging plutôt que du nœud 32 bits 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

Si la valeur de Journalisation par défaut de la ruche est définie sur 1, la sortie du script doit ressembler à ce qui suit :

instance of __PARAMETERS
{
    ReturnValue = 0;
    sValue = "1";
};
WMI Logging is set to 1

Exemple : Demande spécifique de la ruche du registre 32 bits sur un ordinateur 64 bits

L’exemple suivant, modifié du script par défaut, utilise l’indicateur de chaîne __ProviderArchitecture pour demander l’accès aux données de Registre 32 bits sur un ordinateur 64 bits. L’appelant est connecté à la ruche 32 bits, qu’il s’agisse d’une application 32 ou 64 bits.

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

Exemple : Forcer WMI à accéder à la ruche du registre 32 bits sur un ordinateur 64 bits

La modification suivante du script ci-dessus, en ajoutant les indicateurs __ProviderArchitecture et __RequiredArchitecture au paramètre de contexte, force WMI à charger le fournisseur 32 bits et à obtenir des données 32 bits. Si le fournisseur n’existe pas, une erreur de chargement du fournisseur se produit. L’objet de contexte doit être fourni dans la connexion à WMI en appelant 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

Obtention et fourniture de données sur un ordinateur 64 bits