Get-WmiObject 不能在 PowerShell (x86) 但在 PowerShell 上执行

Posted

技术标签:

【中文标题】Get-WmiObject 不能在 PowerShell (x86) 但在 PowerShell 上执行【英文标题】:Get-WmiObject can't be executed on PowerShell (x86) but on PowerShell 【发布时间】:2017-01-26 05:31:38 【问题描述】:

为什么我可以在 PowerShell 上执行以下代码,但不能在同一台计算机上的 PowerShell (x86) 上执行?

Get-WmiObject -Namespace "root\Microsoft\SqlServer\ComputerManagement13" -Class ServerSettingsGeneralFlag -Filter "FlagName='ForceEncryption'"

例外:

在 line:1 char:1
+ 获取 WmiObject -命名空间“root\Microsoft\SqlServer\ComputerManagement ...
    + CategoryInfo : NotSpecified: (:) [Get-WmiObject], FileNotFoundException
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

【问题讨论】:

我怀疑相应的命名空间或类在 32 位环境中不存在。您可以使用以下内容枚举命名空间:function List-WmiNamespaces Get-WmiObject -Namespace $args[0] -Class '__namespace' | ForEach-Object $ns = '0\1' -f $_.__Namespace, $_.Name; $ns; List-WmiNamespaces $ns; List-WmiNamespaces 'root\microsoft',以及命名空间中的类:Get-WmiObject -Namespace 'root\Microsoft\SqlServer' -List | Select-Object -Expand Name 我确实安装了 64 位 SQL Server。但是这两个脚本在 64 位和 32 位 PowerShell 上得到相同的结果。即 "root\Microsoft\SqlServer\ComputerManagement13" 和 ServerSettingsGeneralFlag 都存在。 【参考方案1】:

正如@AnsgarWiechers 所说,它可能不存在。至于为什么,可能你安装的是 64 位的 SQL Server 而不是 32 位的?

您可能能够解决此问题的一种方法是使用 PowerShell 远程处理。如果启用并配置了 PowerShell 远程处理,您可以从 32 位进程远程访问您自己的计算机,并且您将连接到 64 位实例。因此,您可以运行此代码以从 64 位会话中获取结果。

$result64 = Invoke-Command -ComputerName . -ScriptBlock 
    Get-WmiObject -Namespace "root\Microsoft\SqlServer\ComputerManagement13" -Class ServerSettingsGeneralFlag -Filter "FlagName='ForceEncryption'"

【讨论】:

你的脚本对我有用。即使@ansgar-wiechers 脚本得到相同的结果。

以上是关于Get-WmiObject 不能在 PowerShell (x86) 但在 PowerShell 上执行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Get-WmiObject 返回最新版本的 java

使用 powershell 和 Get-WmiObject 检查给定进程是不是以提升的权限运行

Get-WmiObject -Class powershell 命令在 Windows7 中不起作用

Get-WmiObject : RPC 服务器不可用。 (HRESULT 异常:0x80070 6BA

win8系统快要过期激活,输入(Get-wmiObjeCt.......PrOductkey出现不

没有使用 (Get-WmiObject -Class win32_computersystem -ComputerName $computer).UserName 获取远程用户名