如何用Inno Setup在新版Win10/2019/21H2中生效程序管理员运行设置
关于VB6程序在Win10下UAC与注册表重定向的问题
核心现象
- 尝试过注册表设置、修改可执行文件字节的方法,在最新Windows 10版本均无效
- HKLM和HKCU中已添加程序“以管理员运行”的注册表条目,但只有手动右键选择「以管理员运行」时,程序才能正确读取HKLM项;直接启动时无法找到目标注册表项
- 给注册表值添加~符号后,出现「此键已与集合中的元素关联」的读取异常
- 手动勾选文件属性的「以管理员运行」复选框后程序可正常运行,此时注册表值显示为
~ RUNASADMIN;但通过脚本写入的注册表设置(无~)无法自动勾选该复选框,且该设置在2016年左右的Win10版本可正常工作
测试细节与发现
- 目标程序为2000年代初的VB6程序,无内置app.manifest文件
- 首次运行时无虚拟存储(Virtual Store),程序可读取HKLM项;但一旦修改设置写入Virtual Store后,后续启动仅读取Virtual Store项,完全忽略HKLM项
- 即使通过AppCompatFlags设置
runasadmin且图标显示UAC盾牌,删除Virtual Store项后程序会重新读取HKLM-WOW6432Node,但写入操作仍会指向Virtual Store - 仅右键选择「以管理员运行」时,程序才能同时正确读写HKLM-WOW6432Node项
- 两个签名程序表现不一致:一个读取Virtual Store,另一个读取HKLM-WOW6432Node,推测可能是管理员运行标识过多或WINXPSP3兼容模式导致重定向
已尝试的解决方案
1. Inno Setup注册表配置
Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueType: multisz; \ ValueName: "{#InstallFolder}\myapp.exe"; ValueData: "RUNASADMIN"; \ Flags: uninsdeletekeyifempty uninsdeletevalue; MinVersion: 0,6.2
- 同步尝试写入HKLM路径,未生效
2. 修改可执行文件字节的方法
Stream.ReadBuffer(Buffer, 1); Buffer[1] := Chr(Ord(Buffer[1]) or $20); Stream.Seek(-1, soFromCurrent); Stream.WriteBuffer(Buffer, 1);
- 该方法在最新Win10版本无效
待确认疑问
注册表中Compatibility Assistant-Store组存在程序引用及94字节二进制数据,是否需要对该部分进行操作?
内容的提问来源于stack exchange,提问作者Ryan Buton
相关产品推荐
相关产品推荐

