NSIS从2.46升级至3.09后UAC_GetIntegrityLevel值为何变更?
NSIS 版本升级后UAC_GetIntegrityLevel值差异的原因分析
1. NSIS 3.x与2.x的进程上下文默认行为变更
NSIS 3.x对UAC相关的进程启动逻辑做了核心调整:
- NSIS 2.46默认会以Medium-High完整性级别(对应0x3000)运行安装程序进程,这是当时针对普通用户场景的隐性默认设置。
- NSIS 3.09则严格遵循Windows的UAC权限模型,若安装程序未明确请求权限提升,进程会以当前用户的基础完整性级别启动;如果插件在获取级别时遇到未处理的异常,会返回0x0作为错误占位值。
2. UAC插件的版本适配逻辑变化
尽管同步升级了UAC插件,但NSIS 3.x的内部API与2.x存在兼容性差异:
- 新版UAC插件修改了
UAC_GetIntegrityLevel的实现逻辑,比如从默认获取进程完整性级别改为获取当前线程的完整性级别;或者在无法正确读取系统权限信息时,返回0x0替代旧版的默认Medium-High级别。 - 部分新版UAC插件要求在调用
UAC_GetIntegrityLevel前先执行UAC_Init初始化上下文,若脚本未添加该步骤,会直接导致获取失败并返回0x0。
3. NSIS编译指令的默认值调整
NSIS 3.x对UAC相关编译指令的默认配置做了修改:
- 比如
RequestExecutionLevel指令,NSIS 2.46默认可能隐性提升进程级别,而NSIS 3.09严格遵循指令设置。若脚本未显式指定该指令,进程会以更低的完整性级别运行,直接导致插件返回值变化。
验证与修复建议
- 显式指定进程执行级别:在脚本开头添加
RequestExecutionLevel user或RequestExecutionLevel highestAvailable,强制进程以指定级别运行后再测试返回值。 - 检查插件调用流程:确保在调用
UAC_GetIntegrityLevel前执行初始化(若新版插件要求),示例代码:UAC_Init UAC_GetIntegrityLevel $0 DetailPrint "Integrity Level: 0x$0" - 对比实际进程级别:用Windows自带的
Process Explorer查看安装程序进程的完整性级别,确认是插件获取逻辑问题还是进程实际级别确实发生了变化。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

