如何使用Inno Setup在文件上设置“以pipe理员身份运行”
我使用Inno Setup创build安装程序。 作为安装过程的一部分,我正在安装Tomcat。 在Windows 7上,我遇到了这里描述的问题:
The case of the annoying Tomcat 6 Monitor
我可以通过在tomcat7w.exe
上手动设置'以pipe理员tomcat7w.exe
运行'来tomcat7w.exe
这个问题(问题和根本原因与tomcat7一样),但我不知道如何通过Inno Setup来完成。
我find解释以pipe理员身份运行some_program.exe
线程,但是这里程序在Tomcat服务启动时(例如在机器启动时)启动,所以我需要一种方法来使用Inno Setup将其标记为'以pipe理员身份运行而不是实际运行它。
谢谢
您可以在[Registry]
部分中添加一个registry项,该registry项将以run as Administrator
身份run as Administrator
作为运行此应用程序的默认操作。
例:
Root: "HKLM"; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; \ ValueType: String; ValueName: "{app}\tomcat7w.exe"; ValueData: "RUNASADMIN"; \ Flags: uninsdeletekeyifempty uninsdeletevalue; MinVersion: 0,6.1
如果您确实想设置快捷方式的“以pipe理员身份运行”标志(与强制以pipe理员权限运行目标应用程序相反),则可以使用以下代码:
[Icons] Name: "{userdesktop}\My Program"; Filename: "{app}\MyProg.exe"; \ AfterInstall: SetElevationBit('{userdesktop}\My Program.lnk') [Code] procedure SetElevationBit(Filename: string); var Buffer: string; Stream: TStream; begin Filename := ExpandConstant(Filename); Log('Setting elevation bit for ' + Filename); Stream := TFileStream.Create(FileName, fmOpenReadWrite); try Stream.Seek(21, soFromBeginning); SetLength(Buffer, 1); Stream.ReadBuffer(Buffer, 1); Buffer[1] := Chr(Ord(Buffer[1]) or $20); Stream.Seek(-1, soFromCurrent); Stream.WriteBuffer(Buffer, 1); finally Stream.Free; end; end;
这是基于:
- [MS-SHLLINK]中的LinkFlags:Shell链接(.LNK)二进制文件格式;
- 如何使用Powershell创buildRun As Administrator快捷方式 ;
- 如何使用JScript创build使用“以pipe理员身份运行”的快捷方式
testingUnicode版本的Inno Setup。 但更自然的,也应该在Ansi的版本上工作。
如果你想允许用户在安装结束后使用[Run]
部分的postinstall
条目来执行程序,那么你当然需要显式地请求提升。
如果安装程序以pipe理员权限运行,则可以简单地添加runascurrentuser
标志 :
[Run] Filename: "{app}\MyProg.exe"; Description: "Launch application"; \ Flags: postinstall nowait skipifsilent runascurrentuser
如果安装程序在没有pipe理员权限的情况下运行,请将Verb
参数设置为runas
(为此还需要shellexec
标志):
[Run] Filename: "{app}\MyProg.exe"; Verb: runas; Description: "Launch application"; \ Flags: postinstall nowait skipifsilent shellexec
将runascurrentuser
标志属性添加到[Run]
部分
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent;