在 Inno Setup 中设置 "RUNASADMIN" 应用程序兼容性标志

Set "RUNASADMIN" application compatibility flag in Inno Setup

我的申请是用 Java 提出的,需要 Windows 的 运行 管理员权限。使用 Inno Setup,我可以使用以下代码更改注册表,它适用于 Windows 7,但是对于 Windows 10 和 8,我没有取得同样的成功,因为注册表显然不存在了。

[Registry]
Root: HKCR; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\"; ValueType: String; ValueName: "{app}\AppExecutable.exe"; ValueData: "RUNASADMIN"; Flags: uninsdeletekeyifempty uninsdeletevalue;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\"; ValueType: String; ValueName: "{app}\AppExecutable.exe"; ValueData: "RUNASADMIN"; Flags: uninsdeletekeyifempty uninsdeletevalue;

我读到它可以用可执行清单来完成,但我想它只适用于 Visual Studio 制作的应用程序,这不是我的情况。有没有办法把它放在 Java 清单中?

我想知道我是否可以通过其他方式做到这一点,是否有另一个我可以修改的注册表,或者我是否必须在安装过程中附加 运行 另一种脚本。

我认为您的问题与 Windows 7 与 Windows 8/10 无关。而是您的 Windows 7 是 32 位,而 Windows 8/10 是 64 位。

Inno Setup 安装程序是 32 位应用程序,因此 SOFTWARE 默认重定向到 SOFTWARE\Wow6432Node

您必须使用像 Root: HKLM64 这样的显式 64 位注册表根来显式避免重定向。

您可能还想添加 Check: IsWin64 以确保条目不会在 32 位安装上处理,因为它会导致错误。

[Registry] section documentation

use 64-bit install mode.


我也认为不应该是HKCR,而是HKCU.
参见


[Registry]
; keys for 32-bit systems
Root: HKCU32; \
    Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; \
    ValueType: String; ValueName: "{app}\AppExecutable.exe"; ValueData: "RUNASADMIN"; \
    Flags: uninsdeletekeyifempty uninsdeletevalue; Check: not IsWin64
Root: HKLM32; \
    Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; \
    ValueType: String; ValueName: "{app}\AppExecutable.exe"; ValueData: "RUNASADMIN"; \
    Flags: uninsdeletekeyifempty uninsdeletevalue; Check: not IsWin64

; keys for 64-bit systems
Root: HKCU64; \
    Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; \
    ValueType: String; ValueName: "{app}\AppExecutable.exe"; ValueData: "RUNASADMIN"; \
    Flags: uninsdeletekeyifempty uninsdeletevalue; Check: IsWin64
Root: HKLM64; \
    Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; \
    ValueType: String; ValueName: "{app}\AppExecutable.exe"; ValueData: "RUNASADMIN"; \
    Flags: uninsdeletekeyifempty uninsdeletevalue; Check: IsWin64