如何将SIPolicy.p7b转回XML并检测是否包含Rule 3(Audit Mode)
WDAC SIPolicy.p7b 转换与状态检测 PowerShell 实现方案
核心问题1:二进制SIPolicy.p7b转XML的官方实现
不需要逆向解析二进制格式,Windows 内置的ConfigCI模块原生支持编译后WDAC策略的反向转换,兼容Win10 1909+、Win11、Server 2022及以上系统,低版本系统安装对应版本RSAT的WDAC管理组件即可使用。
转换命令如下,转换得到的XML与策略编译前的原始XML规则、配置完全一致,无字段丢失:
# 导入WDAC管理模块 Import-Module ConfigCI -ErrorAction Stop # 执行p7b到XML的转换 ConvertFrom-CIPolicy -BinaryFilePath "C:\Windows\System32\CodeIntegrity\SIPolicy.p7b" -XmlFilePath "C:\temp\converted_policy.xml"
核心问题2:直接检测SIPolicy.p7b的运行模式(Audit/Enforce/Disabled)
你之前用哈希比对的方案存在天然兼容性缺陷:不同系统版本编译的同规则p7b文件会包含签名、版本标识等差异字节,哈希值无法保持一致,不建议使用。
不需要用户提供原始XML、不需要硬编码路径,直接读取系统生效的p7b文件即可完成检测,推荐两种实现方式:
方法1:官方模块检测(准确率100%,推荐)
利用ConvertFrom-CIPolicy支持输出到内存的特性,不需要落地临时文件,直接解析XML对象判断规则项即可,完全适配GUI工具无交互的检测需求:
function Get-WDACPolicyStatus { param( [string]$DeployedPolicyPath = "C:\Windows\System32\CodeIntegrity\SIPolicy.p7b" ) # 匹配Disabled状态 if (-not (Test-Path $DeployedPolicyPath)) { return "Disabled" } try { Import-Module ConfigCI -ErrorAction Stop # 二进制策略直接转内存XML对象,不写入磁盘 [xml]$policy = ConvertFrom-CIPolicy -BinaryFilePath $DeployedPolicyPath # 检测Rule Option 3(Audit Mode)是否启用 $auditRule = $policy.SiPolicy.Rules | Where-Object { $_.Rule.Option -eq "3" -and $_.Rule.Name -eq "Enabled:Audit Mode" } return $auditRule ? "Audit Mode" : "Enforce Mode" } catch { throw "策略解析失败:$($_.Exception.Message)" } } # 调用示例:直接返回当前策略状态,可直接绑定到GUI状态标签 $statusLabel.Text = Get-WDACPolicyStatus
方法2:无依赖轻量检测(适配无ConfigCI模块的老系统)
SIPolicy.p7b中的规则配置以Unicode字符串明文存储,不需要解析ASN.1结构,直接读取二进制内容做特征匹配即可,注意该方法存在极端场景误判可能,优先使用方法1:
$policyRaw = [System.IO.File]::ReadAllBytes("C:\Windows\System32\CodeIntegrity\SIPolicy.p7b") $policyText = [System.Text.Encoding]::Unicode.GetString($policyRaw) $isAuditMode = $policyText.Contains("Enabled:Audit Mode")
内容的提问来源于stack exchange,提问作者tayoojo
相关产品推荐
相关产品推荐

