Invoke-Command 和直接查询的区别

问题描述 投票:0回答:2

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

以下代码正在运行(已替换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 :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
配合使用,但当我直接在
ComputerName
上使用
Get-WmiObject
参数时却不能吗?如前所述,对于我的所有其他服务器,这工作正常并且代码速度更快,因此我希望始终使用此代码。

到目前为止我所做的:

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

我认为问题可能是:

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

有什么特别之处:

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

Get-CimInstance -ComputerName "ccccc" -ClassName Win32_OperatingSystem
powershell wmi rpc powershell-remoting
2个回答
3
投票

Microsoft 的 WMI 故障排除指南 将错误归类为防火墙问题:

错误

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-CimInstance
Invoke-Command
之间的区别在于前者使用DCOM进行网络通信,而后者使用WinRM。有关 WMI 和 CIM 之间差异的更多信息,请参阅脚本专家博客上的文章 “我应该在 Windows PowerShell 中使用 CIM 还是 WMI”

DCOM 协议基于 RPC,并使用端口 135/tcp 作为 RPC 端点映射器,然后为实际的 RPC 连接分配 1024 到 65535 之间的随机端口。另一方面,WinRM 仅使用两个端口之一:用于 HTTP 连接的 5985 和用于 HTTPS 连接的 5986,因此它对防火墙更加友好,并且启用 WinRM/PowerShell 远程处理已经在防火墙中打开端口。这很可能就是 Invoke-Command

Get-CimInstance
 起作用,而 
Get-WmiObject
 不起作用的原因。

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


0
投票
感谢您的详细解释。

© www.soinside.com 2019 - 2024. All rights reserved.