Windows安全检查脚本开发实战:构建企业级安全评估工具
作者:DREAMVFIA UNION
日期:2026-02-05
版权声明:本文为原创文章,版权归属2026 DREAMVFIA UNION所有,转载需注明出处
一、引言:为什么企业需要自动化安全检查
在当今数字化浪潮席卷全球的时代背景下,网络安全已经从一个技术议题演变为关乎企业生存发展的核心战略问题。随着网络攻击手段的日益复杂化和智能化,传统的被动防御模式已经难以应对层出不穷的安全威胁。根据最新的网络安全报告显示,2025年全球范围内针对企业网络的攻击事件数量同比增长了47%,其中利用未修补漏洞的攻击占据了相当大的比例。对于企业而言,建立一套完善的安全检查机制,定期对IT系统进行全面的安全评估,已经成为不可或缺的基础性工作。
Windows操作系统作为全球市场份额最大的桌面操作系统,在企业环境中占据着举足轻重的地位。根据市场调研数据显示,超过75%的企业用户选择Windows作为主要的工作站和服务器操作系统。然而,Windows系统的复杂性也带来了安全配置的挑战。一个标准的企业Windows系统涉及数百个安全相关的配置项,包括账户策略、防火墙规则、审计策略、服务权限、加密设置等等。人工逐一检查这些配置项不仅耗时费力,而且容易遗漏,最终导致安全盲区的产生。
正是在这样的背景下,自动化安全检查工具应运而生。本文将详细介绍如何从零开始构建一个企业级的Windows安全检查脚本,涵盖需求分析、架构设计、代码实现、测试验证等完整的开发流程。通过本文的学习,读者将掌握PowerShell高级编程技巧,理解企业安全评估的方法论,并能够根据实际需求定制自己的安全检查工具。
二、项目需求分析与目标设定
2.1 深入分析自动化安全检查的必要性
在深入技术细节之前,我们有必要详细分析为什么企业需要自动化安全检查。从以下几个维度来阐述这个问题:
首先是效率问题的严峻性。 一个中等规模的企业通常拥有数百台甚至数千台Windows工作站和服务器。每台服务器需要检查的安全配置项少则几十项,多则上百项。以典型的50项检查为例,即使每项检查只需要30秒,50项检查就需要25分钟。100台服务器就需要超过40小时,这还不包括记录结果、生成报告、跟踪整改等后续工作。这样的工作量对于IT运维团队来说是难以承受的,通常会导致检查工作的拖延或流于形式。
其次是一致性问题的挑战。 人工检查容易受到检查人员经验水平、当时的精神状态、对标准的理解程度等多种因素的影响。同一个安全配置项,不同的检查人员可能得出不同的结论。有的检查人员可能因为对某个注册表键值不熟悉而判定为"正常",而实际上该配置存在安全隐患。自动化工具严格按照预设的逻辑执行,每次检查的结果都是可重复、可验证的,确保了检查标准的一致性和客观性。
第三是频率问题的困扰。 安全检查不应该是一次性的活动,而应该是持续性的工作。根据安全最佳实践和合规要求,企业应该至少每季度进行一次全面的安全评估,对于关键系统和敏感数据处理环节甚至需要每月或每周检查。依靠人工完成如此高频率的检查任务是不现实的,而自动化工具可以轻松实现定时执行、持续监控,还可以设置阈值告警,第一时间发现配置漂移。
第四是合规性要求的压力。 随着《网络安全法》、《数据安全法》、《个人信息保护法》以及GDPR等数据保护法规的日益严格,企业需要证明自己已经采取了充分的安全措施。自动化安全检查产生的标准化报告可以作为合规审计的重要证据,帮助企业应对网信部门、行业协会等监管机构的审查。同时,详尽的检查记录也便于追溯历史问题,展示整改成效。
2.2 核心功能目标的制定
基于以上分析,我们为这个安全检查工具设定了以下核心功能目标:
功能完整性目标涵盖八个核心领域。 工具需要覆盖Windows系统安全的主要方面,包括账户安全(密码策略、账户锁定、特权管理)、防火墙配置(配置文件状态、入站出站规则)、审计策略(登录审计、对象访问审计、系统事件审计)、网络安全(协议禁用、网络发现、远程访问)、系统更新(更新状态、自动更新配置)、服务安全(危险服务、启动类型、服务账户)、加密状态(BitLocker、EFS、TPM)、事件日志(日志大小、保留策略、访问权限)。最终版本应该能够执行50项以上的独立安全检查。
易用性目标追求零门槛使用。 工具的使用应该尽可能简单,即使是没有深厚PowerShell背景的系统管理员也能轻松上手。理想的用户体验是"下载-解压-双击运行"三步完成。支持命令行参数灵活配置,满足高级用户定制化需求。同时提供清晰的中文界面和详细的错误提示,降低使用门槛。
输出友好性目标注重多维度呈现。 工具需要提供多种格式的输出报告,包括控制台实时输出(适合快速查看)、HTML可视化报告(适合分享和展示)、CSV数据表格(适合导入Excel进行深度分析)。报告应该包含清晰的评分、详细的分类统计、问题清单、具体的修复建议和操作步骤,方便管理人员理解和采取行动。
可扩展性目标支持灵活定制。 工具的架构应该支持方便地添加新的检查项。不同的企业可能有不同的安全基线要求,部分企业可能需要增加等保2.0的检查项,部分企业可能需要检查特定的行业合规要求。模块化的设计使得添加新检查就像调用一个函数一样简单。
2.3 非功能性需求的考量
除了功能目标,我们还需要考虑以下非功能性需求:
性能目标要求高效执行。 完整的安全检查应该在5分钟内完成,快速检查应该在1分钟内完成。工具本身不应该对目标系统造成明显的性能负担,检查过程中的CPU和内存占用应该保持在合理范围内。对于需要远程执行的场景,还需要考虑网络延迟对执行时间的影响。
兼容性目标覆盖主流版本。 工具应该支持当前主流的Windows版本,包括Windows 10(21H2、22H2)、Windows 11(22H2、23H2)、Windows Server 2019、Windows Server 2022等。同时需要兼容PowerShell 5.1及以上版本,这是大多数Windows 10/Server 2016及以上系统的默认版本。
安全性目标确保工具本身安全。 工具只读不写,不会修改任何系统配置。工具不收集任何敏感信息,检查结果默认保存在本地。代码完全开源,用户可以审查每一行代码,确保没有后门或恶意行为。
三、系统架构设计与技术选型
3.1 整体架构设计
经过仔细的需求分析和技术选型,我们采用了模块化的架构设计。整个系统由以下几个核心模块组成:
配置解析模块负责处理命令行参数。 使用PowerShell的参数绑定特性实现,支持多种参数组合的灵活配置。主要参数包括-ExportCSV(导出CSV格式报告)、-ExportHTML(导出HTML格式报告)、-OutputPath(指定输出路径)。通过开关参数(switch)来控制可选功能,这样命令行界面既简洁又灵活。
颜色主题模块定义了统一的视觉方案。 使用RGB颜色值定义了一组终端显示颜色,包括主色调红色(#DC143C)、成功绿色(#00FF00)、警告黄色(#FFFF00)、白色(#FFFFFF)、银灰色(#C0C0C0)。这些颜色在黑底色的PowerShell终端中具有良好的可读性和辨识度,帮助用户快速定位不同级别的检查结果。
结果存储模块采用数组结构。 使用PowerShell数组存储所有的检查结果。每条检查结果是一个结构化的对象,包含分类(Category)、检查项名称(CheckItem)、状态标识(Status)、详细描述(Description)、修复建议(Recommendation)、检查时间戳(Timestamp)、风险等级(RiskLevel)等字段。这种结构化的数据存储方式便于后续的统计分析和报告生成。
检查执行模块是系统的核心引擎。 包含八大类检查函数,每个函数负责特定领域的安全检查,返回结构化的检查结果。我们采用函数式编程的设计理念,每个函数都是独立的,可以单独调用和测试。函数之间通过全局数组进行数据传递,降低了耦合度。
报告生成模块负责输出格式化结果。 根据存储的检查结果,生成用户需要格式的输出报告。支持HTML和CSV两种格式,HTML报告包含完整的CSS样式定义,可以直接在浏览器中查看,具有良好的视觉效果和交互体验。
主控制流程负责协调各模块的执行顺序。 依次调用各检查函数,输出总体进度信息,计算并显示最终的安全评分。同时检测当前是否以管理员身份运行,对于需要高权限的检查项给出警告。
3.2 核心数据结构的详细设计
为了确保数据的一致性、可分析性和可扩展性,我们精心设计了检查结果的数据结构:
# 检查结果对象的完整结构定义
$checkResult = [PSCustomObject]@{
# 分类维度:如"账户安全"、"防火墙配置"、"审计策略"等
Category = [string]
# 检查项名称:如"密码复杂度要求"、"Guest账户状态"等
CheckItem = [string]
# 状态标识:使用Emoji符号,如✅通过、⚠️警告、❌失败
Status = [string]
# 详细描述:说明当前配置的具体情况
Description = [string]
# 修复建议:提供具体的操作步骤或命令
Recommendation = [string]
# 检查时间:格式化为"yyyy-MM-dd HH:mm:ss"
Timestamp = [datetime]
# 风险等级:High高风险、Medium中风险、Low低风险
RiskLevel = [string]
# 合规控制编号:可选,用于关联合规标准如ISO 27001
ControlID = [string]
}
这个数据结构的设计考虑了以下几个重要因素:
首先是完整性原则。 每条检查结果都包含必要的信息,用户不需要额外的上下文就能理解问题的全貌。Category帮助用户理解问题属于哪个领域,Description提供详细说明,Recommendation给出具体的行动指南。即使是完全不熟悉某个技术领域的管理员,也能根据报告中的信息采取正确的整改措施。
其次是可分析性原则。 结构化的数据便于进行统计分析。我们可以轻松地按Category分组统计各领域的通过率、按Status筛选出所有问题项、按RiskLevel排序优先处理高风险问题。这些操作对于生成汇总报告至关重要。
最后是可扩展性原则。 预留了一些可选字段,如ControlID用于关联合规标准(如ISO 27001的A.9.2.1条款),RiskLevel用于更精细的风险评估。这些字段在基础版本中可以不使用,但在需要时可以直接添加。
3.3 函数命名规范与代码风格
良好的命名规范对于代码的可维护性至关重要。我们在项目中建立了以下规范:
检查函数的命名规范。 使用Test-[Category]的形式,如Test-AccountSecurity(账户安全检查)、Test-FirewallStatus(防火墙状态检查)、Test-NetworkSecurity(网络安全检查)、Test-SystemUpdates(系统更新检查)等。这种命名方式清晰地表明这是一个测试或检查函数,通过返回值或输出对象告知检查结果。
辅助函数的命名规范。 使用动词-名词的描述性形式,如Write-Header(输出分隔标题)、Add-CheckResult(添加检查结果)、Generate-HTMLReport(生成HTML报告)等。辅助函数遵循短小精悍的设计原则,每个函数只做一件事。
常量和配置的组织方式。 使用PowerShell的哈希表(Hashtable)存储配置信息,如颜色方案、风险阈值、默认路径等。这种方式便于统一修改和维护,也符合PowerShell的惯用风格。
# 颜色方案配置 - 统一的视觉风格
$colors = @{
Red = "#DC143C" # 主色调 - 用于标题、警告、失败
DarkRed = "#8B0000" # 深红色 - 用于次要强调
Green = "#00FF00" # 成功绿色 - 用于通过状态
Yellow = "#FFFF00" # 警告黄色 - 用于提示信息
White = "#FFFFFF" # 白色 - 用于正文
Silver = "#C0C0C0" # 银灰色 - 用于次要信息
}
# 默认输出路径配置
$config = @{
OutputPath = ".SecurityReport"
MaxLogSizeMB = 100
MinPasswordLen = 12
MaxPasswordAge = 90
LockoutThreshold = 5
}
四、核心功能实现详解
4.1 基础框架搭建
首先,我们定义脚本的基础框架,包括参数解析、颜色配置、全局变量初始化等:
#===============================================================================
# Windows Security Hardening Check Script
# 企业安全加固检查脚本
# Version: 1.0
# Author: DREAMVFIA UNION
# Date: 2026-02-05
#===============================================================================
param(
[switch]$ExportCSV, # 导出CSV格式报告
[switch]$ExportHTML, # 导出HTML格式报告
[string]$OutputPath = ".SecurityReport" # 输出路径
)
#-------------------------------------------------------------------------------
# 全局配置
#-------------------------------------------------------------------------------
# 颜色定义 - 用于控制台输出可视化
$colors = @{
Red = "#DC143C" # 主色调
DarkRed = "#8B0000" # 深红色
Green = "#00FF00" # 成功绿色
Yellow = "#FFFF00" # 警告黄色
White = "#FFFFFF" # 白色
Silver = "#C0C0C0" # 银灰色
}
# 检查结果数组 - 存储所有的检查结果
$checkResults = @()
# 统一的时间戳格式
$script:timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# 统计数据初始化
$script:stats = @{
Passed = 0
Warning = 0
Failed = 0
Total = 0
Score = 0
}
这个基础框架虽然简洁,但包含了几个重要的设计决策:
参数设计使用开关参数。 PowerShell的开关参数(switch)用于布尔值的控制,不需要传递具体的值,简化了命令行使用。$OutputPath参数提供了默认值,用户可以在需要时自定义输出位置,体现了配置的灵活性。
颜色配置外置化管理。 将颜色配置放在哈希表中,方便统一修改和维护。如果需要调整主题风格或适配不同的终端背景色,只需要修改这个哈希表中的RGB值。这种方式符合DRY(Don’t Repeat Yourself)原则,避免在代码中硬编码颜色值。
全局状态统一管理。 使用全局变量($script:作用域)存储检查结果数组和统计数据,确保从任何函数中都可以访问和修改。这种方式虽然简单直接,但在小规模脚本中是完全可接受的。
4.2 辅助函数的实现
接下来实现两个核心的辅助函数,它们将在整个脚本中被频繁调用:
#-------------------------------------------------------------------------------
# Write-Header 函数
# 功能:输出一致的分隔标题
# 参数:$Message - 要显示的标题文本
#-------------------------------------------------------------------------------
function Write-Header {
param([string]$Message)
$line = "=" * 60
Write-Host ""
Write-Host $line -ForegroundColor $colors.Red
Write-Host " $Message" -ForegroundColor $colors.Yellow
Write-Host $line -ForegroundColor $colors.Red
}
#-------------------------------------------------------------------------------
# Add-CheckResult 函数
# 功能:添加结构化的检查结果
#-------------------------------------------------------------------------------
function Add-CheckResult {
param(
[Parameter(Mandatory=$true)]
[string]$Category,
[Parameter(Mandatory=$true)]
[string]$CheckItem,
[Parameter(Mandatory=$true)]
[string]$Status,
[Parameter(Mandatory=$true)]
[string]$Description,
[Parameter(Mandatory=$true)]
[string]$Recommendation
)
# 创建检查结果对象
$result = [PSCustomObject]@{
Category = $Category
CheckItem = $CheckItem
Status = $Status
Description = $Description
Recommendation = $Recommendation
Timestamp = $script:timestamp
}
# 添加到全局结果数组
$script:checkResults += $result
# 更新统计信息
$script:stats.Total++
if ($Status -match "✅") {
$script:stats.Passed++
} elseif ($Status -match "⚠️") {
$script:stats.Warning++
} else {
$script:stats.Failed++
}
return $result
}
Write-Header函数提供了统一的视觉风格,让用户清楚地知道当前正在执行什么检查。60个等号的分隔线在黑底终端中非常醒目,有助于区分不同的功能模块。
Add-CheckResult函数是数据收集的核心枢纽。每调用一次这个函数,就会向结果数组中添加一条完整的检查记录,并同步更新统计计数器。
4.3 账户安全检查实现
账户安全是Windows系统安全的基石。我们的检查函数覆盖了密码策略、账户锁定、Guest账户、管理员账户等多个关键方面:
#===============================================================================
# Test-AccountSecurity 函数
# 功能:检查Windows系统的账户安全配置
#===============================================================================
function Test-AccountSecurity {
Write-Header "🔐 账户安全检查"
# 1.1 检查是否启用密码复杂度要求
$passwordPolicy = net accounts | Select-String "复杂性"
$complexityEnabled = $passwordPolicy -and ($passwordPolicy -match "已启用")
Add-CheckResult `
-Category "账户安全" `
-CheckItem "密码复杂度要求" `
-Status $(if ($complexityEnabled) { "✅ 通过" } else { "⚠️ 未启用" }) `
-Description "检查Windows密码是否启用复杂度要求。密码复杂度要求强制用户使用包含大写字母、小写字母、数字和特殊字符的密码。" `
-Recommendation "运行 secpol.msc → 账户策略 → 密码策略 → 设置'密码必须符合复杂性要求'为'已启用'"
# 1.2 检查密码最短长度配置
$minPasswordLength = (Get-CimInstance -ClassName Win32_ComputerSystem).MinPasswordLength
Add-CheckResult `
-Category "账户安全" `
-CheckItem "密码最短长度" `
-Status $(if ($minPasswordLength -ge 12) { "✅ 通过" } else { "⚠️ 建议12位以上" }) `
-Description "当前系统设置的密码最短长度为:$minPasswordLength 位。建议至少设置为12位。" `
-Recommendation "在组策略中设置:计算机配置 → Windows设置 → 安全设置 → 账户策略 → 密码策略 → 密码长度最小值:12个字符"
# 1.3 检查密码最长使用期限
$maxPasswordAge = (Get-CimInstance -ClassName Win32_OperatingSystem).MaxPasswordAge
Add-CheckResult `
-Category "账户安全" `
-CheckItem "密码最长使用期限" `
-Status $(if ($maxPasswordAge -and $maxPasswordAge -le 90) { "✅ 通过" } else { "⚠️ 建议90天内更换" }) `
-Description "当前密码最长使用期限为:$maxPasswordAge 天。密码不应设置永久有效。" `
-Recommendation "建议将密码最长使用期限设置为不超过90天"
# 1.4 检查是否禁用Guest账户
$guestUser = Get-LocalUser -Name "Guest" -ErrorAction SilentlyContinue
$guestDisabled = $guestUser -and (-not $guestUser.Enabled)
Add-CheckResult `
-Category "账户安全" `
-CheckItem "Guest账户状态" `
-Status $(if ($guestDisabled) { "✅ 已禁用" } else { "⚠️ 未禁用" }) `
-Description "Guest账户允许匿名访问系统,是潜在的安全风险。" `
-Recommendation "运行以下命令禁用Guest账户:net user guest /active:no"
# 1.5 检查管理员账户是否已重命名
$adminUser = Get-LocalUser -Name "Administrator" -ErrorAction SilentlyContinue
$defaultAdminExists = $adminUser -and ($adminUser.Name -eq "Administrator")
Add-CheckResult `
-Category "账户安全" `
-CheckItem "默认管理员账户" `
-Status $(if (-not $defaultAdminExists) { "✅ 已重命名" } else { "⚠️ 建议重命名" }) `
-Description "检查默认的Administrator账户是否已经重命名。" `
-Recommendation "建议将Administrator重命名为不易猜测的名称"
# 1.6 检查账户锁定策略配置
$lockoutPolicy = net accounts | Select-String "锁定阈值"
$lockoutThreshold = if ($lockoutPolicy) {
($lockoutPolicy -split ':')[1].Trim()
} else { "未设置" }
Add-CheckResult `
-Category "账户安全" `
-CheckItem "账户锁定阈值" `
-Status $(if ($lockoutThreshold -match "d+" -and [int]$lockoutThreshold -le 5) { "✅ 安全" } else { "⚠️ 建议5次失败后锁定" }) `
-Description "当前账户锁定阈值为:$lockoutThreshold 次失败尝试后锁定账户。" `
-Recommendation "建议设置为5次失败尝试后锁定,锁定时间建议设置为30分钟"
# 1.7 检查管理员账户数量
$adminGroup = Get-LocalGroupMember -Group "Administrators" -ErrorAction SilentlyContinue
$adminCount = ($adminGroup | Where-Object { $_.ObjectClass -eq "User" }).Count
Add-CheckResult `
-Category "账户安全" `
-CheckItem "管理员账户数量" `
-Status $(if ($adminCount -le 3) { "✅ 合理" } else { "⚠️ 建议审查" }) `
-Description "当前Administrators组中包含 $adminCount 个用户账户。" `
-Recommendation "建议定期审查管理员账户,移除不再需要的账户,遵循最小权限原则"
Write-Host " 账户安全检查完成,发现 $($script:stats.Warning + $script:stats.Failed) 项需要关注" -ForegroundColor $colors.Green
}
4.4 防火墙状态检查实现
#===============================================================================
# Test-FirewallStatus 函数
# 功能:检查Windows防火墙的配置状态
#===============================================================================
function Test-FirewallStatus {
Write-Header "🛡️ 防火墙配置检查"
# 检查所有防火墙配置文件的状态
$firewallProfile = Get-NetFirewallProfile -ErrorAction SilentlyContinue
if ($firewallProfile) {
foreach ($profile in $firewallProfile) {
$status = if ($profile.Enabled) { "✅ 已启用" } else { "⚠️ 未启用" }
Add-CheckResult `
-Category "防火墙配置" `
-CheckItem "$($profile.Name)防火墙" `
-Status $status `
-Description "$($profile.Name)防火墙当前状态为:$($profile.Enabled)" `
-Recommendation $(if (-not $profile.Enabled) {
"运行:Set-NetFirewallProfile -Profile $($profile.Name) -Enabled True"
})
}
}
# 检查防火墙是否配置为阻止所有入站连接
$domainProfile = Get-NetFirewallProfile -Name Domain -ErrorAction SilentlyContinue
if ($domainProfile) {
$blockInbound = $domainProfile.DefaultInboundAction -eq "Block"
Add-CheckResult `
-Category "防火墙配置" `
-CheckItem "入站连接默认策略" `
-Status $(if ($blockInbound) { "✅ 安全" } else { "⚠️ 建议阻止" }) `
-Description "Domain配置文件的默认入站策略为:$($domainProfile.DefaultInboundAction)" `
-Recommendation "建议将默认入站策略设置为阻止(Block)"
}
Write-Host " 防火墙检查完成" -ForegroundColor $colors.Green
}
4.5 审计策略检查实现
#===============================================================================
# Test-AuditPolicy 函数
# 功能:检查Windows审计策略的配置
#===============================================================================
function Test-AuditPolicy {
Write-Header "📋 审计策略检查"
$auditPolicies = @(
"审核账户登录事件",
"审核账户管理",
"审核登录事件",
"审核对象访问",
"审核策略更改",
"审核特权使用",
"审核系统事件"
)
$subcategoryMapping = @{
"审核账户登录事件" = "Audit Account Logon"
"审核账户管理" = "Audit Account Management"
"审核登录事件" = "Audit Logon"
"审核对象访问" = "Audit Object Access"
"审核策略更改" = "Audit Policy Change"
"审核特权使用" = "Audit Privilege Use"
"审核系统事件" = "Audit System Events"
}
foreach ($policy in $auditPolicies) {
$subcategory = $subcategoryMapping[$policy]
try {
$auditSetting = auditpol /get /subcategory:"$subcategory" /r |
ConvertFrom-Csv |
Select-Object -First 1
$isSuccess = $auditSetting.Success -eq "成功"
$isFailure = $auditSetting.Failure -eq "失败"
$status = "❌ 未配置"
if ($isSuccess -and $isFailure) {
$status = "✅ 成功+失败"
} elseif ($isSuccess) {
$status = "✅ 仅成功"
} elseif ($isFailure) {
$status = "⚠️ 仅失败"
}
Add-CheckResult `
-Category "审计策略" `
-CheckItem $policy `
-Status $status `
-Description "$subcategory 审计设置:成功=$($auditSetting.Success), 失败=$($auditSetting.Failure)" `
-Recommendation "建议同时启用成功和失败的审核"
}
catch {
Add-CheckResult `
-Category "审计策略" `
-CheckItem $policy `
-Status "❌ 无法检查" `
-Description "无法获取审计策略设置,需要管理员权限" `
-Recommendation "请以管理员身份重新运行此脚本"
}
}
Write-Host " 审计策略检查完成" -ForegroundColor $colors.Green
}
4.6 网络安全检查实现
#===============================================================================
# Test-NetworkSecurity 函数
# 功能:检查Windows系统的网络安全配置
#===============================================================================
function Test-NetworkSecurity {
Write-Header "🌐 网络安全检查"
# 4.1 检查SMBv1协议状态
$smb1Status = Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -ErrorAction SilentlyContinue
$smb1Disabled = $smb1Status -and ($smb1Status.State -eq "Disabled")
Add-CheckResult `
-Category "网络安全" `
-CheckItem "SMBv1协议" `
-Status $(if ($smb1Disabled) { "✅ 已禁用" } else { "⚠️ 建议禁用" }) `
-Description "SMBv1协议在2017年WannaCry勒索软件攻击中被广泛利用,存在严重安全漏洞。" `
-Recommendation "运行:Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart"
# 4.2 检查自动播放功能
$autoPlay = Get-ItemProperty `
-Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionpoliciesExplorer" `
-Name "NoDriveTypeAutoRun" `
-ErrorAction SilentlyContinue
$autoPlayDisabled = $autoPlay -and ($autoPlay.NoDriveTypeAutoRun -eq 255)
Add-CheckResult `
-Category "网络安全" `
-CheckItem "自动播放功能" `
-Status $(if ($autoPlayDisabled) { "✅ 已禁用" } else { "⚠️ 建议禁用" }) `
-Description "自动播放可能自动执行恶意软件" `
-Recommendation "建议禁用自动播放功能"
# 4.3 检查远程桌面状态
$rdpEnabled = (Get-ItemProperty `
-Path "HKLM:SYSTEMCurrentControlSetControlTerminal Server" `
-Name "fDenyTSConnections" `
-ErrorAction SilentlyContinue).fDenyTSConnections
Add-CheckResult `
-Category "网络安全" `
-CheckItem "远程桌面" `
-Status $(if ($rdpEnabled -eq 1) { "✅ 已禁用" } else { "⚠️ 已启用" }) `
-Description "远程桌面连接状态" `
-Recommendation "如非必要,建议禁用远程桌面;如需使用,务必启用NLA和网络级别身份验证"
Write-Host " 网络安全检查完成" -ForegroundColor $colors.Green
}
五、报告生成系统的设计与实现
5.1 汇总统计与评分计算
#===============================================================================
# Generate-Summary 函数
# 功能:计算安全评分并输出汇总信息
#===============================================================================
function Generate-Summary {
Write-Header "📊 检查结果汇总"
$passedCount = ($script:checkResults | Where-Object { $_.Status -match "✅" }).Count
$warningCount = ($script:checkResults | Where-Object { $_.Status -match "⚠️" }).Count
$failedCount = ($script:checkResults | Where-Object { $_.Status -match "❌" }).Count
$totalCount = $script:checkResults.Count
if ($totalCount -gt 0) {
$script:stats.Score = [math]::Round(($passedCount / $totalCount) * 100, 1)
}
Write-Host ""
Write-Host " 🔍 安全检查完成!" -ForegroundColor $colors.White
Write-Host " ───────────────────────────────────────────" -ForegroundColor $colors.Silver
Write-Host " ✅ 通过:$passedCount 项" -ForegroundColor $colors.Green
Write-Host " ⚠️ 警告:$warningCount 项" -ForegroundColor $colors.Yellow
Write-Host " ❌ 失败:$failedCount 项" -ForegroundColor $colors.Red
Write-Host " ───────────────────────────────────────────" -ForegroundColor $colors.Silver
Write-Host " 📊 总计:$totalCount 项检查" -ForegroundColor $colors.White
Write-Host ""
$riskLevel = if ($script:stats.Score -ge 90) { "🟢 低风险" }
elseif ($script:stats.Score -ge 80) { "🟡 中低风险" }
elseif ($script:stats.Score -ge 70) { "🟠 中等风险" }
elseif ($script:stats.Score -ge 60) { "🟠 中高风险" }
else { "🔴 高风险" }
Write-Host " 安全评分:$($script:stats.Score) 分 / 100 分" -ForegroundColor $(if ($script:stats.Score -ge 80) { $colors.Green } elseif ($script:stats.Score -ge 60) { $colors.Yellow } else { $colors.Red })
Write-Host " 风险等级:$riskLevel" -ForegroundColor $colors.White
Write-Host ""
}
六、使用指南与最佳实践
6.1 快速开始
环境要求:
- 操作系统:Windows 10/11, Windows Server 2016+
- PowerShell:版本 5.1 或更高
- 权限:管理员权限(用于完整检查)
使用步骤:
# 1. 允许PowerShell脚本执行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
# 2. 运行安全检查
cd D:security-checklistscripts
.Windows-Security-Check.ps1
# 3. 生成HTML报告
.Windows-Security-Check.ps1 -ExportHTML -ExportCSV
6.2 评分标准
| 评分范围 | 风险等级 | 建议 |
|---|---|---|
| 90-100分 | 🟢 低风险 | 优秀,保持当前状态 |
| 80-89分 | 🟡 中低风险 | 良好,修复警告项 |
| 70-79分 | 🟠 中等风险 | 一般,需重点改进 |
| 60-69分 | 🟠 中高风险 | 较差,建议全面加固 |
| <60分 | 🔴 高风险 | 危险,需立即修复 |
七、总结与展望
本文详细介绍了如何从零开始构建一个企业级的Windows安全检查脚本。通过这个项目,我们展示了PowerShell在企业安全运维中的强大应用。工具的核心价值体现在以下几个方面:
第一,自动化大幅提升效率。 原本需要IT人员花费数小时手工检查的工作,现在只需要几分钟即可自动完成。
第二,标准化确保一致性。 统一的检查标准和评分体系,确保每次评估的结果具有可比性。
第三,可视化便于理解。 HTML报告提供了直观的可视化展示,方便非技术人员理解安全状况。
第四,可扩展适应变化。 模块化的架构设计使得工具可以方便地添加新的检查项,适应不断变化的安全需求。
项目文件结构:
D:security-checklist
├── README.md # 主文档
├── docs/
│ ├── 使用指南.md # 详细使用说明
│ ├── 最佳实践.md # 安全加固指南
│ └── 常见问题.md # FAQ问答
├── scripts/
│ ├── Windows-Security-Check.ps1 # 完整检查脚本(50+项)
│ └── Quick-Check.ps1 # 快速检查脚本(15项)
├── templates/
│ ├── Security-Assessment-Template.csv # Excel评估模板
│ └── Compliance-Checklist.csv # ISO 27001合规清单
└── sales-page/
└── index.html # 销售落地页
🔒 企业安全检查清单系统 | DREAMVFIA UNION
© 2026 DREAMVFIA UNION. All Rights Reserved.









