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

时间:2012-07-04 14:18:08

标签: powershell

当我跑步时

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)

18 个答案:

答案 0 :(得分:31)

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

或者在Administrative Command / Powershell提示符下运行:

netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes

答案 1 :(得分:13)

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

您的错误是:

  

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}}
}

答案 2 :(得分:11)

可能是由于各种问题。我不能说你的案件中有哪一个。

下面给出的原因可能是:

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

一些与WMI相关的服务如下:

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

对于DCOM设置,请参阅:

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

该值应设置为“Y”。

答案 3 :(得分:2)

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

所以而不是:

Get-WmiObject win32_SystemEnclosure -ComputerName $hostname -Authentication Negotiate

使用此:

Invoke-Command -ComputerName $hostname -Authentication Negotiate -ScriptBlock {Get-WmiObject win32_SystemEnclosure}

答案 4 :(得分:1)

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

ForEach ($_ in $Servers) { Write-Host "Host $($_)" | Get-WmiObject win32_SystemEnclosure -Computer $_ | format-table -auto @{Label="Service Tag"; Expression={$_.serialnumber}}
}

答案 5 :(得分:1)

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

  • Windows Management Instrumentation(WMI-In)
  • Distribiuted Transaction Coordinator(RPC)
  • Distribiuted Transaction Coordinator(RPC-EPMAP)

答案 6 :(得分:1)

解决。

尝试针对配置为在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)'规则已启用 AND 确保“远程地址”'财产是'任何'或更安全的东西。
  • 确认私人/公共入站' Windows Management Instrumentation(WMI-In)'规则已启用 AND 确保“远程地址”'财产是'任何'或更安全的东西。

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

  • 确认私人/公共入站' Windows管理 仪表(ASync-In)'规则已启用 AND 确保 '远程地址'财产是'任何'或更安全的东西。
  • 打开入站TCP端口为5985

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

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

答案 7 :(得分:1)

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

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

然后考虑其他常见原因来获取此错误:

  • 远程机器关闭
  • 您指定了无效的计算机名称
  • 您与目标计算机之间存在网络连接问题

答案 8 :(得分:1)

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

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

答案 9 :(得分:0)

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

 psexec @firewallFix.txt -d netsh advfirewall firewall 
        set rule name="Windows Management Instrumentation (WMI-In)" 
        profile=domain new enable=yes profile=domain

答案 10 :(得分:0)

关闭防火墙解决了它。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

下面是投票最多的解决方案的本机PowerShell命令。 代替: netsh advfirewall防火墙设置规则组=“ Windows Management Instrumentation(WMI)”新enable =是

使用可以使用以下更简单的语法:

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

答案 14 :(得分: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]

答案 15 :(得分:0)

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

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

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

答案 16 :(得分:-1)

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

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

答案 17 :(得分:-2)

我犯了这个错误

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

当然,无法传递,因为csv文件中服务器的输出是@ {Name = hv1g.contoso.com}

我必须从csv文件中调用属性,如$ server.Name

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

它解决了我的问题。