Partilhar via


Solicitando dados WMI em uma plataforma de 64 bits

Por padrão, um aplicativo ou script recebe dados do provedor correspondente quando existem duas versões de provedores. O provedor de 32 bits retorna dados para um aplicativo de 32 bits, incluindo todos os scripts, e o provedor de 64 bits retorna dados para os aplicativos compilados de 64 bits. No entanto, um aplicativo ou script pode solicitar dados do provedor não padrão, se existir, notificando o WMI por meio de sinalizadores em chamadas de método.

Sinalizadores de contexto

Os sinalizadores de cadeia de caracteres __ProviderArchitecture e __RequiredArchitecture têm um conjunto de valores manipulados pelo WMI, mas não definidos no cabeçalho do SDK ou nos arquivos da biblioteca de tipos. Os valores são colocados em um parâmetro de contexto para sinalizar ao WMI que ele deve solicitar dados do provedor não padrão.

A seguir estão listados os sinalizadores e seus valores possíveis.

__ProviderArchitecture

Valor inteiro, 32 ou 64, que especifica a versão de 32 bits ou 64 bits.

__ArquiteturaObrigatória

Valor booleano usado além de __ProviderArchitecture para forçar o carregamento da versão do provedor especificado. Se a versão não estiver disponível, o WMI retornará o erro 0x80041013, wbemErrProviderLoadFailure para Visual Basic e WBEM_E_PROVIDER_LOAD_FAILURE para C++. O valor padrão para esse sinalizador quando ele não é especificado é FALSE.

Em um sistema de 64 bits que tem versões lado a lado de um provedor, um aplicativo ou script de 32 bits recebe automaticamente dados do provedor de 32 bits, a menos que esses sinalizadores sejam fornecidos e indiquem que os dados do provedor de 64 bits devem ser retornados.

Usando os sinalizadores de contexto

Os aplicativos C++ podem usar a interface IWbemContext com IWbemServices::ExecMethod para comunicar o uso de um provedor não padrão ao WMI.

Em scripts e Visual Basic, você deve criar um SWbemNamedValueSet objeto contendo os sinalizadores para o objWbemNamedValueSet parâmetro de SWbemServices.ExecMethod. Para obter mais informações sobre como configurar os objetos de parâmetros para esta chamada, consulte Constructing InParameters Objects e Parsing OutParameters Objects.

Você pode executar scripts e aplicativos com segurança usando os sinalizadores de contexto em sistemas operacionais mais antigos, porque o WMI os ignora em sistemas nos quais eles não são implementados. Embora existam versões de 32 bits e 64 bits do provedor do Registro do Sistema, observe que existe apenas uma versão do repositório WMI.

Acessando o Hive do Registro Padrão

A série de exemplos a seguir usa o Registry Provider, que tem versões lado a lado de 32 bits e 64 bits pré-instaladas em sistemas operacionais de 64 bits. Nesses exemplos, os clientes de 32 bits recebem dados de volta pelo provedor do nó de 32 bits HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. Os clientes de 64 bits recebem os dados devolvidos pelo provedor a partir do nó de 64 bits HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.

Os scripts mostram como chamar os métodos do Registro classe de StdRegProv por meio SWbemServices.ExecMethod obter dados da seção do Registro de 32 bits.

O script a seguir recebe dados do provedor que correspondem à largura de bits do chamador, neste caso 64 bits, porque é um script executado sob o WSH (Windows Script Host) de 64 bits. O script obtém o valor do nó do Registro de 64 bits HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging em vez do nó 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

Se o valor Logging no hive padrão estiver definido como 1, a saída do script deverá ter a seguinte aparência:

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

Exemplo: Solicitando especificamente o hive do Registro de 32 bits em um computador de 64 bits

O exemplo modificado a seguir do script padrão utiliza o sinalizador de cadeia de caracteres __ProviderArchitecture para solicitar acesso aos dados do registo de 32 bits num computador de 64 bits. O chamador está conectado ao hive de 32 bits, independentemente de ser um aplicativo de 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

Exemplo: Forçando o WMI a acessar o hive do Registro de 32 bits em um computador de 64 bits

A seguinte modificação do script acima, ao adicionar os sinalizadores __ProviderArchitecture e __RequiredArchitecture ao parâmetro context, força o WMI a carregar o provedor de 32 bits e a obter dados de 32 bits. Se o provedor não existir, ocorrerá um erro de carregamento do provedor. O objeto de contexto deve ser fornecido na conexão com o WMI chamando 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

Obtendo e fornecendo dados em um computador de 64 bits