【问题标题】:Difference between Invoke-Command and query directlyInvoke-Command 和直接查询的区别
【发布时间】:2018-07-09 01:29:16
【问题描述】:

我目前正在编写一个从服务器查询磁盘信息的脚本。我遇到了一个问题,我真的不知道这里发生了什么。愿你能帮助我。

以下代码正在运行(计算机名已替换):

$space1 = Invoke-Command -ComputerName "xxxxxx" -ScriptBlock {
    Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='C:'"
}

此代码运行良好,可能需要大约 2 秒才能执行。 经过一些试验,我找到了一种可以更快地查询它的方法。对于所有其他服务器,它可以正常工作,但对于此服务器,它根本不起作用。这是代码:

$space1 = Get-WmiObject -ComputerName "xxxxxx" -Class Win32_LogicalDisk -Filter "DeviceID='C:'"

此代码运行大约需要 40 秒,然后以以下错误结束:

Get-WmiObject : RPC 服务器不可用。 (HRESULT 的例外情况: 0x800706BA) 在行:1 字符:10 + $test1 = Get-WmiObject -ComputerName "xxxxxx" -Class Win32_LogicalD ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException + FullyQualifiedErrorId:GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

有人可以向我解释为什么它可以很好地与Invoke-Command 一起使用,但当我直接在Get-WmiObject 上使用ComputerName 参数时却不行?如前所述,对于我所有的其他服务器,这工作正常,代码更快,所以我想一直使用这个代码。

到目前为止我做了什么:

  • 我检查了服务器的 DNS 并测试了类似的命令。
  • 尝试了其他一些 WmiObject 命令,似乎总是 RPC 不可用。

我认为问题可能是:

我认为服务器上的 RPC 协议已禁用。有人知道如何检查吗?还没有找到真正通过 Google 工作的东西...

看起来很特别:

CimInstance 命令有效。他们是否也使用 RPC 协议,还是使用其他协议?没有找到关于那个的任何信息。这里是我测试的代码:

Get-CimInstance -ComputerName "ccccc" -ClassName Win32_OperatingSystem

【问题讨论】:

  • 我看起来像是 COM 的权限问题。

标签: powershell wmi rpc powershell-remoting


【解决方案1】:

微软的WMI troubleshooting guide将该错误归类为防火墙问题:

错误
0x800706BA–HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE)
防火墙问题或服务器不可用。

可能的问题
计算机确实不存在 Windows 防火墙阻止了连接

解决方案
连接到 Vista:netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=yes。连接到下层:允许 Windows 防火墙中的“远程管理”规则。

一方面Get-WmiObject与另一方面Get-CimInstanceInvoke-Command的区别在于前者使用DCOM进行网络通信,而后者使用WinRM。有关 WMI 和 CIM 之间差异的更多信息,请参阅 Scripting Guys 博客上的文章 "Should I use CIM or WMI with Windows PowerShell"

DCOM protocol 基于 RPC,并为 RPC 端点映射器使用端口 135/tcp,然后为实际的 RPC 连接分配一个介于 1024 和 65535 之间的随机端口。另一方面,WinRM 只使用两个端口中的一个:5985 用于 HTTP 连接,5986 用于 HTTPS 连接,因此它对防火墙更加友好,并且启用 WinRM/PowerShell 远程处理已经打开了防火墙中的端口。这很可能是 Invoke-CommandGet-CimInstance 有效,而 Get-WmiObject 无效的原因。

至于 RPC 协议被禁用:这是不可能的。 Windows 严重依赖 RPC 进行内部通信。如果你真的禁用了协议,Windows 就会停止工作。

【讨论】:

  • 哇,非常感谢您的回答!真的很感激那个!真正能干且简短的回答,包含我需要的所有信息。因此,我将与防火墙人员交谈,因为我不允许自己进行此更改。我会和他们一起看看我们能做些什么。谢谢!
猜你喜欢
  • 2015-11-11
  • 2013-01-13
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多