powershell可原生远程批量检查安全配置,需将等保2.0等合规要求拆解为账户密码、审计策略、服务端口、补丁更新、防火墙加密等具体项,封装为统一结构的检查函数,再通过invoke-command批量执行并导出html/csv/json报告。
powershell 是 windows 原生的自动化引擎,不用装额外工具就能远程批量检查安全配置。关键不是“一键”,而是把合规要求(比如等保2.0、cis 或企业基线)拆成可验证的具体项,用函数封装、统一输出、集中汇总。
明确你要查什么
不同标准关注点不同,得先列清楚检查项,避免盲目扫描:
- 账户与密码:Guest 是否禁用、密码最短长度是否≥8、账户锁定阈值是否设为5次
- 审计策略:登录/登出、特权使用、对象访问是否开启审核,日志保留天数是否≥180天
- 服务与端口:Remote Registry、Computer Browser 等高危服务是否停止;RDP 是否仅限指定组、是否启用网络级身份验证(NLA)
- 补丁与更新:最近安装的 KB 更新是否在30天内;Windows Update 服务是否启用且自动下载安装
- 防火墙与加密:域/专用/公用配置文件的防火墙是否启用;BitLocker 是否对系统盘启用
写可复用的检查函数
每个检查项单独写成函数,返回结构一致的对象,方便后续聚合。例如:
Test-PasswordComplexity.ps1(模块化示例):
function Test-PasswordComplexity {
$policy = secedit /export /cfg temp.inf 2>&1 | Out-Null
$content = Get-Content temp.inf | Select-String "PasswordComplexity"
Remove-Item temp.inf -Force
$value = [int]($content -split "=")[1].Trim()
return [PSCustomObject]@{
CheckName = 'Password Complexity Enabled'
Status = if ($value -eq 1) { 'Pass' } else { 'Fail' }
Detail = "Value=$value"
Remediation = "secedit /configure /db secedit.sdb /cfg policy.inf"
}
}
所有函数都按这个模式返回:CheckName、Status、Detail、Remediation,后续导出报告或对接 Intune 都很顺畅。
批量执行与结果整合
用 Invoke-Command 并行调用多台主机,避免逐台手动连:
- 目标列表从 CSV 或 AD 查询获取,如:
$targets = Import-Csv .\servers.csv | ForEach-Object { $_.Hostname } - 用
-ThrottleLimit 10控制并发数,防资源耗尽;加-ErrorAction SilentlyContinue跳过离线主机 - 汇总结果后,导出为 HTML 报告(含颜色标识 Pass/Fail)或 CSV(供 Excel 分析),也可直接转 JSON 提交到 SIEM 或 Intune 合规策略
注意权限与安全边界
脚本本身不能绕过系统限制,执行前需确认:
- 运行账户对目标主机有管理员权限,且 WinRM 已启用(
winrm quickconfig) - 避免硬编码密码——用证书认证(CBA)或 Azure 托管标识对接自动化平台
- 脚本大小 ≤1 MB、单次运行 ≤10 分钟(Intune 等平台硬性要求)
- 敏感操作(如修改策略)和只读检查分离,检查脚本默认不写入、不重启、不触发变更










