怎么用脚本获取系统数字签名策略(含实战脚本)
📖 目录导读
- 什么是数字签名策略?为什么需要获取它?
- 脚本获取的核心原理与准备工作
- 实战脚本:PowerShell 获取数字签名策略
- 实战脚本:Python + WMI 获取策略信息
- 常见问题与故障排查(含问答)
- SEO优化总结与最佳实践
什么是数字签名策略?为什么需要获取它?
数字签名策略(Code Signing Policy)是 Windows 系统中用于控制可执行文件签名验证的一组规则,它决定了系统如何对待未签名、签名被篡改或证书无效的应用程序,在 Windows 10/11 和企业域环境中,这一策略通常通过组策略(GPO)或注册表来管理。

关键策略项说明
- Windows Defender 应用程序控制(WDAC):白名单规则,仅允许签名或哈希匹配的软件运行。
- AppLocker:基于路径、发布者、哈希的应用程序限制。
- UAC 签名验证:管理员权限提升时是否要求签名。
为什么需要通过脚本获取?
手动查看策略耗时且易出错,尤其在大型企业环境或批量排查时,脚本可自动化提取每个终端的策略状态,便于合规审计与安全基线检查。
脚本获取的核心原理与准备工作
数据来源
- 注册表路径:
HKLM\SOFTWARE\Policies\Microsoft\Windows\CodeIntegrity
存储 WDAC 策略启用状态与配置文件路径。 - WMI 类:
ROOT\Microsoft\Windows\DeviceGuard下的Win32_DeviceGuard
提供是否启用基于虚拟化的安全(VBS)和代码完整性。 - 组策略结果工具:
gpresult /h report.html
可导出完整策略报告,但需解析 HTML 部分。
所需权限
- 普通脚本(读取注册表):管理员权限(部分策略需 SYSTEM 权限)。
- WMI 查询:本地管理员 或使用域服务账户。
- 远程执行:需启用 WinRM 并配合凭证。
环境要求
- PowerShell 5.1+ 或 Python 3.6+(需安装
wmi库)。 - 操作系统:Windows 10/11、Windows Server 2016+。
实战脚本:PowerShell 获取数字签名策略
以下脚本将读取关键注册表项,检测 WDAC 与 AppLocker 状态,并输出结构化结果。
# Get-CodeSignPolicy.ps1
[CmdletBinding()]
param()
$Output = [PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
WDAC_Enabled = $null
WDAC_PolicyPath = $null
AppLocker_Enabled = $null
SignatureRequired = $null
LastPolicyUpdate = $null
}
# 1. 检测 WDAC 注册表项
$WDACPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CodeIntegrity"
if (Test-Path $WDACPath) {
$Policy = Get-ItemProperty -Path $WDACPath -Name "Enabled" -ErrorAction SilentlyContinue
if ($Policy.Enabled -eq 1) {
$Output.WDAC_Enabled = $true
$Output.WDAC_PolicyPath = (Get-ItemProperty -Path $WDACPath -Name "PolicyFileName" -ErrorAction SilentlyContinue).PolicyFileName
} else {
$Output.WDAC_Enabled = $false
}
}
# 2. 检测 AppLocker 服务状态
$AppLockerSvc = Get-Service -Name "AppIDSvc" -ErrorAction SilentlyContinue
if ($AppLockerSvc -and $AppLockerSvc.Status -eq "Running") {
$Output.AppLocker_Enabled = $true
} else {
$Output.AppLocker_Enabled = $false
}
# 3. 检测 UAC 签名要求(注册表)
$UACPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
$UACVal = (Get-ItemProperty -Path $UACPath -Name "EnableLUA" -ErrorAction SilentlyContinue).EnableLUA
if ($UACVal -eq 1) {
$SigReq = (Get-ItemProperty -Path $UACPath -Name "ValidateAdminCodeSignatures" -ErrorAction SilentlyContinue).ValidateAdminCodeSignatures
$Output.SignatureRequired = if ($SigReq -eq 1) { $true } else { $false }
}
# 4. 输出结果
$Output | Format-List
用法:以管理员身份运行 PowerShell,执行 . .\Get-CodeSignPolicy.ps1。
实战脚本:Python + WMI 获取策略信息
当需要远程批量收集时,Python 脚本配合 WMI 更灵活,以下示例使用 wmi 库查询 Win32_DeviceGuard。
# get_code_sign_policy.py
import wmi
import sys
def get_device_guard_status(computer='localhost', user=None, password=None):
try:
if computer == 'localhost':
c = wmi.WMI()
else:
c = wmi.WMI(computer=computer, user=user, password=password)
# 查询 DeviceGuard 信息
dg = c.Win32_DeviceGuard()[0]
return {
'Computer': computer,
'VirtualizationBasedSecurityEnabled': dg.VirtualizationBasedSecurityStatus,
'CodeIntegrityEnabled': dg.CodeIntegrityStatus,
'SecureBootEnabled': dg.SecureBootStatus
}
except Exception as e:
return {'Error': f'{computer}: {str(e)}'}
if __name__ == '__main__':
# 支持远程参数传递
target = sys.argv[1] if len(sys.argv) > 1 else 'localhost'
result = get_device_guard_status(target)
for k, v in result.items():
print(f'{k}: {v}')
依赖安装:pip install wmi pywin32
远程执行示例:
python get_code_sign_policy.py 192.168.1.100
常见问题与故障排查(含问答)
❓ 问题1:脚本返回 WDAC_Enabled 为 $false,但组策略确实配置了策略,为什么?
答:WDAC 策略可能通过“驱动签名策略”或“托管安装器”应用,而非注册表直接标记,建议同时检查 C:\Windows\System32\CodeIntegrity\CiPolicies\Active 下是否存在 .p7b 策略文件。
❓ 问题2:Python 脚本报错 Access denied(拒绝访问)
答:WMI 远程查询需要目标机器开启 Windows Management Instrumentation 服务 并在防火墙允许,如果是域环境,确保账户有 Distributed COM Users 组权限;工作组环境建议使用本地管理员账户。
❓ 问题3:如何将结果导出为 CSV 用于审计?
答:在 PowerShell 脚本结尾追加:
$Output | Export-Csv -Path "C:\Audit\CodeSigPolicy.csv" -NoTypeInformation
❓ 问题4:脚本能否检测“是否要求EV证书签名”?
答:Windows 不直接暴露此配置接口,可通过检查 HKLM:\SYSTEM\CurrentControlSet\Control\CI\Policy\VerifiedAndReputablePolicyState 的值为 1 来判断是否启用了“Microsoft 信任签名的应用程序”规则。
SEO优化总结与最佳实践
文章关键词覆盖
- 核心关键词:脚本获取数字签名策略、Windows 代码签名验证、PowerShell 获取策略、Python WMI 签名策略。
- 长尾词:如何检查 WDAC 是否启用、AppLocker 策略脚本查询、远程获取签名策略。 优化建议包含动作词**:“一文详解”“实战脚本”等。
- 结构清晰:使用目录、问答、代码块拆分内容,符合 Google 精选摘要偏好。
- 内链建议:关联“组策略管理”“Windows 安全基线”等话题。
- 外链注意:避免直接添加商业域名;若需引用官方文档,请使用
learn.microsoft.com等权威域名。
执行建议
- 在真实环境中,先测试脚本再批量部署。
- 结合 SCCM 或 Intune 定期推送脚本,实现策略合规自动收集。
- 对于 Windows Server 环境,建议同时检测
CIPolicy和AppLocker日志(事件 ID 3099/8006)。