在日常的 IT 管理和运维工作中,我们经常需要远程查询计算机的硬件和软件信息。PowerShell 提供了强大的远程管理功能,能够让我们在远程计算机上执行命令并获取相关数据。
本文将介绍如何使用 PowerShell 脚本远程查询 Windows 计算机的操作系统信息、硬件信息、网络配置、Windows 补丁等内容。
步骤一:设置远程 PowerShell 会话
首先,确保目标计算机已经启用了远程 PowerShell 功能。这可以通过以下命令在目标计算机上启用:
Enable-PSRemoting -Force
还需要确保目标计算机的防火墙允许远程访问,通常通过 WinRM 服务来进行通信。你可以使用以下命令来检查 WinRM 服务是否已启用:
Get-Service -Name WinRM
步骤二:编写远程查询脚本
接下来,我们编写一个 PowerShell 脚本,通过远程会话查询目标计算机的详细信息。这个脚本包括以下内容:
- 获取目标计算机的主机名、操作系统信息、硬件信息(CPU、内存、硬盘)、网络信息(网卡)、Windows 补丁信息等。
# 获取用户输入的远程主机 IP 地址
$remote_ip = Read-Host "请输入远程主机的 IP 地址"
# 获取用户输入的计算机名\用户名
$remoteUser = Read-Host "请输入远程主机的用户名(格式:计算机名\用户名,例如:SZDH\administrator)"
# 弹出对话框让用户输入密码
$credential = Get-Credential -UserName $remoteUser -Message "请输入远程主机的密码"
# 测试目标主机是否在线
$pingResult = Test-Connection -ComputerName $remote_ip -Count 1 -Quiet
if ($pingResult -eq $false) {
Write-Host "目标主机 $remote_ip 不在线或无法访问。"
exit
} else {
Write-Host "目标主机 $remote_ip 在线。"
}
# 合并查询:操作系统、主机名、系统信息等
$systemInfo = Invoke-Command -ComputerName $remote_ip -Credential $credential -ScriptBlock {
$os = Get-WmiObject Win32_OperatingSystem | Select-Object Caption, Version, BuildNumber, InstallDate, LastBootUpTime
$computer = Get-WmiObject Win32_ComputerSystem | Select-Object Name, Manufacturer, Model, Domain
$bios = Get-WmiObject Win32_BIOS | Select-Object SMBIOSBIOSVersion
$cpu = Get-WmiObject Win32_Processor | Select-Object Name, Manufacturer, MaxClockSpeed
$memory = Get-WmiObject Win32_ComputerSystem | Select-Object TotalPhysicalMemory
$disk = Get-WmiObject Win32_DiskDrive | Select-Object Model, Size
$network = Get-WmiObject Win32_NetworkAdapter | Where-Object { $_.NetConnectionStatus -eq 2 } | Select-Object Name, AdapterType, MACAddress
$updates = Get-WmiObject -Class "Win32_QuickFixEngineering" | Select-Object Description, HotFixID, InstalledOn
# 返回所有查询结果
return [PSCustomObject]@{
HostName = $computer.Name
OSInfo = $os
Manufacturer = $computer.Manufacturer
Model = $computer.Model
Domain = $computer.Domain
BIOSVersion = $bios.SMBIOSBIOSVersion
CPUInfo = $cpu
MemoryGB = [math]::round($memory.TotalPhysicalMemory / 1GB, 2)
DiskInfo = $disk
NetworkAdapters = $network
Updates = $updates
}
}
# 显示信息
Write-Host "主机名:$($systemInfo.HostName)"
Write-Host "操作系统:$($systemInfo.OSInfo.Caption) $($systemInfo.OSInfo.Version) $($systemInfo.OSInfo.BuildNumber)"
Write-Host "安装日期:$([Management.ManagementDateTimeConverter]::ToDateTime($systemInfo.OSInfo.InstallDate).ToString('yyyy-MM-dd HH:mm:ss'))"
Write-Host "系统启动时间:$([Management.ManagementDateTimeConverter]::ToDateTime($systemInfo.OSInfo.LastBootUpTime).ToString('yyyy-MM-dd HH:mm:ss'))"
Write-Host "系统制造商:$($systemInfo.Manufacturer)"
Write-Host "系统型号:$($systemInfo.Model)"
Write-Host "域:$($systemInfo.Domain)"
Write-Host "BIOS 版本:$($systemInfo.BIOSVersion)"
Write-Host "CPU 信息:$($systemInfo.CPUInfo.Name), $($systemInfo.CPUInfo.Manufacturer), $($systemInfo.CPUInfo.MaxClockSpeed) MHz"
Write-Host "内存信息:$($systemInfo.MemoryGB) GB"
# 显示硬盘信息
foreach ($disk in $systemInfo.DiskInfo) {
Write-Host "硬盘信息:型号: $($disk.Model) 大小: $([math]::round($disk.Size / 1GB, 2)) GB"
}
# 显示网卡信息
foreach ($adapter in $systemInfo.NetworkAdapters) {
Write-Host "网卡信息:名称: $($adapter.Name), 类型: $($adapter.AdapterType), MAC地址: $($adapter.MACAddress)"
}
# 显示Windows补丁信息
foreach ($update in $systemInfo.Updates) {
Write-Host "Windows 补丁:描述: $($update.Description), 补丁ID: $($update.HotFixID), 安装日期: $($update.InstalledOn)"
}
# 完成
Write-Host "查询完成!"
# 等待用户按任意键退出
Read-Host -Prompt "按任意键退出…"
步骤三:执行查询
执行上述 PowerShell 脚本时,它会:
- 获取远程主机的 IP 地址和凭据,然后测试目标计算机是否在线。
- 远程执行 WMI 查询,获取操作系统、CPU、内存、硬盘、BIOS、网卡和 Windows 补丁等信息。
- 格式化显示信息,包括安装日期和系统启动时间的格式化处理。
- 最后,程序会等待用户按任意键退出。

步骤四:脚本优化
该脚本通过 Invoke-Command 结合多个查询来同时获取操作系统、硬件、网络和补丁信息,从而减少查询的次数,提高效率。所有信息都集中在一个 PSCustomObject 中返回,便于后续处理和展示。
总结
通过 PowerShell 脚本,您可以轻松地远程查询 Windows 计算机的详细信息,包括操作系统、硬件、网络和更新情况。利用 PowerShell 的远程管理功能,可以在多个计算机上执行批量查询,大大提高管理效率。