在 Powershell 控制台中运行的 WMI 查询在 32 位模式下产生的结果比 64 位模式下少

在 Powershell 控制台中运行的 WMI 查询在 32 位模式下产生的结果比 64 位模式下少

如果我在 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 将返回错误 0x80041013wbemErrProviderLoadFailure对于 Visual Basic 和 WBEM_E_PROVIDER_LOAD_FAILUREC++)。未指定此标志时,其默认值为FALSE

在具有提供程序并行版本的 64 位系统上,32 位应用程序或脚本会自动从 32 位提供程序接收数据,除非提供了这些标志并指示应返回 64 位提供程序数据。

相关内容