4

x64 プロセスから Win32_WinSAT を要求すると、正しい結果 (WinSATAssessmentState = 1) が得られますが、x86 から実行すると、「結果が利用できません」 (WinSATAssessmentState = 3) が得られます。

x64 Powershell:

PS C:\Users\alive> gwmi Win32_WinSAT


__GENUS               : 2
__CLASS               : Win32_WinSAT
__SUPERCLASS          :
__DYNASTY             : Win32_WinSAT
__RELPATH             : Win32_WinSAT.TimeTaken="MostRecentAssessment"
__PROPERTY_COUNT      : 8
__DERIVATION          : {}
__SERVER              : COMPNAME
__NAMESPACE           : root\cimv2
__PATH                : \\COMPNAME\root\cimv2:Win32_WinSAT.TimeTaken="MostRecentAssessment"
CPUScore              : 7,2
D3DScore              : 6,3
DiskScore             : 7,65
GraphicsScore         : 4,6
MemoryScore           : 5,9
TimeTaken             : MostRecentAssessment
WinSATAssessmentState : 1
WinSPRLevel           : 4,6
PSComputerName        : COMPNAME

x86 Powershell

PS C:\Users\alive> gwmi Win32_WinSAT


__GENUS               : 2
__CLASS               : Win32_WinSAT
__SUPERCLASS          :
__DYNASTY             : Win32_WinSAT
__RELPATH             : Win32_WinSAT.TimeTaken="MostRecentAssessment"
__PROPERTY_COUNT      : 8
__DERIVATION          : {}
__SERVER              : COMPNAME
__NAMESPACE           : root\cimv2
__PATH                : \\COMPNAME\root\cimv2:Win32_WinSAT.TimeTaken="MostRecentAssessment"
CPUScore              : 0
D3DScore              : 0
DiskScore             : 0
GraphicsScore         : 0
MemoryScore           : 0
TimeTaken             : MostRecentAssessment
WinSATAssessmentState : 3
WinSPRLevel           : 0
PSComputerName        : COMPNAME

x86 プロセスからこの情報にアクセスできるフラグまたは特別な方法はありますか?

ありがとう。

4

1 に答える 1

2

あなたの質問はRequesting WMI Data on a 64-bit Platform にあります。

デフォルトでは、2 つのバージョンのプロバイダーが存在する場合、アプリケーションまたはスクリプトは対応するプロバイダーからデータを受け取ります。32 ビット プロバイダーは、すべてのスクリプトを含む 32 ビット アプリケーションにデータを返し、64 ビット プロバイダーは、コンパイルされた 64 ビット アプリケーションにデータを返します。ただし、アプリケーションまたはスクリプトは、メソッド呼び出しのフラグを介して WMI に通知することにより、既定以外のプロバイダーが存在する場合、そのデータを要求できます。__ProviderArchitectureおよび__RequiredArchitecture文字列フラグには、WMI によって処理される値のセットがありますが、SDK ヘッダーまたはタイプ ライブラリ ファイルでは定義されていません。値はコンテキスト パラメータに配置され、既定以外のプロバイダからのデータを要求する必要があることを WMI に通知します。

PowerShell CmdLets でこれを行う方法はわかりませんが、.NET Framework (COM オブジェクトのカプセル化) の「System.Management」クラスを使用できます。

# Setup the context information
$mContext = New-Object System.Management.ManagementNamedValueCollection
$mContext.Add( "__ProviderArchitecture", 64)
$mContext.Add( "__RequiredArchitecture", $true)

# Setup the Authrntification object
$ConOptions = New-Object System.Management.ConnectionOptions
#$ConOptions.Username = "computername\administrateur" # Should be used for remote access
#$ConOptions.Password = "toto"
$ConOptions.EnablePrivileges = $true
$ConOptions.Impersonation = "Impersonate"
$ConOptions.Authentication = "Default"
$ConOptions.Context = $mContext

# Setup the management scope (change with the computer name for remote access)
$mScope = New-Object System.Management.ManagementScope("\\localhost\root\cimV2", $ConOptions)

$mScope.Connect()

# Query
$queryString = "SELECT * From Win32_WinSAT"
$oQuery = New-Object System.Management.ObjectQuery ($queryString)
$oSearcher = New-Object System.Management.ManagementObjectSearcher ($mScope, $oQuery)
$oSearcher.Get();

Windows 8 で 32 ビットと 64 ビットの PowerShell からこのスクリプト ビットを実行すると、どちらも動作します。

于 2013-10-02T05:58:52.673 に答える