다음을 통해 공유


64비트 플랫폼에서 WMI 데이터 요청

기본적으로 애플리케이션 또는 스크립트는 두 가지 버전의 공급자가 있는 경우 해당 공급자로부터 데이터를 받습니다. 32비트 공급자는 모든 스크립트를 포함하여 32비트 애플리케이션에 데이터를 반환하고 64비트 공급자는 64비트 컴파일된 애플리케이션에 데이터를 반환합니다. 그러나 애플리케이션 또는 스크립트는 메서드 호출에 대한 플래그를 통해 WMI에 알리면 기본이 아닌 공급자(있는 경우)의 데이터를 요청할 수 있습니다.

컨텍스트 플래그

__ProviderArchitecture__RequiredArchitecture 문자열 플래그에는 WMI에서 처리되지만 SDK 헤더 또는 형식 라이브러리 파일에는 정의되지 않은 값 집합이 있습니다. 값은 컨텍스트 매개 변수에 배치되어 기본이 아닌 공급자로부터 데이터를 요청해야 한다는 신호를 WMI에 보냅니다.

플래그와 그것의 가능한 값을 나열하면 다음과 같습니다.

__ProviderArchitecture

32비트 또는 64비트 버전을 지정하는 정수 값(32 또는 64)입니다.

__RequiredArchitecture

지정된 공급자 버전을 강제로 로드하는 __ProviderArchitecture 외에도 사용되는 부울 값입니다. 해당 버전을 사용할 수 없는 경우, WMI는 오류 0x80041013, Visual Basic 의 경우 wbemErrProviderLoadFailure, C++의 경우 WBEM_E_PROVIDER_LOAD_FAILURE를 반환합니다. 지정하지 않은 경우 이 플래그의 기본값은 FALSE입니다.

공급자의 병렬 버전이 있는 64비트 시스템에서 32비트 애플리케이션 또는 스크립트는 64비트 공급자 데이터를 반환해야 함을 나타내는 이러한 플래그를 제공하지 않는 한, 32비트 공급자로부터 데이터를 자동으로 수신합니다.

컨텍스트 플래그 사용

C++ 애플리케이션은 IWbemServices::ExecMethod와 함께 IWbemContext 인터페이스를 사용하여 기본이 아닌 공급자의 사용을 WMI에 전달할 수 있습니다.

스크립팅 및 Visual Basic에서는 SWbemServices.ExecMethodobjWbemNamedValueSet 매개 변수에 대한 플래그를 포함하는 SWbemNamedValueSet 개체를 만들어야 합니다. 이 호출에 대한 매개 변수 개체를 설정하는 방법에 관한 자세한 내용은 InParameters 개체 생성 및 OutParameters 개체 구문 분석을 참조하세요.

WMI는 스크립트와 애플리케이션이 구현되지 않은 시스템에서 그것을 무시하므로 이전 운영 체제의 컨텍스트 플래그를 사용하여 스크립트 및 애플리케이션을 안전하게 실행할 수 있습니다. 32비트 및 64비트 버전의 시스템 레지스트리 공급자가 있는 동안에는 WMI 리포지토리의 버전이 하나만 존재합니다.

기본 레지스트리 Hive에 액세스

다음 일련의 예제에서는 64비트 운영 체제에 미리 설치된 병렬 32비트 및 64비트 버전이 있는 레지스트리 공급자를 사용합니다. 이러한 예제에서 32비트 클라이언트는 32비트 노드 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft에서 공급자가 반환한 데이터를 가져옵니다. 64비트 클라이언트는 64비트 노드 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging에서 공급자가 반환한 데이터를 가져옵니다.

스크립트는 SWbemServices.ExecMethod를 통해 레지스트리 StdRegProv 클래스의 메서드를 호출하여 32비트 레지스트리 하이브에서 데이터를 가져오는 방법을 보여줍니다.

다음 스크립트는 64비트 WSH(Windows Script Host)에서 실행되는 스크립트이므로 호출자의 비트 너비(이 경우 64비트)와 일치하는 데이터를 공급자로부터 다시 가져옵니다. 스크립트는 32비트 노드 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WBEM\CIMOM이 아닌 64비트 레지스트리 노드 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging에서 값을 가져옵니다.

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

기본 하이브의 로깅 값이 1로 설정된 경우 스크립트의 출력은 다음과 같이 표시됩니다.

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

예: 특히 64비트 컴퓨터에서 32비트 레지스트리 하이브 요청

기본 스크립트의 수정된 다음 예제에서는 __ProviderArchitecture 문자열 플래그를 사용하여 64비트 컴퓨터의 32비트 레지스트리 데이터에 대한 액세스를 요청합니다. 호출자는 32비트 또는 64비트 애플리케이션인지 여부에 관계없이 32비트 하이브에 연결됩니다.

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

예: 64비트 컴퓨터에서 WMI가 32비트 레지스트리 하이브에 액세스하도록 강제 적용

컨텍스트 매개 변수에 __ProviderArchitecture__RequiredArchitecture 플래그를 추가하여 위의 스크립트를 다음과 같이 수정하면 WMI가 32비트 공급자를 로드하고 32비트 데이터를 가져옵니다. 공급자가 없으면 공급자 로드 오류가 발생합니다. 컨텍스트 개체는 SWbemLocator.ConnectServer를 호출하여 WMI에 대한 연결에서 제공해야 합니다.

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

64비트 컴퓨터에서 데이터 가져오기 및 제공