如果我在 32 位 PowerShell 控制台中运行此查询,则它gwmi -Class Win32_PerfFormattedData_NETFramework_NETCLRMemory
给出的结果比在 64 位控制台中少。看起来后台进程(如服务)只显示在 64 位中。这并非 PowerShell 独有的,我在 C# 和 F# 中都得到了相同的不一致结果。我在使用的一些监控工具中也遇到了这个问题。
这是怎么回事?如何让 32 位模式正常工作?
答案1
已采用JP布兰克的解决方案来自StackOverflow 上的这个答案
# 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 位提供程序数据。