如何使用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;