在Windows中用PowerShell统计远程服务器硬件资产的核心是通过WinRM调用远程CIM/WMI接口获取信息,需配置WinRM、防火墙及权限,脚本可批量采集主机名、CPU、内存、磁盘、网卡等信息并导出CSV。
在 windows 中用 powershell 统计远程服务器硬件资产,核心是通过 winrm(windows remote management)调用远程服务器的 wmi/cim 接口获取硬件信息,并在本地汇总。整个过程无需安装额外软件(只要目标服务器开启 winrm 并配置好权限),脚本可批量执行、结果可导出为 csv 或 html。
一、前提条件:确保远程访问可用
PowerShell 远程采集依赖 WinRM 通信,必须提前配置:
- 在每台目标服务器上以管理员身份运行:winrm quickconfig -force(启用 WinRM 服务并配置监听)
- 确认防火墙放行 WinRM 端口(默认 5985/HTTP 或 5986/HTTPS)
- 确保当前用户对远程服务器有本地管理员权限,或已配置可信主机(Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.10,192.168.1.11" -Force)
- 建议统一使用 CIMSession(比传统 WMI 更安全、支持 HTTPS 和自定义凭据)
二、脚本关键内容:采集哪些硬件信息
常用且稳定的硬件字段来自 CIM 类(兼容 Server 2012+ 及 Windows 10/11):
- 计算机基本信息:Name(主机名)、Manufacturer、Model、SystemType、TotalPhysicalMemory(内存字节数)
- CPU:Name(型号)、NumberOfCores、NumberOfLogicalProcessors
- 内存插槽详情:从 Win32_PhysicalMemory 获取容量、速度、插槽位置(可统计总条数、最大单条容量)
- 磁盘:DeviceID(如 C:)、Size、MediaType(HDD/SSD/NVMe)、Model(需查 MSFT_PhysicalDisk 或 Win32_DiskDrive)
- 网卡:Name、MACAddress、Speed(Mbps)、NetEnabled(是否启用)
三、完整可运行脚本示例
以下脚本支持批量服务器、自动重试、错误跳过,并生成带时间戳的 CSV 汇总文件:
# 定义服务器列表(可从文件读取:Get-Content .\servers.txt)
$servers = "srv-web01", "srv-db02", "srv-app03"
<h1>创建结果集合</h1><p>$results = @()</p><p>foreach ($server in $servers) {
Write-Host "正在连接 $server..." -ForegroundColor Cyan
try {</p><h1>建立 CIM session(使用当前用户凭据;如需指定账号,加 -Credential 参数)</h1><pre class="brush:php;toolbar:false;"> $session = New-CimSession -ComputerName $server -ErrorAction Stop -OperationTimeoutSec 30
# 获取系统信息
$comp = Get-CimInstance -CimSession $session -ClassName Win32_ComputerSystem -ErrorAction Stop
$bios = Get-CimInstance -CimSession $session -ClassName Win32_BIOS -ErrorAction Stop
$cpu = Get-CimInstance -CimSession $session -ClassName Win32_Processor -ErrorAction Stop | Select-Object -First 1
$disk = Get-CimInstance -CimSession $session -ClassName Win32_DiskDrive -ErrorAction Stop |
Where-Object { $_.MediaType -match 'Fixed' } |
Select-Object Model, Size, MediaType, InterfaceType
# 内存总量(GB)和插槽数
$memTotalGB = [math]::Round($comp.TotalPhysicalMemory / 1GB, 2)
$memSticks = (Get-CimInstance -CimSession $session -ClassName Win32_PhysicalMemory -ErrorAction SilentlyContinue).Count
$memSticks = if ($null -eq $memSticks) { 0 } else { $memSticks }
# 网卡数量(启用状态)
$nicCount = (Get-CimInstance -CimSession $session -ClassName Win32_NetworkAdapter -Filter "NetEnabled='True'" -ErrorAction SilentlyContinue).Count
# 构建单条记录
$results += [PSCustomObject]@{
ServerName = $server
Manufacturer = $comp.Manufacturer.Trim()
Model = $comp.Model.Trim()
BIOSVersion = $bios.SMBIOSBIOSVersion.Trim()
SystemType = $comp.SystemType
CPUModel = $cpu.Name.Trim()
Cores = $cpu.NumberOfCores
LogicalProcessors= $cpu.NumberOfLogicalProcessors
TotalRAM_GB = $memTotalGB
RAMSlotsUsed = $memSticks
DiskCount = $disk.Count
SSDCount = (@($disk | Where-Object MediaType -eq 'SSD').Count)
NICCount = $nicCount
LastUpdated = Get-Date -Format "yyyy-MM-dd HH:mm"
}
Remove-CimSession -CimSession $session -ErrorAction SilentlyContinue
Write-Host "✅ $server 采集完成" -ForegroundColor Green
}
catch {
Write-Host "❌ $server 连接失败:$($_.Exception.Message)" -ForegroundColor Red
$results += [PSCustomObject]@{
ServerName = $server
Manufacturer = "N/A"
Model = "N/A"
BIOSVersion = "N/A"
SystemType = "N/A"
CPUModel = "N/A"
Cores = 0
LogicalProcessors= 0
TotalRAM_GB = 0
RAMSlotsUsed = 0
DiskCount = 0
SSDCount = 0
NICCount = 0
LastUpdated = Get-Date -Format "yyyy-MM-dd HH:mm"
}
}}
导出汇总结果(含时间戳)
$outputFile = "HardwareInventory$(Get-Date -Format 'yyyyMMdd_HHmm').csv" $results | Export-Csv -Path $outputFile -NoTypeInformation -Encoding UTF8 Write-Host "? 汇总完成,结果已保存至:$outputFile" -ForegroundColor Yellow
四、增强建议与注意事项
实际运维中可进一步提升脚本实用性:
- 用 Import-Csv 读取服务器列表(含 IP、描述、所属部门),让输出 CSV 更具管理维度
- 对磁盘型号做清洗(如过滤掉 USB、CD-ROM 设备),用 Where-Object {$_.InterfaceType -ne 'USB'}
- 添加 ConvertTo-Html 生成可视化报告,配合 CSS 样式更易读
- 敏感环境建议启用 HTTPS WinRM(5986 端口)并使用证书认证,避免明文传输
- 若目标含旧系统(如 2008 R2),需改用 Get-WmiObject 并注意性能差异
不复杂但容易忽略的是权限与超时控制——多数失败源于 WinRM 配置未生效或账户无本地管理员组成员资格。建议首次运行前,先手动测试一条命令:Invoke-Command -ComputerName srv-01 -ScriptBlock { Get-CimInstance Win32_ComputerSystem }。

















