PowerShell远程采集多PC硬件信息异常:重复本地数据排查
问题排查与修正方案
核心问题分析
- CSV列名不匹配:如果你的
computers.csv里的计算机名列不是Name(比如实际列名是PCName),那么$_.Name会返回空值。Get-WmiObject在未指定有效远程计算机名时,默认查询本地机器(你的域控制器)的信息,导致所有行都是重复的本地数据。 - 中文引号解析错误:脚本中使用了中文全角引号(如
“C:\Temp\computers.csv”),PowerShell会将其视为字符串的一部分而非语法符号,可能导致参数或变量失效。 - 过时Cmdlet的局限性:
Get-WmiObject已被官方弃用,相比之下Get-CimInstance对远程连接的支持更稳定,错误处理也更友好。
修正后的脚本
# 注意:确认computers.csv的计算机名列是Name,否则替换$_.Name为对应列名(如$_.PCName) Import-Csv "C:\Temp\computers.csv" | ForEach-Object { $computerName = $_.Name # 加入错误处理,跳过无法连接的机器并记录问题 try { $computerSystem = Get-CimInstance Win32_ComputerSystem -ComputerName $computerName -ErrorAction Stop $computerOS = Get-CimInstance Win32_OperatingSystem -ComputerName $computerName -ErrorAction Stop $computerCPU = Get-CimInstance Win32_Processor -ComputerName $computerName -ErrorAction Stop $computerSN = Get-CimInstance Win32_BIOS -ComputerName $computerName -ErrorAction Stop | Select-Object -ExpandProperty SerialNumber [PSCustomObject]@{ PCName = $computerSystem.Name Model = $computerSystem.Model RAM = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory / 1GB) CPU = $computerCPU.Name OS = $computerOS.Caption SN = $computerSN User = $computerSystem.UserName } } catch { Write-Warning "无法连接到计算机:$computerName,错误:$($_.Exception.Message)" # 可选:将失败信息写入结果CSV [PSCustomObject]@{ PCName = $computerName Model = "连接失败" RAM = "N/A" CPU = "N/A" OS = "N/A" SN = "N/A" User = "N/A" } } } | Export-Csv "C:\Temp\system-info.csv" -NoTypeInformation -Encoding UTF8
关键注意事项
- 核对CSV列名:打开
computers.csv确认第一行的计算机名列标题,必须和脚本中$_.Name的字段名完全一致,比如列名是计算机名就改成$_.计算机名。 - 权限与网络检查:确保域控制器的管理员账号有权限访问目标PC的CIM服务,目标PC已开启
WinRM服务(域内机器默认开启),且网络连通正常。 - 编码优化:添加
-Encoding UTF8参数可避免CSV文件打开时出现乱码。
内容的提问来源于stack exchange,提问作者Katrina
相关产品推荐
相关产品推荐

