You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:36:04