Windows
在 Powershell 控制台中執行的 WMI 查詢在 32 位模式下產生的結果少於在 64 位模式下產生的結果
如果我在 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 將返回錯誤0x80041013
,wbemErrProviderLoadFailure
對於 Visual Basic 和WBEM_E_PROVIDER_LOAD_FAILURE
對於 C++。未指定時,此標誌的預設值為FALSE
.在具有並行版本提供程序的 64 位系統上,32 位應用程序或腳本自動從 32 位提供程序接收數據,除非提供這些標誌並指示 64 位提供程序數據應該被退回。