☰
终端保密检查工具:轻量级 PowerShell 策略扫描方案
2026/10/14 7:28:55 网站建设 项目流程

简介:终端保密检查工具是一款面向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 接口挂载存储。该工具检查三层:

  1. 组策略生效态(RemovableStorageAccess注册表键值)
  2. 设备管理器中 USB 大容量存储控制器是否启用(Get-PnpDevice -Class "USB" | Where-Object {$_.Name -like "*Mass Storage*"})
  3. 是否存在已连接但被隐藏的 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 存储禁用passGB/T 22239-2019 5.2.3注册表键值 + 设备管理器✅(点击展开)
RDP NLA 启用failGM/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 包的原因:它不黑盒、不收费、不绑定平台,每一次运行都在沉淀你单位的真实安全水位。它不会让你的终端“绝对安全”,但能让你清晰说出——“我们哪里不安全,为什么,以及下一步改哪一行注册表”。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询