我目前正在研究一个从服务器查询磁盘信息的脚本。我堆积了一个问题,我真的不知道这里发生了什么。愿你能帮助我。
以下代码正在运行(已取代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
参数吗?如上所述,对于我所有的其他服务器,这个工作正常,代码更快,所以我想总是使用这个代码。
到目前为止我做了什么:
我认为问题可能是:
我认为服务器上禁用了RPC协议。有人知道怎么检查吗?没有找到任何可以通过谷歌工作的东西...
看起来很特别:
CimInstance命令有效。他们也使用RPC协议,还是使用其他协议?没有找到关于那个的任何信息。这里测试的代码是:
Get-CimInstance -ComputerName "ccccc" -ClassName Win32_OperatingSystem
答案 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-CimInstance
与Invoke-Command
和Invoke-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-CimInstance
和Get-WmiObject
工作的原因,而<div id="wrapper" ng-app="accessPoints" ng-controller="RootController **as $root**">
没有。
对于被禁用的RPC协议:这是不可能的。 Windows严重依赖RPC进行内部通信。如果你实际上禁用了协议,Windows就会停止工作。