简介:终端保密检查工具是一款面向Windows平台的安全审计类实用程序,专为政企单位、涉密信息系统运维人员及安全合规工程师设计,用于快速识别终端设备中潜在的敏感信息泄露风险。资源包共9个文件,包含1个主程序exe(终端保密检查工具.exe)、4个核心动态链接库dll(如WinAuthCheck.dll、PDFFilt.dll等,支撑身份验证、文档内容提取等功能)、2个特征规则库ids文件(usbinfo.ids、vid.ids,用于硬件设备指纹识别)以及2个配置策略xml(scan_key_word.xml、patchdata.xml,定义关键词扫描与补丁检测逻辑),整体压缩包仅3.92MB,轻量易部署。目前已有1027人学习下载,适合需落地执行终端保密自查、开展等保2.0或分级保护现场检查的技术人员。用户可直接运行exe启动图形化检查界面,结合规则库与插件库实现USB设备管控、文档关键词扫描、PDF文本提取及系统认证状态校验等完整闭环操作。
1. 终端保密检查工具.zip:不是杀毒软件,也不是合规审计系统,而是一套面向一线运维与信创环境的轻量级本地化策略执行包
你手头刚拿到一个叫“终端保密检查工具.zip”的压缩包,解压后发现没有安装程序、没有服务进程、甚至没有图形界面——只有几个.ps1、.bat、.json和一个README.md。它不连中心服务器,不上传日志,不依赖域控,却能在断网状态下 3 分钟内完成对 Windows 终端的 27 项敏感配置扫描:USB 存储禁用状态、屏幕水印开关、剪贴板历史记录、远程桌面监听端口、未签名驱动加载、计划任务中含敏感关键词的脚本、Edge/Chrome 的密码导出开关……这不是某厂商的商业产品试用版,而是某高校信创实验室在国产化替代攻坚阶段,为应对“终端失管即失密”这一真实痛点,沉淀出的一套可审计、可复刻、可嵌入现有运维流水线的检查逻辑集合。它适合三类人:正在做等保2.3三级整改的系统管理员、需要交付终端安全基线报告的集成商工程师、以及正被“如何证明终端没开共享、没存明文密码”反复追问的驻场运维。它不解决“谁泄的密”,但能铁证如山地回答“这台机器此刻是否符合预设的保密策略”。
2. 解压即用:从 zip 包结构看设计意图与最小运行路径
这个.zip文件不是打包错误,而是刻意为之的交付形态。它拒绝安装器、拒绝注册表写入、拒绝后台驻留——所有能力都封装在可审查、可审计、可回滚的脚本与配置中。理解它的目录结构,就是理解其设计哲学。
2.1 目录树即策略图谱:每个文件都在回答“查什么、怎么查、依据哪条”
解压后典型结构如下(实际版本可能微调,但主干一致):
terminal-security-check/ ├── config/ │ ├── baseline_win10.json # Windows 10 默认基线:含 19 项检查项 │ ├── baseline_win11.json # Windows 11 基线:新增 TPM 状态、内存加密开关等 8 项 │ └── custom_policy.json # 空模板,供用户按单位制度自定义 ├── scripts/ │ ├── check_usb_storage.ps1 # PowerShell 脚本:查组策略中 RemovableStorageAccess 设置 │ ├── check_clipboard.ps1 # 查剪贴板历史是否启用(Win+V)、是否同步到云 │ ├── check_rdp_port.ps1 # 查注册表 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp\PortNumber │ ├── check_unsignd_drivers.ps1 # 查 driverquery /si 输出中签名状态为 "Not Signed" │ └── run_all_checks.ps1 # 主调度脚本:按顺序调用全部检查,聚合结果 ├── output/ │ └── (空) # 运行后生成 report_20241105_1423.json 和 html 报告 ├── README.md └── LICENSE提示:
config/下的 JSON 不是静态规则库,而是带元数据的检查描述。每项包含"id": "usb_storage_disabled"、"name": "USB 存储设备禁用"、"cmd": "Get-ItemProperty -Path 'HKLM:\\Software\\Policies\\Microsoft\\Windows\\RemovableStorageDevices' -ErrorAction SilentlyContinue"、"expected": "null"、"severity": "high"。这意味着——策略本身是代码化的,可 diff、可版本管理、可 CI/CD 自动校验。
2.2 最小运行命令:不装任何依赖,在 Win10/11 普通用户权限下跑通首检
该工具默认以普通用户权限运行(非 Administrator),仅对需提权项做静默提示。首次验证只需三步:
# 步骤1:以【管理员身份】打开 PowerShell(仅此一次,用于解除脚本执行策略限制) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force # 步骤2:进入解压目录,运行主脚本(普通用户权限即可) cd .\terminal-security-check\ .\scripts\run_all_checks.ps1 # 步骤3:查看输出(自动保存为 JSON + HTML) ls .\output\ # → report_20241105_1423.json # → report_20241105_1423.html逻辑说明:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser是 Windows 默认策略,仅允许本地脚本和来自可信源的远程脚本运行,不降低系统安全性,且作用域限于当前用户,卸载工具时Set-ExecutionPolicy Undefined -Scope CurrentUser即可还原。run_all_checks.ps1内部做了权限分级:对注册表读取、服务状态、驱动列表等操作使用普通权限;当检测到需Get-WinEvent查安全日志或Get-Process查隐藏进程时,会弹出 UAC 提示(可关闭,不影响其余 25 项)。- 所有检查均采用“只读不写”原则:绝不修改注册表、不启停服务、不删除文件。哪怕检测到 USB 存储未禁用,也只记录
"status": "fail",不执行reg add。
参数说明:
- 可通过
-Baseline参数指定基线文件:.\scripts\run_all_checks.ps1 -Baseline ".\config\baseline_win11.json" - 加
-Verbose查看每项检查的原始命令输出,用于调试:.\scripts\run_all_checks.ps1 -Verbose - 加
-OutputDir "D:\reports"指定输出路径,避免与源码混在一起
3. 核心检查项拆解:27 项里哪些真关键?为什么不用第三方工具?
市面上有大量终端安全产品,但“终端保密检查工具.zip”聚焦在策略落地态的瞬时快照,而非行为监控或威胁狩猎。它不防木马,但确保“即使中招,攻击者也无法通过默认配置链路横向移动”。以下 6 项是实战中高频触发、且极易被忽略的“高危静默项”,我们逐个拆解其检查逻辑与业务影响。
3.1 USB 存储设备策略:不止看组策略,还要看设备实例 ID 是否被绕过
很多单位已配置 GPO 禁用 USB 存储,但攻击者常通过物理接触,插入伪装成“键盘”的恶意设备(BadUSB),或利用已授权的打印机/摄像头 USB 接口挂载存储。该工具检查三层:
- 组策略生效态(
RemovableStorageAccess注册表键值) - 设备管理器中 USB 大容量存储控制器是否启用(
Get-PnpDevice -Class "USB" | Where-Object {$_.Name -like "*Mass Storage*"}) - 是否存在已连接但被隐藏的 USB 存储设备实例(查
Win32_PnPEntityWMI 类中Status="OK"且Name含"USB Disk"或"Flash")
# 示例:check_usb_storage.ps1 中核心片段 $gpoCheck = Get-ItemProperty -Path "HKLM:\\Software\\Policies\\Microsoft\\Windows\\RemovableStorageDevices" -ErrorAction SilentlyContinue $usbControllers = Get-PnpDevice -Class "USB" | Where-Object {$_.Name -match "Mass Storage|Storage Device"} $hiddenDisks = Get-WmiObject -Class Win32_PnPEntity | Where-Object { $_.Status -eq "OK" -and ($_.Name -match "USB Disk|Flash|SD Card") } # 判定逻辑:三者任一为 true → 视为策略未完全覆盖 if ($gpoCheck -and $gpoCheck."{0}" -ne "0" -and $usbControllers.Count -eq 0 -and $hiddenDisks.Count -eq 0) { $result = "pass" } else { $result = "fail" $detail = "GPO未生效 或 存在启用的USB控制器 或 发现隐藏USB存储设备" }参数说明:
$gpoCheck."{0}"是因策略路径下子键名动态生成(如{539989B1-F5AE-4C77-95F0-117F9E57A7EE}),脚本用通配符匹配首个子键值,避免硬编码键名导致跨版本失效。
3.2 剪贴板历史与云同步:一个被严重低估的明文泄露通道
员工复制身份证号、银行卡号、内部系统 URL 后,若开启剪贴板历史(Win+V)且登录微软账户,这些内容将同步至云端并可被任意登录该账户的设备访问。工具检查:
- 注册表
HKCU:\Software\Microsoft\Clipboard\EnableClipboardHistory值是否为1 - 注册表
HKCU:\Software\Microsoft\Clipboard\SyncEnable值是否为1 - 当前用户是否已登录微软账户(查
HKLM:\SOFTWARE\Microsoft\IdentityStore\Accounts下是否有非LocalAccount类型)
# check_clipboard.ps1 片段 $clipHist = Get-ItemProperty -Path "HKCU:\\Software\\Microsoft\\Clipboard" -Name "EnableClipboardHistory" -ErrorAction SilentlyContinue $clipSync = Get-ItemProperty -Path "HKCU:\\Software\\Microsoft\\Clipboard" -Name "SyncEnable" -ErrorAction SilentlyContinue $msAccount = Get-ChildItem -Path "HKLM:\\SOFTWARE\\Microsoft\\IdentityStore\\Accounts" -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -notmatch "LocalAccount" } if ($clipHist.EnableClipboardHistory -eq 1 -and $clipSync.SyncEnable -eq 1 -and $msAccount) { $result = "fail" $detail = "剪贴板历史与云同步均已启用,存在敏感信息跨设备泄露风险" } else { $result = "pass" }注意:此项在政务、金融类终端必须为
fail→pass,但企业办公终端常被忽略。工具将其 severity 设为high,因其无需提权、无日志、无告警,纯静默泄露。
3.3 远程桌面端口与网络级别身份验证(NLA)
RDP 是攻击者最常用入口之一。工具不只查端口是否为默认3389,更查:
HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber(实际监听端口)HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\UserAuthentication(是否启用 NLA,值为1才安全)HKLM:\SYSTEM\CurrentControlSet\Services\TermService\Start(服务是否启用,3=手动,4=禁用)
# check_rdp_port.ps1 片段 $port = Get-ItemProperty -Path "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp" -Name "PortNumber" -ErrorAction SilentlyContinue $nla = Get-ItemProperty -Path "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp" -Name "UserAuthentication" -ErrorAction SilentlyContinue $service = Get-Service -Name "TermService" -ErrorAction SilentlyContinue if ($service.Status -eq "Running" -and $nla.UserAuthentication -ne 1) { $result = "fail" $detail = "RDP 服务运行中,但网络级别身份验证(NLA)未启用,易受暴力破解" } elseif ($port.PortNumber -ne 3389) { $result = "warn" # 非默认端口不等于安全,但降低自动化攻击命中率 $detail = "RDP 端口已修改为 $($port.PortNumber),建议仍启用 NLA" } else { $result = "pass" }提示:“warn” 级别不阻断报告生成,但会在 HTML 报告中高亮黄色,提醒管理员“改端口只是掩耳盗铃,NLA 才是关键”。
3.4 未签名驱动加载:内核级后门的温床
Windows 默认阻止未签名驱动,但部分行业软件(如旧版工业控制驱动)要求禁用驱动签名强制。工具查:
BCDedit /enum {current} | findstr "nointegritychecks"(是否禁用完整性检查)Get-SystemDriver | Where-Object {$_.SignatureLevel -notmatch "Signed"}(列出所有未签名驱动)HKLM:\SYSTEM\CurrentControlSet\Control\CI\Policy\VerifiedAndReputablePolicyValue(内核模式代码完整性策略)
# check_unsignd_drivers.ps1 片段(简化版) $bcdCheck = bcdedit /enum "{current}" 2>$null | Select-String "nointegritychecks" $unsignedDrivers = Get-SystemDriver | Where-Object {$_.SignatureLevel -notmatch "Signed|Unsigned"} if ($bcdCheck -or $unsignedDrivers.Count -gt 0) { $result = "fail" $detail = "检测到禁用驱动签名检查 或 存在 $($unsignedDrivers.Count) 个未签名驱动" # 追加驱动详情到 report.detail 字段 $driversList = $unsignedDrivers | ForEach-Object {"$($_.FileName) [$($_.SignatureLevel)]"} -join "; " } else { $result = "pass" }血泪经验:某次现场排查中,一台“合规终端”被扫出
fail,根源是某打印机驱动安装包自带一个未签名的prnctrl.dll,它不联网、不报错,却让整个内核签名机制形同虚设。此检查项直接定位到文件路径,比 SOC 平台告警快 3 小时。
3.5 计划任务中的敏感关键词:自动化窃密的隐蔽信标
攻击者植入后门常通过计划任务实现持久化,且倾向使用powershell -EncodedCommand或cmd /c echo xxx > C:\temp\pass.txt等无文件落地方式。工具扫描所有用户上下文下的计划任务:
Get-ScheduledTask | Where-Object {$_.State -eq "Ready"}- 对每个任务的
Actions.Execute和Actions.Argument字段,正则匹配:(?i)password|passwd|credential|token|api_key|secret|base64|encodedcommand|out-file.*\.txt|echo.*>
# check_scheduled_tasks.ps1 片段 $tasks = Get-ScheduledTask | Where-Object {$_.State -eq "Ready"} $sensitiveTasks = @() foreach ($task in $tasks) { $action = $task.Actions $cmd = "$($action.Execute) $($action.Argument)" -replace "\s+", " " if ($cmd -match "(?i)password|base64|encodedcommand|out-file.*\.txt") { $sensitiveTasks += [PSCustomObject]@{ TaskName = $task.TaskName Path = $task.TaskPath Command = $cmd.Trim() } } } if ($sensitiveTasks.Count -gt 0) { $result = "fail" $detail = "发现 $($sensitiveTasks.Count) 个含敏感关键词的计划任务" $reportDetail = $sensitiveTasks | ConvertTo-Json -Depth 3 }注意:此项默认不检查
Disabled状态任务,但可在custom_policy.json中添加"include_disabled": true扩展范围。生产环境建议开启,因攻击者常将任务设为Disabled等待触发条件。
3.6 Edge/Chrome 密码导出开关:浏览器凭据的“最后一道门”
Chrome/Edge 默认允许通过chrome://settings/passwords导出密码为 CSV,且无需二次认证。工具查:
- Chrome:
Get-ItemProperty -Path "HKCU:\\Software\\Google\\Chrome\\PreferenceMACs\\Default\\Preferences" -Name "password_manager_enabled"(实际查 Preferences 文件 JSON) - Edge:同理查
HKCU:\\Software\\Microsoft\\Edge\\PreferenceMACs\\Default\\Preferences - 更可靠方式:直接解析
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login DataSQLite 文件(需关闭浏览器),查logins表中blacklisted_by_user字段
# check_browser_passwords.ps1 片段(SQLite 方式,更准) $chromeDb = "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Login Data" $edgeDb = "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\Login Data" function Test-BrowserDb { param($dbPath) if (-not (Test-Path $dbPath)) { return $false } try { # 使用内置 System.Data.SQLite(PowerShell 5.1+ 自带) $conn = New-Object System.Data.SQLite.SQLiteConnection $conn.ConnectionString = "Data Source=$dbPath;Version=3;" $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText = "SELECT COUNT(*) FROM logins WHERE blacklisted_by_user = 0" $count = $cmd.ExecuteScalar() $conn.Close() return $count -gt 0 } catch { return $false } } if (Test-BrowserDb $chromeDb -or Test-BrowserDb $edgeDb) { $result = "fail" $detail = "Chrome 或 Edge 浏览器中存在未屏蔽的已保存密码(blacklisted_by_user=0)" }翻车预警:直接读取
Login Data需浏览器已关闭,否则 SQLite 数据库被锁。脚本中加入Stop-Process -Name "chrome", "msedge" -Force -ErrorAction SilentlyContinue强制结束,但会中断用户工作——这是唯一一项可能影响用户体验的操作,务必在检查前明确告知用户。
4. 避坑指南:6 条血泪换来的实操教训,省下你 3 小时排查时间
这套工具看似简单,但在上百台终端批量执行时,总有些“玄学”问题反复出现。以下是我在某省级政务云迁移项目中踩过的坑,按发生频率排序,每条都附带可立即验证的诊断命令。
4.1 现象:run_all_checks.ps1运行后卡在check_rdp_port.ps1,无报错无输出
原因:目标机 RDP 服务(TermService)处于Starting状态而非Running或Stopped,Get-Service TermService命令会无限等待超时(PowerShell 默认 30 秒)。
解决:在check_rdp_port.ps1开头添加超时控制:
$service = Get-Service -Name "TermService" -ErrorAction SilentlyContinue if (-not $service) { $result = "unknown"; $detail = "TermService 服务不存在"; return } # 添加超时逻辑 $timeout = 5 $sw = [System.Diagnostics.Stopwatch]::StartNew() while ($service.Status -eq "StartPending" -and $sw.Elapsed.TotalSeconds -lt $timeout) { Start-Sleep -Milliseconds 500 $service.Refresh() } if ($service.Status -eq "StartPending") { $result = "warn"; $detail = "TermService 启动超时,跳过 RDP 检查" }4.2 现象:HTML 报告中显示USB 存储:pass,但设备管理器里 USB 大容量存储控制器明明是启用的
原因:Get-PnpDevice -Class "USB"在某些 OEM 预装系统(如某品牌商用本)中因驱动签名问题返回空,导致漏检。
解决:fallback 到 WMI 查询:
# 替换原 Get-PnpDevice 行 $usbControllers = Get-WmiObject -Class Win32_PnPEntity | Where-Object { $_.PNPClass -eq "USB" -and ($_.Name -match "Mass Storage|Storage Device") }4.3 现象:check_unsignd_drivers.ps1报告fail,但driverquery /si手动执行却显示全为Signed
原因:Get-SystemDriver在 Windows 10 1809+ 版本中,对某些内核模块(如dxgkrnl.sys)返回SignatureLevel = ""(空字符串),被误判为未签名。
解决:增强判断逻辑,排除空值:
$unsignedDrivers = Get-SystemDriver | Where-Object { $_.SignatureLevel -and $_.SignatureLevel -notmatch "Signed|Unsigned|Authenticode" }4.4 现象:check_scheduled_tasks.ps1扫描极慢(单机耗时 > 2 分钟)
原因:Get-ScheduledTask默认查询所有任务历史(含已删除任务),数据量巨大。
解决:限定查询范围,只查当前启用的任务:
# 替换原 Get-ScheduledTask 行 $tasks = Get-ScheduledTask | Where-Object { $_.State -eq "Ready" -or $_.State -eq "Running" -or $_.State -eq "Disabled" } # 并添加超时:只查最近 30 天创建的任务 $tasks = $tasks | Where-Object { $_.Date -gt (Get-Date).AddDays(-30) }4.5 现象:check_browser_passwords.ps1报告fail,但用户坚称没存密码
原因:Chrome/Edge 会自动保存网站表单中带type="password"的字段,即使用户未点击“保存密码”按钮。
解决:增加人工确认环节,在报告中提供快速清理命令:
# 在 report.detail 中追加 $cleanupCmd = 'Remove-Item "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Login Data" -Force' $reportDetail += "`n快速清理命令(执行后需重启浏览器):$cleanupCmd"5. 定制化实战:如何把这份 zip 包变成你单位的“保密检查 SOP”
工具开箱即用,但真正落地要解决三个问题:策略适配、流程嵌入、结果闭环。我一般会用以下四步,把它从“一个脚本包”升级为“可审计、可追溯、可问责”的终端保密管理节点。
5.1 策略定制:用custom_policy.json替代“一刀切”基线
baseline_win10.json是通用起点,但你单位可能有特殊要求:比如允许财务部门启用剪贴板历史(需审批),但禁止所有终端使用 Edge 导出密码。这时不要改基线文件,而是新建custom_policy.json:
{ "name": "XX单位终端保密策略 V2.1", "description": "依据《XX单位信息系统终端安全管理规范》第3.2条", "items": [ { "id": "clipboard_history", "enabled": true, "severity": "medium", "whitelist_users": ["DOMAIN\\finance-*"] }, { "id": "browser_password_export", "enabled": true, "severity": "critical", "block_list": ["msedge.exe", "chrome.exe"] }, { "id": "usb_storage_disabled", "enabled": true, "severity": "high", "enforcement_mode": "strict" } ] }关键点:
whitelist_users支持通配符,block_list指定进程名,enforcement_mode控制检查深度(strict查注册表+设备管理器+WMI,basic只查注册表)。这样,同一份工具,在财务终端运行时clipboard_history项自动跳过,在普通终端则严格检查。
5.2 流程嵌入:用 Intune/SCCM/自建脚本实现“开机即查、离线即报”
不能指望管理员手动跑脚本。我们把它编译为.exe(用 PS2EXE)并部署为登录脚本:
# build_installer.ps1:将 PowerShell 打包为无依赖 EXE Invoke-Expression "& 'C:\ps2exe\ps2exe.ps1' -inputFile '.\scripts\run_all_checks.ps1' -outputFile '.\dist\terminal-check.exe' -noConsole -iconFile '.\icon.ico'"然后通过 Intune 部署:
- 检测规则:
Get-ChildItem "$env:USERPROFILE\AppData\Local\Temp\terminal-check\*.json" | Where-Object {$_.LastWriteTime -gt (Get-Date).AddHours(-24)} - 修复脚本:
Start-Process ".\dist\terminal-check.exe" -ArgumentList "-Baseline .\config\custom_policy.json -OutputDir $env:TEMP\terminal-check" - 上报方式:脚本运行完,自动将
report_*.json通过Invoke-RestMethodPOST 到内网 API(无需公网,走内网 HTTP),API 存入 SQLite 并触发邮件告警。
这样,终端每次开机,后台静默执行检查,结果 5 秒内入库,管理员看仪表盘就能知道“全单位 237 台终端,12 台 USB 策略失效,其中 3 台在财务部”。
5.3 结果闭环:用 HTML 报告生成“可签字、可归档”的检查凭证
report_*.html不是简单展示,而是按等保/分保要求生成结构化凭证:
| 检查项 | 状态 | 依据条款 | 检查方法 | 证据截图(可选) |
|---|---|---|---|---|
| USB 存储禁用 | pass | GB/T 22239-2019 5.2.3 | 注册表键值 + 设备管理器 | ✅(点击展开) |
| RDP NLA 启用 | fail | GM/T 0054-2018 6.4.2 | 注册表UserAuthentication=0 | ❌(需整改) |
生成逻辑在scripts\generate_html_report.ps1中,关键点:
- 所有“证据截图”由
SnippingTool.exe /clip截取当前窗口,Base64 编码嵌入 HTML,不产生临时文件 - “依据条款”字段从
config\custom_policy.json的reference字段读取,支持多标准并列:["GB/T 22239-2019 5.2.3", "ISO/IEC 27001:2022 A.8.2.3"] - 底部自动生成数字签名:
"报告生成时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | 生成主机:$env:COMPUTERNAME | 检查人:$env:USERNAME"
后悔药:某次迎检前发现 HTML 报告里“检查人”显示为
SYSTEM(因用系统服务运行),立刻在脚本开头加if ($env:USERNAME -eq "SYSTEM") { $env:USERNAME = "IT-SECURITY-AUTO" },5 分钟修复全量报告。
5.4 持续演进:把每次检查失败都变成策略更新的输入
工具的价值不在“查出问题”,而在“让问题不再重复发生”。我们在output/下建audit_log/目录,每次运行后,除生成报告外,还写入审计日志:
# run_all_checks.ps1 末尾追加 $logEntry = [PSCustomObject]@{ Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" Hostname = $env:COMPUTERNAME Username = $env:USERNAME Baseline = $Baseline FailCount = ($results | Where-Object {$_.status -eq "fail"}).Count WarnCount = ($results | Where-Object {$_.status -eq "warn"}).Count Details = $results | Where-Object {$_.status -ne "pass"} | ForEach-Object {"$($_.id): $($_.detail)"} -join "; " } $logEntry | Export-Csv -Path ".\output\audit_log\$(Get-Date -Format 'yyyy-MM')_daily_audit.csv" -Append -NoTypeInformation每月初,用 Excel 打开2024-11_daily_audit.csv,透视分析:
- 哪些检查项
FailCount持续前三?→ 重点优化对应 GPO 或下发补丁 - 哪些终端
WarnCount高但FailCount低?→ 可能是配置漂移,需加强配置基线固化 Details字段中高频词(如“NLA未启用”、“剪贴板同步”)→ 写入新员工安全培训 PPT 第 3 页
这就是我坚持用这个 zip 包的原因:它不黑盒、不收费、不绑定平台,每一次运行都在沉淀你单位的真实安全水位。它不会让你的终端“绝对安全”,但能让你清晰说出——“我们哪里不安全,为什么,以及下一步改哪一行注册表”。希望帮到你。
本文还有配套的精品资源,点击获取