AppLocker 策略管理组件 · XML 序列化层 · NGen 原生映像
该模块隶属于 Microsoft.Security.ApplicationId.PolicyManagement 命名空间体系,是 AppLocker(应用程序控制策略)管理栈的组成部分。文件名中的 .ni 表示 Native Image,即由 CLR 加载器调用 NGen.exe,对原始托管程序集 XmlHelper.dll 预编译后生成的本地机器码映像。运行时系统优先加载该原生映像,跳过 JIT 编译环节,从而缩短策略管理工具的冷启动时间、降低 JIT 线程争用与工作集内存开销。其典型宿主进程包括 mmc.exe(本地安全策略、组策略管理单元)、powershell.exe(AppLocker 相关 Cmdlet)以及 Windows 组件中的策略提供程序。
1. 策略对象的 XML 序列化与反序列化:将 AppLockerPolicy、RuleCollection、FilePublisherCondition、FilePathCondition、FileHashCondition 等托管对象模型转换为符合 AppLocker PolicySchema 的 XML 文档,并支持反向解析还原为强类型对象图。
2. 架构校验与命名空间解析:处理 AppLocker 策略所用的 XML 命名空间、Schema 版本属性与节点顺序约束,识别不属于合法架构的元素与属性,防止非法策略内容写入策略存储。
3. 编码与字符处理:处理 XML 声明、UTF-8/UTF-16 编码、字节序标记以及路径、发布者名称中的特殊字符转义,保证跨语言环境的策略可移植性。
4. 异常包装与诊断:面对畸形 XML、缺失节点或类型不匹配时,抛出带上下文信息的 XmlException、SerializationException,供上层管理单元或 Cmdlet 输出可读错误提示。
5. 支撑上层策略 API:为 Get-AppLockerPolicy、Set-AppLockerPolicy、Test-AppLockerPolicy 以及组策略编辑器的规则读写提供底层 XML 能力。
原生映像并不替代原始托管程序集,二者构成主备关系:系统优先载入 .ni.dll 以获得原生执行性能;当映像是用旧版本编译、与当前运行环境不匹配或缺失时,运行时会回退到同目录下的 XmlHelper.dll 走 JIT 路径。因此 .ni.dll 缺失通常不会立即导致功能中断,但会带来启动变慢与回退失败的风险;只有在原始程序集同样损坏或缺失时,才会出现硬性加载错误。
修复方向通常包括:执行 sfc /scannow 与 DISM /Online /Cleanup-Image /RestoreHealth 修复系统映像;通过组件安装重新注册 AppLocker 功能;确认同目录原始托管控件存在完好;使用 ngen.exe install 重新生成原生映像并执行清理后校验。