怎么用脚本获取系统数字签名策略

wen 实用脚本 2

怎么用脚本获取系统数字签名策略(含实战脚本)

📖 目录导读

  1. 什么是数字签名策略?为什么需要获取它?
  2. 脚本获取的核心原理与准备工作
  3. 实战脚本:PowerShell 获取数字签名策略
  4. 实战脚本:Python + WMI 获取策略信息
  5. 常见问题与故障排查(含问答)
  6. 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 策略脚本查询、远程获取签名策略。 优化建议包含动作词**:“一文详解”“实战脚本”等。
  1. 结构清晰:使用目录、问答、代码块拆分内容,符合 Google 精选摘要偏好。
  2. 内链建议:关联“组策略管理”“Windows 安全基线”等话题。
  3. 外链注意:避免直接添加商业域名;若需引用官方文档,请使用 learn.microsoft.com 等权威域名。

执行建议

  • 在真实环境中,先测试脚本再批量部署。
  • 结合 SCCM 或 Intune 定期推送脚本,实现策略合规自动收集。
  • 对于 Windows Server 环境,建议同时检测 CIPolicyAppLocker 日志(事件 ID 3099/8006)。

抱歉,评论功能暂时关闭!