Invoke-Command和查询直接区别

时间:2018-01-30 08:12:03

标签: powershell wmi rpc powershell-remoting

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

以下代码正在运行(已取代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协议。有人知道怎么检查吗?没有找到任何可以通过谷歌工作的东西...

看起来很特别:

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

Get-CimInstance -ComputerName "ccccc" -ClassName Win32_OperatingSystem

1 个答案:

答案 0 :(得分:3)

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

  

错误
  netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=yes
  防火墙问题或服务器不可用。

     

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

     

<强>解决方案
  连接到Vista:Get-WmiObject。连接到下层:允许&#34;远程管理&#34; Windows防火墙中的规则。

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

DCOM protocol基于RPC,并使用端点135 / tcp作为RPC终结点映射器,然后为实际的RPC连接分配1024和65535之间的随机端口。另一方面,WinRM仅使用两个端口中的一个:5985用于HTTP连接,5986用于HTTPS连接,因此它具有更多防火墙友好性,并且启用WinRM / PowerShell远程处理已经打开了端口防火墙。这很可能是Get-CimInstanceGet-WmiObject工作的原因,而<div id="wrapper" ng-app="accessPoints" ng-controller="RootController **as $root**"> 没有。

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