Windows

在 Powershell 控制台中執行的 WMI 查詢在 32 位模式下產生的結果少於在 64 位模式下產生的結果

  • May 25, 2016

如果我在 32 位 PowerShell 控制台中執行此查詢gwmi -Class Win32_PerfFormattedData_NETFramework_NETCLRMemory比在 64 位控制台中執行它,它給出的結果更少。看起來後台程序(如服務)是僅以 64 位顯示的程序。這不是 PowerShell 獨有的,我在 C# 和 F# 中都得到了相同的不一致結果。我在使用的一些監控工具中也遇到了這個問題。

這裡發生了什麼?如何使 32 位模式正常工作?

從StackOverflow 的這個答案中採用JPBlanc的解決方案

# 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_PerfFormattedData_NETFramework_NETCLRMemory"
$oQuery = New-Object System.Management.ObjectQuery ($queryString)
$oSearcher = New-Object System.Management.ManagementObjectSearcher ($mScope, $oQuery)
$oResult = $oSearcher.Get();

$oResult.Name      # only for simple check that current code snippet gives 
                  # the same results from both 32 and 64 -bit version of PowerShell

在 64 位平台上請求 WMI 數據

預設情況下,當存在兩個版本的提供程序時,應用程序或腳本會從相應的提供程序接收數據。32 位提供程序將數據返回給 32 位應用程序,包括所有腳本,而 64 位提供程序將數據返回給 64 位編譯應用程序。但是,應用程序或腳本可以通過方法呼叫上的標誌通知 WMI,從非預設提供程序(如果存在)請求數據。

上下文標誌和字元串標誌具有__ProviderArchitecture__RequiredArchitecture組由 WMI 處理但未在 SDK 標頭檔或類型庫文件中定義的值。這些值被放置在一個上下文參數中,以向 WMI 發出它應該從非預設提供程序請求數據的信號。
下面列出了標誌及其可能的值。

  • __ProviderArchitecture整數值,32 或 64,指定 32 位或 64 位版本。
  • __RequiredArchitecture``__ProviderArchitecture用於強制載入指定提供程序版本的布爾值。如果版本不可用,則 WMI 將返回錯誤 0x80041013wbemErrProviderLoadFailure對於 Visual Basic 和 WBEM_E_PROVIDER_LOAD_FAILURE對於 C++。未指定時,此標誌的預設值為FALSE.

在具有並行版本提供程序的 64 位系統上,32 位應用程序或腳本自動從 32 位提供程序接收數據,除非提供這些標誌並指示 64 位提供程序數據應該被退回。

引用自:https://serverfault.com/questions/779022