PowerShell 不能直接检测漏洞,但可作为自动化“胶水语言”整合系统工具与数据库构建轻量级评估流程:一查缺失关键补丁(如KB5004296);二查高危服务/协议(如SMBv1、Telnet、RDP加密);三导出并比对本地安全策略与GPO;四生成带等级标识的HTML报告。
powershell 本身不提供漏洞检测能力,但可作为自动化调度和信息聚合的“胶水语言”,配合系统内置工具、第三方扫描器或公开漏洞数据库,构建轻量级 windows 漏洞评估流程。关键在于明确目标:不是替代专业扫描器(如 nessus、qualys),而是快速识别已知高危配置偏差、缺失补丁、启用的危险服务或弱策略。
一、检查缺失的关键安全更新
Windows Update 历史记录和补丁状态可通过 WMI/CIM 获取。使用 Get-HotFix 结合已知 CVE 补丁编号(如 KB5004296 对应 PrintNightmare 缓解)可定位未安装的关键更新。
- 用 Get-HotFix | Where-Object {$_.HotFixID -eq 'KB5004296'} 判断是否已安装
- 批量检查多个 KB:将常见高危补丁 ID 存入数组,循环查询并输出缺失项
- 注意:Get-HotFix 不显示已卸载或仅下载未安装的更新,建议搭配 DISM /Online /Get-Packages 或 Get-WindowsUpdateLog(需先启用日志)交叉验证
二、识别高风险服务与协议配置
许多漏洞源于默认启用但不必要服务(如 SNMP、Telnet、SMBv1)。PowerShell 可直接查询服务状态和注册表策略。
- 检查 SMBv1:Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol,返回 True 即存在风险
- 禁用危险服务:Stop-Service -Name "Telnet" -Force; Set-Service -Name "Telnet" -StartupType Disabled
- 验证远程桌面加密级别:Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'SecurityLayer',值为 0 表示使用不安全的 RDP 加密
三、导出本地安全策略与组策略结果集(GPO)
本地策略偏差(如密码复杂度、账户锁定阈值、审核策略)常被忽略,却是攻击链起点。PowerShell 可调用 secedit 和 gpresult 提取配置快照。
- 导出本地安全策略为 INF:secedit /export /cfg C:\temp\baseline.inf /areas SECURITYPOLICY
- 获取当前应用的组策略设置(含域策略):gpresult /h C:\temp\gpreport.html /f,再用 PowerShell 解析 HTML 或 XML 输出
- 比对基线:将导出的 INF 文件与已知安全基线(如 CIS Benchmark)逐条匹配,标记不一致项(如 PasswordComplexity = 1 应为 1,若为 0 则告警)
四、整合输出与简易报告生成
脚本最终价值体现在可读性。避免纯控制台输出,用 ConvertTo-Html 或结构化对象生成带颜色标识的报告。
- 定义自定义对象存储每项检查结果:[PSCustomObject]@{Check='SMBv1 Enabled';Status='Failed';Detail='EnableSMB1Protocol=True'}
- 汇总后导出为 HTML:$results | ConvertTo-Html -Title "Windows Vulnerability Assessment" | Out-File C:\report.html
- 添加严重等级字段(Critical/High/Medium),用 CSS 样式区分颜色,便于快速识别优先级
不复杂但容易忽略:所有操作需以管理员权限运行;域环境要区分本地策略与 GPO 覆盖关系;定期更新脚本中的 KB 列表和 CVE 关联规则——漏洞评估是持续过程,不是一次性的扫描动作。


















