powershell批量检查域内计算机操作系统版本需分三步:先用get-adcomputer获取启用设备列表,再用get-ciminstance远程查询win32_operatingsystem类获取真实os信息,最后通过构建号映射函数转换为易读版本(如“windows 11 23h2”),支持导出csv与分组统计。

用 PowerShell 批量检查域内所有计算机的操作系统版本,核心是结合 Active Directory 查询 + 远程系统信息获取。关键在于先列出启用的计算机,再安全、高效地收集其 OS 版本,避免因离线或权限问题中断整体任务。
一、确认域环境并获取计算机列表
确保当前账户有读取域计算机对象的权限(如 Domain Users 或更高)。使用 Get-ADComputer 获取启用的、非服务器类(可选过滤)的计算机:
- 基础命令(需安装 RSAT Active Directory 模块):
Get-ADComputer -Filter {Enabled -eq $true} -Property Name,OperatingSystem,OperatingSystemVersion | Select-Object Name,OperatingSystem,OperatingSystemVersion - 若想跳过已知不可达设备,加 -SearchBase 限定 OU 范围,减少扫描范围
- 注意:该方式依赖 AD 中缓存的 OperatingSystem 属性,可能滞后或为空(尤其老旧设备),不能替代实际查询
二、远程获取真实操作系统版本(推荐组合方案)
对每台计算机执行远程 WMI 或 CIM 查询,获取准确的 Win32_OperatingSystem 类信息。推荐使用 Get-CimInstance(比 Get-WmiObject 更现代、支持 CIM session 重用):
- 单机测试(验证连通性与权限):
Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName "PC001" | Select-Object CSName, Caption, Version, BuildNumber, ServicePackMajorVersion - 批量执行(带错误处理):
用 ForEach-Object 遍历计算机名列表,对每台尝试连接;加 -ErrorAction SilentlyContinue 跳过失败项;用 Select-Object 提取关键字段 - 示例片段:
$computers = Get-ADComputer -Filter {Enabled -eq $true} -Property Name | Select-Object -ExpandProperty Name
$results = foreach ($comp in $computers) {
try {
Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $comp -ErrorAction Stop |
Select-Object @{n='ComputerName';e={$comp}}, Caption, Version, BuildNumber
} catch { [PSCustomObject]@{ComputerName=$comp; Caption='Offline or Access Denied'; Version='N/A'; BuildNumber='N/A'} }
}
三、补充:构建号转易读版本(如 Windows 10/11)
BuildNumber(如 19045、22621)不易识别,可用自定义映射函数提升可读性:
- 定义转换函数(例如):
function Convert-BuildToOS { param($build)
switch ($build) {
19045 { 'Windows 10 22H2' }
22621 { 'Windows 11 22H2' }
22631 { 'Windows 11 23H2' }
default { "Build $build" }
} - 在结果中调用:
$results | ForEach-Object { $_ | Add-Member -NotePropertyName FriendlyOS -NotePropertyValue (Convert-BuildToOS $_.BuildNumber) -PassThru } - 微软官方构建号对照表可查 Microsoft Learn 文档,建议定期更新该映射表
四、导出与后续处理
结果整理后,便于归档或分析:
- 输出到屏幕并按版本分组:
$results | Group-Object FriendlyOS | Sort-Object Count -Descending - 导出为 CSV(含时间戳):
$results | Export-Csv -Path "$env:USERPROFILE\Desktop\AD_OS_Report_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation - 如需快速筛选 Windows 11 设备:
$results | Where-Object {$_.Caption -like "*Windows 11*"}











