49

当我跑

Get-WmiObject win32_SystemEnclosure -Computer hostname | select serialnumber

它适用于本地和远程主机。

当我为使用的主机列表执行此操作时

ForEach ($_ in gc u:\pub\list.txt) {
    Get-WmiObject win32_SystemEnclosure -Computer $_ | select serialnumber | format-table -auto @{Label="Hostname"; Expression={$_}}, @{Label="Service Tag"; Expression={$_.serialnumber}}
}

它返回

Get-WmiObject : RPC 服务器不可用。(来自 HRESULT 的异常:0x800706BA)

4

20 回答 20

41

检查是否在防火墙中为每台远程计算机启用了“Windows Management Instrumentation (WMI-In)”规则。

或者在管理命令/Powershell 提示符下运行:

netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes
于 2012-07-05T05:45:13.257 回答
18

这可能是由于各种问题。我不能说你的情况是哪一个。

以下给出的原因可能存在:

  • DCOM 未在主机 PC 或目标 PC 或两者上启用。
  • 您的防火墙甚至您的防病毒软件都在阻止访问。
  • 任何与 WMI 相关的服务都被禁用。

一些 WMI 相关服务如下所示:

  • 远程访问自动连接管理器
  • 远程访问连接管理器
  • 远程过程调用 (RPC)
  • 远程过程调用 (RPC) 定位器
  • 远程注册表

有关 DCOM 设置,请参阅:

  • 键:HKLM\Software\Microsoft\OLE,值:EnableDCOM

该值应设置为 'Y' 。

于 2012-07-05T06:26:58.697 回答
16

您的代码可能没有使用正确的机器名称,您应该仔细检查。

你的错误是:

Get-WmiObject : RPC 服务器不可用。(来自 HRESULT 的异常:0x800706BA)

这是您在无法访问机器时得到的结果。所以防火墙建议是合理的,但在这种情况下可能不正确,因为你说这有效:

Get-WmiObject win32_SystemEnclosure -Computer hostname

因此,在您的情况下,执行此行时似乎:

Get-WmiObject win32_SystemEnclosure -Computer $_

$_ 不包含正确的计算机名称。您可以检查 $_ 的类型和内容。可能是文件内容有问题。如果文件看起来正确,那么可能这些行没有正确终止。也许使用 Write-Host 仔细看看:

ForEach ($_ in gc u:\pub\list.txt) {
    Write-Host "Get-WmiObject win32_SystemEnclosure -Computer '$_'"
    Get-WmiObject win32_SystemEnclosure -Computer $_ | select serialnumber | format-table -auto @{Label="Hostname"; Expression={$_}}, @{Label="Service Tag"; Expression={$_.serialnumber}}
}
于 2015-06-09T22:15:01.057 回答
10

我遇到了同样的问题,但只有几台机器。我发现使用 Invoke-Command 在远程服务器上运行相同的命令是有效的。

所以而不是:

Get-WmiObject win32_SystemEnclosure -ComputerName $hostname -Authentication Negotiate

用这个:

Invoke-Command -ComputerName $hostname -Authentication Negotiate -ScriptBlock {Get-WmiObject win32_SystemEnclosure}
于 2017-09-04T04:12:22.110 回答
3

如果您尝试过其他答案中的一些建议,最值得注意的是:

  • David Brabant 的回答:确认Windows Management Instrumentation (WMI)入站防火墙规则已启用
  • Abhi_Mishra 的回答:确认注册表中启用了 DCOM

然后考虑出现此错误的其他常见原因:

  • 远程机器关闭
  • 您指定了无效的计算机名称
  • 您和目标计算机之间存在网络连接问题
于 2014-11-04T00:18:41.127 回答
3

解决了。

尝试对配置为在 WORKGROUP 中的远程 VM 执行以下脚本(部分)时,我遇到了完全相同的错误消息。

Restart-Computer -ComputerName MyComputer -Authentication Default -Credential $cred -force

我注意到当我禁用防火墙时,我可以从同一个 WORKGROUP 中的另一个 VM 运行脚本,但仍然无法从域上的机器上执行此操作。这两件事以及 Stackflow 的建议使我得到了以下解决方案:

注意:更改这些设置需要您自担风险。在应用这些更改之前,您应该了解这些更改的安全含义。

在远程机器上:

  • 如果您在测试期间禁用了防火墙,请确保重新启用它。
  • 从 PowerShell 成功运行 Enable-PSRemoting
  • 进入 wf.msc(具有高级安全性的 Windows 防火墙)
  • 确认启用了私有/公共入站“ Windows Management Instrumentation (DCOM-In) ”规则确保“远程地址”属性为“任意”或更安全。
  • 确认启用了私有/公共入站“ Windows Management Instrumentation (WMI-In) ”规则确保“远程地址”属性为“任何”或更安全。

可选:如果要运行“ Enter-PSSession ”等命令,您可能还需要执行以下操作。

  • 确认启用了私有/公共入站“ Windows Management Instrumentation (ASync-In) ”规则并确保“远程地址”属性为“任何”或更安全。
  • 打开一个到 5985 的入站 TCP 端口

重要的!- 我的远程虚拟机在重新启动后需要大约 2 分钟左右才能响应“Enter-PSSession”命令,即使其他网络服务正在启动而没有问题。给它几分钟,然后尝试。

旁注:在我将“远程地址”属性更改为“任何”之前,两个规则都设置为“本地子网”。

于 2015-09-16T22:29:10.537 回答
2

我发现这篇博客文章建议为“远程管理”添加防火墙例外,这对我们的 Windows Server 2008 Enterprise 系统有效。

http://mikefrobbins.com/2012/03/08/get-wmiobject-the-rpc-server-is-unavailable-exception-from-hresult-0x800706ba/

于 2014-04-12T00:03:37.947 回答
2

在目标系统上启用以下 FW 规则解决了 Win2k16 上的问题:

  • Windows 管理规范 (WMI-In)
  • 分布式事务协调器 (RPC)
  • 分布式事务协调器 (RPC-EPMAP)
于 2016-11-25T09:50:34.433 回答
1

我在使用 foreach 时遇到了同样的问题。我将列表保存到 $servers 并使用了这个有效的:

ForEach ($_ in $Servers) { Write-Host "Host $($_)" | Get-WmiObject win32_SystemEnclosure -Computer $_ | format-table -auto @{Label="Service Tag"; Expression={$_.serialnumber}}
}
于 2016-09-21T14:46:13.970 回答
0

我想我会补充一点,我们域中的多台机器也遇到了这个问题。我创建了一个违规机器列表,并将它们全部添加到一个文本文件中,从中运行脚本。我使用提升的权限从 CMD 提示符运行它。

 psexec @firewallFix.txt -d netsh advfirewall firewall 
        set rule name="Windows Management Instrumentation (WMI-In)" 
        profile=domain new enable=yes profile=domain
于 2015-01-08T15:45:37.727 回答
0

下面是投票率最高的解决方案的原生 PowerShell 命令。而不是:netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes

使用可以使用稍微简单的语法:

Enable-NetFirewallRule -DisplayGroup "Windows Management Instrumentation (WMI-In)"

于 2020-03-25T12:04:18.800 回答
0

很奇怪,但我使用了 IP 地址(与主机名相比),它对我有用。

Get-WmiObject -Computername MyHostName ...  
 [Fails: Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)]

Get-WmiObject -Computername 50.50.50.50
 [Successful]
于 2020-12-12T19:47:29.823 回答
0

我有同样的问题,对我来说,我试图使用 IP 地址而不是计算机名称。只需将此添加为人们在路上发现此问题的另一种潜在解决方案。

于 2019-05-29T19:19:33.303 回答
0

我想我会添加另一件事来尝试。如果某人有多个域,您可以尝试使用完全限定的域名:computer1.subdomain.domain.com

于 2021-09-22T08:30:44.120 回答
0

我在通过 vCenter api 通过自动化脚本构建的新服务器上遇到了类似的问题。看起来“远程过程调用 (RPC)”服务可能未在远程计算机上运行。您需要等待服务启动才能使用 Get-WmiObject 命令。因此,我只是让脚本进入睡眠状态一段时间,它就起作用了。

于 2019-03-15T05:56:49.310 回答
0

我遇到了相同的“HRESULT 异常:0x800706BA”错误get-wmiobject -computerName remoteserverName -class win32_logicaldisk。在我的例子中,远程服务器是一个 AWS EC2 实例。Windows 服务器防火墙打开了 WMI 端口。附加到 EC2 实例的 SecurityGroup 具有允许入站的通用 RPC 端口(tcp/udp 135-139、49152 - 65535)。

然后我netstat -a -b |findstr remoteServerName在启动get-wmiobjectpowershell 命令后运行。原来该命令正在尝试访问远程服务器上的 tcp 端口 6402!将 tcp 6402 添加到其安全组入站规则后,get-wmiobject 完美运行!看来远程服务器已将 WMI 设置为固定端口!

因此,如果您检查了所有常用的防火墙规则,但仍然遇到 WMI 问题,请尝试使用 netstat 来确定该命令实际尝试访问的端口。

于 2021-02-21T10:24:33.227 回答
0

RPC 客户端-服务器通信将使用端口 135。

因此,请确保端口 135 未被本地防火墙阻止。这可能是不工作的原因之一。

这是一个可以帮助您的链接:https ://www.dell.com/support/kbdoc/en-in/000179474/troubleshooting-rpc-server-unavailable-errors

于 2021-11-10T10:43:57.427 回答
-1

关闭防火墙为我解决了这个问题。

于 2014-01-23T21:13:13.330 回答
-1

我犯了这个错误

ForEach ($server in $servers) {
$OS = Get-WmiObject win32_operatingsystem -ComputerName $server
}

当然,不能通过,因为 csv 文件中服务器的输出是 @{Name=hv1g.contoso.com}

我不得不像这样 $server.Name 从 csv 文件中调用该属性

ForEach ($server in $servers) {
$OS = Get-WmiObject win32_operatingsystem -ComputerName $server.Name
}

它解决了我的问题。

于 2016-11-30T13:43:36.500 回答
-2

我刚刚遇到了完全相同的问题,并在这里找到了答案:http: //powershellcommunity.org/Forums/tabid/54/aft/7537/Default.aspx

我在输入文件的每一行末尾都有空格字符。如果您的文件也是如此,只需删除它们,您的脚本就可以工作了。

于 2012-09-19T08:50:36.750 回答