一键巡检脚本需先明确等保2.0/cis基线策略项,再用函数封装每项检查逻辑并返回统一pscustomobject结构,支持远程批量执行、标准化输出csv/html报告,且须以管理员权限运行。
直接用 powershell 编写一键巡检安全策略的脚本,核心是把等保2.0、cis 或企业基线中明确的技术项,转换成可执行、可验证、可输出的命令逻辑,而不是堆砌一堆命令凑数。
明确要检查哪些安全策略项
别一上来就写代码。先列出你真正要管的内容,比如:
- 账户锁定策略:阈值是否 ≥5 次、复位计时器是否 ≤15 分钟
- 密码策略:最小长度 ≥8、最长使用期限 ≤90 天、强制历史记录 ≥5
- 审核策略:登录/对象访问/特权使用是否启用
- 防火墙状态:域/专用/公用配置文件是否启用
- 远程桌面:是否仅限指定组、是否启用网络级身份验证(NLA)
- BitLocker:系统盘是否启用、恢复密钥是否已备份到 AD
每项都对应一个具体路径和预期值,例如密码最短长度查注册表 HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\lmpolicy 下的 MinPasswordLength,预期值是 8。
用函数封装每一项检查逻辑
每个策略项写成独立函数,返回统一结构,方便汇总和导出:
function Test-PasswordMinLength {
$value = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name 'MinPasswordLength' -ErrorAction SilentlyContinue).MinPasswordLength
[PSCustomObject]@{
CheckName = '密码最短长度'
Status = if ($value -ge 8) { 'Pass' } else { 'Fail' }
Detail = "当前值: $value"
Remediation = 'secedit /configure /db secedit.sdb /cfg policy.inf'
}
}
这样写的好处是:单个函数可单独测试;多个函数可组合调用;结果能统一转成表格、CSV 或 HTML 报告。
批量执行 + 标准化输出
主脚本不写死逻辑,而是读取配置清单(如 JSON 或 CSV),动态调用函数:
- 用 Invoke-Command 远程执行,支持多台主机并行检查
- 加 -Credential 参数适配不同权限环境
- 结果统一存为 PSCustomObject 数组,最后用 Export-Csv 或 ConvertTo-Html 输出
- 失败项自动标红,高风险项加备注(如“账户锁定阈值为0 → 允许暴力破解”)
示例导出命令:$results | ConvertTo-Html -Title "安全策略巡检报告" | Out-File .\report.html
部署与运行建议
脚本本身要能落地,不是写完就完事:
- 以管理员身份运行,否则读不到 LSA 策略、审计设置等关键项
- 若在域环境,可配合组策略“启动脚本”部署,开机自动执行并写日志到共享目录
- 避免硬编码密码或明文凭据,敏感操作改用 Get-Credential 或 Kerberos 委派
- 首次运行前先本地测试单台,确认每项都能返回 Status 和 Detail,再推全网











