PowerShell采集AD计算机信息合并输出表格仅显示一行问题求助
问题原因分析
- 核心错误是数据采集和对象构造的逻辑分离:你先全局遍历所有计算机把所有结果混存在
$list/$WFeature/$Wrole三个变量里,没有和单台计算机做绑定,最后构造自定义对象的逻辑没有放在循环内部,仅执行了一次,只会拿到最后一次循环残留的计算机变量值,所以只有一行输出。 - 次要错误是所有远程查询命令未指定目标计算机:你调用的
Get-WmiObject、Get-WindowsFeature默认只会查询本地计算机,根本没有请求目标AD计算机的数据,哪怕逻辑改对也拿不到远程设备的信息。 - 补充:
Get-WmiObject在PowerShell 3.0之后已经被弃用,建议替换为Get-CimInstance,另外Win32_Product类会触发所有MSI安装包的一致性校验,执行速度极慢还可能意外修改软件配置,非必要不建议使用。
修正后的可运行代码
# 1. 从AD获取目标计算机列表 $computerList = Get-ADComputer -Filter 'Name -like "SCPW*" -and ObjectClass -eq "Computer"' | Select-Object -Property Name,objectClass # 2. 遍历每台计算机采集信息并直接构造输出对象 $output = foreach ($computer in $computerList) { $computerName = $computer.Name # 跳过无法连通的设备,避免脚本卡住 if (-not (Test-Connection -ComputerName $computerName -Count 1 -Quiet -ErrorAction SilentlyContinue)) { [PSCustomObject]@{ ComputerName = $computerName features = "设备不可达" Role = "设备不可达" InstalledSoftware = "设备不可达" } continue } try { # 采集当前计算机的已安装软件(替换了Win32_Product为更安全的CIM查询) $list = Get-CimInstance -ClassName Win32_InstalledWin32Program -ComputerName $computerName -ErrorAction Stop | Select-Object -ExpandProperty Name # 采集当前计算机已安装的Windows功能 $WFeature = Get-WindowsFeature -ComputerName $computerName -ErrorAction Stop | Where-Object {$_.installed -eq $true} | Select-Object -ExpandProperty Name # 采集当前计算机的服务器角色 $Wrole = Get-CimInstance -ClassName Win32_ServerFeature -ComputerName $computerName -ErrorAction Stop | Select-Object -ExpandProperty Name # 构造当前计算机对应的输出对象 [PSCustomObject]@{ ComputerName = $computerName features = $WFeature -join ";" # 多值属性用分号拼接方便表格展示 Role = $Wrole -join ";" InstalledSoftware = $list -join ";" } } catch { # 权限不足或者查询失败的情况处理 [PSCustomObject]@{ ComputerName = $computerName features = "查询失败: $($_.Exception.Message)" Role = "查询失败: $($_.Exception.Message)" InstalledSoftware = "查询失败: $($_.Exception.Message)" } } } # 3. 输出为表格 $output | Format-Table -AutoSize # 如果需要导出为CSV可以用下面的命令 # $output | Export-Csv -Path "C:\AD计算机信息.csv" -Encoding UTF8 -NoTypeInformation
注意事项
- 运行脚本的账号需要拥有所有目标计算机的WMI/CIM访问权限、远程服务器管理权限
- 目标计算机需要提前开启WMI远程访问、远程服务器管理功能,防火墙放行相关端口
- 如果需要保留多值属性的数组格式,删除代码中的
-join ";"即可,表格展示时会显示System.Object[],导出为CSV或者单独查看属性时可以正常展开
内容的提问来源于stack exchange,提问作者Alejandro González
相关产品推荐
相关产品推荐

