Invoke-Command 和直接查询的区别

2024-01-03

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

以下代码有效(已替换 ComputerName):

$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 : The RPC server is unavailable. (Exception from HRESULT:
0x800706BA)
At line:1 char:10
+ $test1 = Get-WmiObject -ComputerName "xxxxxx" -Class Win32_LogicalD ...
+          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMException
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
  

有人可以向我解释为什么它可以正常工作吗Invoke-Command但当我使用时不是ComputerName参数在Get-WmiObject直接地?如前所述,对于我的所有其他服务器,这工作正常并且代码速度更快,因此我希望始终使用此代码。

到目前为止我所做的:

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

我认为问题可能是:

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

看起来特别的地方:

CimInstance 命令有效。他们也使用 RPC 协议,还是使用其他协议?还没找到这方面的信息。这是我测试的代码:

Get-CimInstance -ComputerName "ccccc" -ClassName Win32_OperatingSystem

微软的WMI 故障排除指南 https://msdn.microsoft.com/en-us/library/aa394603.aspx将该错误归类为防火墙问题:

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

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

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

和...之间的不同Get-WmiObject一方面和Get-CimInstance and Invoke-Command另一方面是前者使用DCOM进行网络通信,而后者使用WinRM。看文章“我应该将 CIM 或 WMI 与 Windows PowerShell 一起使用吗?” https://blogs.technet.microsoft.com/heyscriptingguy/2016/02/08/should-i-use-cim-or-wmi-with-windows-powershell/有关 WMI 和 CIM 之间差异的更多信息,请访问脚本专家博客。

The DCOM协议 https://technet.microsoft.com/en-us/library/cc161377.aspx基于 RPC,并使用端口 135/tcp 作为 RPC 端点映射器,然后为实际的 RPC 连接分配 1024 到 65535 之间的随机端口。WinRM https://blogs.msdn.microsoft.com/wmi/2009/07/22/new-default-ports-for-ws-management-and-powershell-remoting/另一方面,仅使用两个端口之一:用于 HTTP 连接的 5985 和用于 HTTPS 连接的 5986,因此它对防火墙更加友好,并且启用 WinRM/PowerShell 远程处理已经在防火墙中打开端口。这很可能就是原因Invoke-Command and Get-CimInstance工作,同时Get-WmiObject没有。

至于禁用 RPC 协议:那是不可能的。 Windows 严重依赖 RPC 进行内部通信。如果您确实禁用了该协议,Windows 将停止工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Invoke-Command 和直接查询的区别 的相关文章

随机推荐