在 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。
我也认为不应该是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
我的申请是用 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。
我也认为不应该是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