64 ビット プラットフォームでの WMI データの要求
既定では、アプリケーションまたはスクリプトは、2 つのバージョンのプロバイダーが存在する場合に、対応するプロバイダーからデータを受信します。 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.ExecMethod の objWbemNamedValueSet パラメーターのフラグを含む SWbemNamedValueSet オブジェクトを作成する必要があります。 この呼び出しのパラメーター オブジェクトの値の設定の詳細については、「InParameters オブジェクトの構築と OutParameters オブジェクトの解析」を参照してください。
スクリプトとアプリケーションは、古いオペレーティング システムでコンテキスト フラグを使用して安全に実行できます。WMI では、スクリプトとアプリケーションが実装されていないシステムでそれらは無視されるためです。 システム レジストリ プロバイダーの 32 ビットバージョンと 64 ビット バージョンが存在しますが、WMI リポジトリのバージョンは 1 つだけであることに注意してください。
既定のレジストリ ハイブへのアクセス
次の一連の例では、64 ビット オペレーティング システムにサイド バイ サイドの 32 ビット バージョンと 64 ビット バージョンがプレインストールされたレジストリ プロバイダーを使用します。 これらの例では、32 ビット クライアントは、32 ビット ノード HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft からプロバイダーによって返されるデータを取得します。 64 ビット クライアントは、64 ビット ノード HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging からプロバイダーから返されるデータを取得します。
スクリプトは、SWbemServices.ExecMethod を介して Registry StdRegProv クラスのメソッドを呼び出して、32 ビット レジストリ ハイブからデータを取得する方法を示しています。
次のスクリプトは、64 ビットの Windows スクリプト ホスト (WSH) で実行されているスクリプトであるため、呼び出し元のビット幅 (この場合は 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
例: WMI で 64 ビット コンピューター上の 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
関連トピック