PowerShell系统文件哈希自动化校验核心是“建一次基、比多次、有响应”:先在干净系统用Get-FileHash生成System32下DLL/EXE的SHA256基准CSV并设为只读;再通过verify.ps1定时比对,记录哈希不一致、文件丢失或新增,并写入带时间戳的告警日志;最后用任务计划程序配置每日凌晨2点以最高权限自动执行。
用 powershell 实现系统文件哈希自动化校验,核心是“建一次基、比多次、有响应”。不需要装额外工具,windows 自带的 get-filehash 就够用,关键是把路径筛选、权限控制、日志记录和定时执行串成闭环。
生成可信基准清单(一次性)
在干净、未被入侵的系统上,以管理员身份运行,为关键目录建立初始哈希快照。推荐聚焦 C:\Windows\System32 下的 DLL 和 EXE 文件,避开 WinSxS(该目录天然多版本、高频更新,纳入校验会频繁误报):
- 执行命令生成 CSV 清单:
Get-ChildItem "C:\Windows\System32\*.dll","C:\Windows\System32\*.exe" -Force -ErrorAction SilentlyContinue | ForEach-Object { $h = Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue; if ($h) { [PSCustomObject]@{Path=$_.FullName; SHA256=$h.Hash; LastWriteTime=$_.LastWriteTime} } } | Export-Csv C:\audit\baseline.csv -NoTypeInformation -Encoding UTF8 - 生成后立即将
baseline.csv设为只读,或移至受控路径(如C:\Secure\),防止被恶意覆盖 - 建议备份到离线介质,作为后续恢复或交叉验证依据
编写自动比对脚本(verify.ps1)
该脚本每次运行时读取基准清单,重新计算当前文件哈希,并识别三类异常:哈希不一致、文件丢失、文件新增(后者可选开启):
- 逐行读取
baseline.csv,对每个Path调用Get-FileHash -Algorithm SHA256;若文件不存在或读取失败,记为“MISSING” - 比对结果不一致时,写入告警日志,格式含 ISO 时间戳:
"[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] MISMATCH: $path (old: $oldHash, new: $newHash)" | Out-File alerts.log -Append - 可加入辅助诊断:发现异常后自动执行
tasklist /m filename.dll查看是否被可疑进程加载,或用Get-AuthenticodeSignature检查签名状态
配置任务计划程序定时执行
让校验真正“无人值守”,不是靠人工想起来才跑:
- 新建基本任务,触发器设为每天凌晨 2:00(避开业务高峰)
- 操作设置为启动程序:
程序:powershell.exe
参数:-ExecutionPolicy Bypass -File "C:\audit\verify.ps1" - 务必勾选“使用最高权限运行”,否则无法读取 System32 下多数系统文件
- 在“设置”页启用“如果任务失败,则每 10 分钟重试,最多 3 次”,提升容错能力
轻量备用方案:certutil 批处理盯关键文件
当只需监控极少数高危文件(如 lsass.exe、net.exe、svchost.exe),certutil 更简洁、不受 PowerShell 执行策略限制:
- 在干净系统中提取各文件 SHA256 值,硬编码进批处理(如
set EXPECTED_LSASS=9f8e7d6c...) - 用
certutil -hashfile "%windir%\System32\lsass.exe" SHA256提取当前值,字符串比对 - 脚本开头加权限自提权逻辑:
net session >nul 2>&1 || powershell start "" -verb runas -argumentlist "'%~f0' %*" & exit /b - 同样通过任务计划程序调用,适合受限环境或快速部署场景

















