Compartir a través de


Solicitud de datos WMI en una plataforma de 64 bits

De forma predeterminada, una aplicación o script recibe datos del proveedor correspondiente cuando existen dos versiones de proveedores. El proveedor de 32 bits devuelve datos a una aplicación de 32 bits, incluidos todos los scripts, y el proveedor de 64 bits devuelve datos a las aplicaciones compiladas de 64 bits. Pero una aplicación o script puede solicitar datos del proveedor no predeterminado, si existe, al notificar a WMI mediante marcas en llamadas de método.

Marcas de contexto

Las marcas de cadena __ProviderArchitecture y __RequiredArchitecture tienen un conjunto de valores administrados por WMI, pero que no están definidos en los archivos de biblioteca de tipos o encabezados del SDK. Los valores se colocan en un parámetro de contexto para indicar a WMI que debe solicitar datos del proveedor no predeterminado.

Ahora se enumeran las marcas y sus valores posibles.

__ProviderArchitecture

Valor entero, ya sea 32 o 64, que especifica la versión de 32 o 64 bits.

__RequiredArchitecture

Valor booleano usado además de __ProviderArchitecture para forzar la carga de la versión del proveedor especificada. Si la versión no está disponible, WMI devuelve el error 0x80041013, wbemErrProviderLoadFailure para Visual Basic y WBEM_E_PROVIDER_LOAD_FAILURE para C++. El valor predeterminado de esta marca cuando no se especifica es FALSE.

En un sistema de 64 bits que tiene versiones en paralelo de un proveedor, una aplicación o script de 32 bits recibe automáticamente datos del proveedor de 32 bits, a menos que se proporcionen estas marcas e se indique que se deben devolver los datos del proveedor de 64 bits.

Uso de las marcas de contexto

Las aplicaciones de C++ pueden usar la interfaz IWbemContext con IWbemServices::ExecMethod para comunicar el uso de un proveedor no predeterminado a WMI.

En scripting y Visual Basic, debe crear un objeto SWbemNamedValueSet que contenga las marcas para el parámetro objWbemNamedValueSet de SWbemServices.ExecMethod. Para obtener más información sobre cómo establecer los objetos de parámetro para esta llamada, vea Construcción de objetos InParameters y análisis de objetos OutParameters.

Puede ejecutar scripts y aplicaciones de forma segura mediante las marcas de contexto en sistemas operativos anteriores, ya que WMI los omite en los sistemas en los que no se implementan. Aunque existen versiones de 32 y 64 bits del proveedor del registro del sistema, tenga en cuenta que solo existe una versión del repositorio WMI.

Acceso al subárbol del registro predeterminado

En la serie de ejemplos siguiente se usa el proveedor del registro, que tiene versiones de 32 bits y 64 bits preinstaladas en sistemas operativos de 64 bits. En estos ejemplos, los clientes de 32 bits obtienen los datos devueltos por el proveedor desde el nodo de 32 bits HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. Los clientes de 64 bits obtienen los datos devueltos por el proveedor desde el nodo de 64 bits HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.

Los scripts muestran cómo llamar a los métodos de la clase StdRegProv del registro mediante SWbemServices.ExecMethod para obtener datos del subárbol del registro de 32 bits.

El script siguiente devuelve datos del proveedor que coinciden con el ancho de bits del autor de la llamada, en este caso 64 bits, porque es un script que se ejecuta en Windows Script Host (WSH) de 64 bits. El script obtiene el valor del nodo del registro de 64 bits HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging en lugar del nodo de 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 el valor Logging del subárbol predeterminado se establece en 1, la salida del script debe tener un aspecto similar a este:

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

Ejemplo: Solicitud específica del subárbol del registro de 32 bits en un equipo de 64 bits

En este ejemplo modificado del script predeterminado se usa la marca de cadena __ProviderArchitecture para solicitar acceso a los datos del registro de 32 bits en un equipo de 64 bits. El autor de la llamada está conectado al subárbol de 32 bits independientemente de si es una aplicación de 32 o 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

Ejemplo: Imposición sobre WMI para acceder al subárbol del registro de 32 bits en un equipo de 64 bits

Esta modificación del script anterior que se realiza al agregar las marcas __ProviderArchitecture y __RequiredArchitecture al parámetro de contexto obliga a WMI a cargar el proveedor de 32 bits y obtener datos de 32 bits. Si el proveedor no existe, se produce un error de carga del proveedor. El objeto de contexto debe proporcionarse en la conexión a WMI mediante una llamada a 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

Obtener y proporcionar datos en un equipo de 64 bits