【问题标题】:PowerShell | Get Storage from Servers with "Get-ADComputer"PowerShell |使用“Get-ADComputer”从服务器获取存储
【发布时间】:2020-08-31 12:59:49
【问题描述】:

我的脚本有问题,请帮助:3

这个脚本应该从我们的服务器 OU 中获取所有服务器主机名。而不是获取服务器的已用和可用空间但是当我尝试使用“Get-AdComputer”cmdlet 获取服务器列表时出现错误。

$servers = Get-ADComputer -Filter * -SearchBase "OU=SomeOU, DC=SomeDomain, DC=SomeDomain, DC=SomeDomain" | Select-Object Name

$allDisks = foreach ($server in $servers)
{
    Get-WmiObject Win32_LogicalDisk -ComputerName $server -Filter DriveType=3 | 
        Select-Object @{'Name'='ComputerName'; 'Expression'={$server}},
            DeviceID, 
            @{'Name'='Size'; 'Expression'={[math]::truncate($_.size / 1GB)}}, 
            @{'Name'='Freespace'; 'Expression'={[math]::truncate($_.freespace / 1GB)}}
            
}
$allDisks |Export-Csv C:\Servers.csv -NoTypeInformation

当我运行这个时,我得到:

Get-WmiObject : Der RPC-Server ist nicht verfügbar.
In Zeile:5 Zeichen:5
+     Get-WmiObject Win32_LogicalDisk -ComputerName $server -Filter Dri ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMException
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

我还应该补充一点,如果我只从第一行运行这个东西,我会得到一个我们所有服务器的干净列表。

【问题讨论】:

  • 你怎么会认为是Get-ADComputer-line 失败了?
  • bc 当我手动创建具有计算机名称的数组时,它可以正常工作
  • 但是失败的是你的Get-WmiObject-line,而不是 Get-ADComputer。我猜你的列表中的服务器被禁用、脱机或无法通过 RPC 访问。
  • @CruZer0 - 这是查询系统列表并处理无响应者 ... >>> 基本远程并行 SystemInfo 演示脚本的一种方法的演示 - Pastebin.com — pastebin.com/cGL5biWH

标签: windows powershell storage analysis


【解决方案1】:

由于错误表明 RPC 服务器不可用于您尝试查询的服务器之一。根据PS Blog,可能有多种原因:

远程计算机被防火墙阻止。

解决方案:打开组策略对象编辑器管理单元 (gpedit.msc) 以编辑用于管理组织中 Windows 防火墙设置的组策略对象 (GPO)。打开计算机配置,打开管理模板,打开网络,打开网络连接,打开 Windows 防火墙,然后打开域配置文件或标准配置文件,具体取决于您要配置的配置文件。启用以下例外:“允许远程管理例外”和“允许文件和打印机共享例外”。

主机名或 IP 地址错误或远程计算机已关闭。

解决方案:验证正确的主机名或 IP 地址。 “TCP/IP NetBIOS Helper”服务未运行。 解决方案:验证“TCP/IP NetBIOS Helper”是否正在运行并设置为重启后自动启动。

“远程过程调用 (RPC)”服务未在远程计算机上运行。

解决方案:验证“远程过程调用 (RPC)”是否正在运行并设置为重启后自动启动。

“Windows Management Instrumentation”服务未在远程计算机上运行。

解决方案:验证“Windows Management Instrumentation”是否正在运行并设置为重启后自动启动

所以,我认为那里没有任何代码问题。请检查网络防火墙和服务器端。还应用try/catch 块并在循环中捕获确切的服务器名称,以查看导致问题的服务器。

【讨论】:

  • 当我使用 try catch 时,似乎捕获了错误。我将块放在 foreach 之前和 csv 导出之前。错了吗?
  • @CruZer0 您是否在 try..catch 中的 Get-WmiObject 调用上设置了`-ErrorAction Stop`?另外,将 try..catch inside foreach
  • @CruZer0:你能告诉我你的try/catch 声明吗?我认为您没有将其放在循环中。它必须进入循环内部,以便在发生故障时停止。但是,如果您仍然希望其他服务器继续循环,那么您必须使用双 try/catch - 一个内部循环和一个外部循环。
  • @CruZer0: 想知道这个问题,也想知道我的回答对你有没有帮助
  • @RanadipDutta 这个问题实际上要深得多。问题是该数组实际上不是一个数组,而是一个“对象”。并且因为 Get-WmiObject 需要主机名的“干净字符串”,所以它不起作用。它看起来像这样“@ [Name] = Someserver”而不是“Someserver”我通过在第一行中使用“Select-Object - Expand Name”修复了这个问题,因此数组将获得“真实和干净的字符串”之后一切正常.
猜你喜欢
  • 2019-07-27
  • 2014-11-28
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2013-06-14
  • 2019-01-06
相关资源
最近更新 更多