如何合并PowerShell脚本提取AD计算机信息及UEFISecureBootEnabled状态
可扩展AD域设备信息采集脚本实现
核心设计思路
- 所有采集项以规则形式统一管理,新增采集逻辑无需修改循环主体
- 远程执行命令统一做异常处理,避免单台设备离线导致脚本中断
- 输出统一为结构化对象,方便后续直接导出为CSV/Excel等报表格式
完整脚本代码
# 1. 预加载AD模块 Import-Module ActiveDirectory # 2. 定义采集规则:后续新增采集项只需在此处添加新的规则对象即可 $collectRules = @( # 基础AD属性(无需远程执行) @{ PropertyName = "设备名称" GetValue = { $adDevice.Name } }, @{ PropertyName = "操作系统" GetValue = { $adDevice.Operatingsystem } }, @{ PropertyName = "操作系统版本" GetValue = { $adDevice.OperatingSystemVersion } }, @{ PropertyName = "IPv4地址" GetValue = { $adDevice.IPv4Address } }, # 远程采集类属性 @{ PropertyName = "UEFISecureBootEnabled" GetValue = { param($deviceName) try { Invoke-Command -ComputerName $deviceName -ScriptBlock { (Get-ItemProperty -Path hklm:\System\CurrentControlSet\Control\SecureBoot\State).UEFISecureBootEnabled } -ErrorAction Stop } catch { return "采集失败" } } } ) # 3. 获取所有已启用的AD域计算机 $adComputerList = Get-ADComputer -Filter 'enabled -eq "true"' ` -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Address | Sort-Object -Property Operatingsystem # 4. 循环采集每台设备的所有属性 $reportData = foreach ($adDevice in $adComputerList) { $resultObj = [PSCustomObject]@{} foreach ($rule in $collectRules) { $value = & $rule.GetValue $adDevice.Name $resultObj | Add-Member -MemberType NoteProperty -Name $rule.PropertyName -Value $value } $resultObj } # 5. 输出结果/导出报表 $reportData | Format-Table -AutoSize # 如需导出为CSV可直接使用:$reportData | Export-Csv -Path "C:\AD设备报表.csv" -Encoding UTF8 -NoTypeInformation
新增采集项方法
只需在$collectRules数组中添加新的规则对象即可,比如新增采集设备的最后开机时间属性,只需添加如下规则:
@{ PropertyName = "最后开机时间" GetValue = { param($deviceName) try { Invoke-Command -ComputerName $deviceName -ScriptBlock { (Get-CimInstance Win32_OperatingSystem).LastBootUpTime } -ErrorAction Stop } catch { return "采集失败" } } }
注意事项
- 运行脚本的账号需拥有AD域读取权限,以及所有目标设备的本地管理员权限
- 目标设备需提前开启WinRM远程管理服务,可通过组策略批量部署开启
- 新增采集规则时可自行决定是否需要远程执行,本地可直接计算的属性无需走Invoke-Command
内容的提问来源于stack exchange,提问作者JL Thalacker
相关产品推荐
相关产品推荐

