Richiesta di dati WMI in una piattaforma a 64 bit

Per impostazione predefinita, un'applicazione o uno script riceve i dati dal provider corrispondente quando esistono due versioni di provider. Il provider a 32 bit restituisce dati a un'applicazione a 32 bit, inclusi tutti gli script e il provider a 64 bit restituisce i dati alle applicazioni compilate a 64 bit. Tuttavia, un'applicazione o uno script può richiedere dati dal provider nondefault, se presente, notificando WMI tramite flag sulle chiamate al metodo.

Flag di contesto

I flag di stringa __ProviderArchitecture e __RequiredArchitecture hanno un set di valori gestiti da WMI, ma non definiti nei file di intestazione o libreria dei tipi SDK. I valori vengono inseriti in un parametro di contesto per segnalare WMI che deve richiedere dati dal provider non definito.

Di seguito sono elencati i flag e i relativi valori possibili.

__ProviderArchitecture

Valore intero, 32 o 64, che specifica la versione a 32 bit o a 64 bit.

__RequiredArchitecture

Valore booleano usato oltre a __ProviderArchitecture per forzare il caricamento della versione del provider specificata. Se la versione non è disponibile, WMI restituisce l'errore 0x80041013, wbemErrProviderLoadFailure per Visual Basic e WBEM_E_PROVIDER_LOAD_FAILURE per C++. Il valore predefinito per questo flag quando non viene specificato è FALSE.

In un sistema a 64 bit con versioni side-by-side di un provider, un'applicazione a 32 bit o uno script riceve automaticamente i dati dal provider a 32 bit, a meno che questi flag non vengano forniti e indicano che i dati del provider a 64 bit devono essere restituiti.

Uso dei flag di contesto

Le applicazioni C++ possono usare l'interfaccia IWbemContext con IWbemServices::ExecMethod per comunicare l'uso di un provider non definito a WMI.

In scripting e Visual Basic è necessario creare un oggetto SWbemNamedValueSet contenente i flag per il parametro objWbemNamedValueSet di SWbemServices.ExecMethod. Per altre informazioni sulla configurazione degli oggetti parametri per questa chiamata, vedere Creazione di oggetti InParameters e Analisi degli oggetti OutParameters.

È possibile eseguire in modo sicuro script e applicazioni usando i flag di contesto nei sistemi operativi meno recenti, perché WMI li ignora nei sistemi in cui non vengono implementati. Sebbene esistano versioni a 32 bit e a 64 bit del provider del Registro di sistema, si noti che esiste solo una versione del repository WMI.

Accesso all'Hive del Registro di sistema predefinito

La serie di esempi seguenti usa il provider del Registro di sistema, con versioni side-by-side a 32 bit e a 64 bit preinstallate nei sistemi operativi a 64 bit. In questi esempi, i client a 32 bit ottengono i dati restituiti dal provider dal nodo a 32 bit HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. I client a 64 bit ottengono i dati restituiti dal provider dal nodo a 64 bit HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.

Gli script illustrano come chiamare i metodi della classe Registry StdRegProv tramite SWbemServices.ExecMethod per ottenere dati dall'hive del Registro di sistema a 32 bit.

Lo script seguente recupera i dati dal provider che corrisponde alla larghezza di bit del chiamante, in questo caso 64 bit, perché è uno script in esecuzione con l'host script Windows a 64 bit (WSH). Lo script ottiene il valore dal nodo del Registro di sistema a 64 bit HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging anziché dal nodo a 32 bit 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

Se il valore Di registrazione nell'hive predefinito è impostato su 1, l'output dello script dovrebbe essere simile al seguente:

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

Esempio: richiesta specifica dell'Hive del Registro di sistema a 32 bit in un computer a 64 bit

Nell'esempio modificato seguente dello script predefinito viene usato il flag di stringa __ProviderArchitecture per richiedere l'accesso ai dati del Registro di sistema a 32 bit in un computer a 64 bit. Il chiamante è connesso all'hive a 32 bit indipendentemente dal fatto che sia un'applicazione a 32 o a 64 bit.

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

Esempio: Forzare WMI ad accedere all'Hive del Registro di sistema a 32 bit in un computer a 64 bit

La modifica seguente dello script precedente aggiungendo i flag di __ProviderArchitecture e __RequiredArchitecture al parametro di contesto forza WMI a caricare il provider a 32 bit e ottenere dati a 32 bit. Se il provider non esiste, si verifica un errore di caricamento del provider. L'oggetto context deve essere fornito nella connessione a WMI chiamando 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

Recupero e fornitura di dati in un computer a 64 bit