EMET升级失败排查:性能计数器与注册表权限问题

📅 2026/7/26 7:36:53
EMET升级失败排查:性能计数器与注册表权限问题
1. 案例背景与问题现象上周在客户生产环境遇到一个典型的EMET升级失败案例。当时客户正从EMET 4.1升级到5.2版本安装程序运行到75%左右突然回滚事件查看器显示错误代码0x80070643。系统是Windows Server 2012 R2标准版已安装.NET Framework 4.6.1和最新系统补丁。现场最诡异的现象是同一安装包在其他同配置服务器成功卸载旧版本后问题依旧临时禁用防病毒软件无效系统日志显示msiexec进程异常退出2. 排查过程全记录2.1 第一阶段常规检查首先按照微软官方KB执行标准排查流程验证安装包哈希值certutil -hashfile EMET_Setup.msi SHA256检查系统临时文件夹空间剩余23GB远高于需求以管理员身份运行安装程序失败依旧使用系统自带的修复工具DISM /Online /Cleanup-Image /RestoreHealth关键发现事件日志中有一条被忽略的警告 - CustomAction EMET.PreInstall.InstallCounters错误17222.2 第二阶段深度分析通过Process Monitor捕获安装过程发现关键异常点安装程序尝试访问HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009下的计数器注册表项该键值权限异常显示为TrustedInstaller独占进一步检查发现性能计数器服务PerfProc状态为停止根本原因链条 性能计数器损坏 → EMET预安装脚本无法写入计数器 → 安装回滚3. 解决方案实施3.1 修复性能计数器执行以下PowerShell脚本重建计数器$null lodctr /R $null unlodctr WmiApRpl $null lodctr %SystemRoot%\System32\perfc009.dat Restart-Service -Name PerfProc -Force3.2 特殊权限处理临时获取注册表项所有权$key HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009 $acl Get-Acl $key $rule New-Object System.Security.AccessControl.RegistryAccessRule( Administrators,FullControl,Allow) $acl.SetAccessRule($rule) Set-Acl -Path $key -AclObject $acl3.3 验证安装分步执行安装程序先运行EMET_Setup.msi /lvx* log.txt观察计数器相关操作是否完成确认最终安装状态控制面板→程序与功能4. 经验总结与避坑指南4.1 关键发现EMET安装依赖的性能计数器问题在Server 2012 R2上出现概率约3%根据内部统计该问题在域控制器上更常见因安全策略限制错误代码0x80070643实际是MSI的通用回滚代码4.2 推荐操作流程建议的EMET升级标准流程预检查阶段运行lodctr /Q → 验证计数器状态检查注册表项权限重点关注Perflib安装阶段使用/l*vx参数生成详细日志避免使用静默安装参数回滚处理优先检查%TEMP%\EMET*.log搜索Return value 3关键字段4.3 延伸建议对于关键服务器建议创建系统还原点提前备份性能计数器配置lodctr /E:backup.txt考虑使用组策略首选项预设注册表权限5. 技术原理深度解析5.1 EMET的计数器机制EMET利用Windows性能计数器实现攻击行为检测通过Process\Handle Count等内存保护监控Memory\Commit LimitDEP/ASLR策略计数通过自定义计数器5.2 MSI安装程序的工作流典型安装阶段立即执行操作写入注册表、创建服务延迟执行操作性能计数器配置提交阶段系统实际变更故障点分析本例卡在第二阶段因计数器服务不可写导致整个事务回滚5.3 注册表权限继承机制Windows Server的特殊权限设计Perflib键默认由TrustedInstaller独占服务账户如NETWORK SERVICE需要显式授权域策略可能重置自定义权限6. 替代方案与变通方法6.1 不使用计数器的安装方式通过修改MSI包跳过计数器检查使用Orca编辑EMET_Setup.msi修改InstallExecuteSequence表删除CA_InstallCounters动作注意这会禁用部分安全监控功能6.2 使用组策略部署更稳定的域部署方法将MSI转换为GPO可识别的格式使用MsiTran配置组策略首选项预先设置注册表权限分阶段部署先策略后安装包6.3 应急处理方案当无法立即修复时的临时措施使用EMET便携版非安装版本通过PsExec远程注入保护配置本地策略替代计数器监控7. 相关工具与命令速查7.1 诊断工具集工具名称用途说明示例命令Process Monitor监控安装过程文件/注册表访问Procmon.exe /AcceptEulaOrcaMSI包编辑器orca EMET_Setup.msiPerfMon性能计数器管理perfmon /res7.2 常用PowerShell命令# 检查计数器状态 Get-Counter -ListSet * | Where-Object {$_.CounterSetName -like *EMET*} # 修复服务依赖 Get-Service -Name Perf* | Restart-Service -Force # 注册表权限审计 (Get-Acl HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Perflib).Access7.3 日志分析关键字段在安装日志中重点关注CustomAction EMET.PreInstall 返回码SchedSecureObjectsRollback 回滚点Error 1722 RPC服务器不可用错误8. 后续防护建议8.1 监控策略调整建议添加以下监控项Perflib注册表键权限变更性能计数器服务运行状态EMET服务异常停止事件8.2 自动化检测脚本部署前检查脚本示例$counters lodctr /Q | Select-String Corrupt if($counters) { Write-Warning 需要先修复性能计数器 lodctr /R }8.3 知识库文档更新建议在内部Wiki添加特定错误代码的处理流程服务器角色的特殊注意事项回滚后的清理步骤如残留注册表项