14

我正在使用 Inno Setup 创建安装程序。作为安装过程的一部分,我正在安装 Tomcat。在 Windows 7 上,我遇到了这里描述的问题:

http://blog.paulbouwer.com/2010/10/23/the-case-of-the-annoying-tomcat-6-monitor/

我可以通过手动设置“以管理员身份运行”来修复它tomcat7w.exe(问题和根本原因与 tomcat7 相同),但我不知道如何通过 Inno Setup 来解决。

我正在寻找解释some_program.exe以管理员身份运行的线程,但是这里程序是在 Tomcat 服务启动时启动的(例如在机器启动时),所以我需要一种方法来使用 Inno Setup 将其标记为“以管理员身份运行”而不是实际运行它。

4

3 回答 3

19

您可以在部分中添加一个注册表条目,该条目[Registry]将设置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
于 2013-06-07T10:46:27.970 回答
13

如果您真的想设置快捷方式的“以管理员身份运行”标志(与强制目标应用程序以管理员权限运行相反),您可以使用以下代码:

[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;

这是基于:


在 Unicode 版本的 Inno Setup 上测试。但更自然地,它也应该在 Ansi 版本上工作,尽管无论如何你都应该使用 Unicode 版本。


如果您想允许用户在安装结束时使用部分中的postinstall条目执行程序[Run],您当然需要明确请求提升。

如果安装程序管理员权限运行,您可以简单地添加runascurrentuser标志

[Run]
Filename: "{app}\MyProg.exe"; Description: "Launch application"; \
    Flags: postinstall nowait skipifsilent runascurrentuser 

如果安装程序在没有管理员权限的情况下运行,请将Verb参数设置为runas(为此您还需要shellexec标志):

[Run]
Filename: "{app}\MyProg.exe"; Verb: runas; Description: "Launch application"; \
    Flags: postinstall nowait skipifsilent shellexec

不过,请确保您有充分的理由以管理员权限运行您的应用程序。用户应用程序不需要管理员权限。如果他们需要它,这通常是糟糕设计的标志。希望应用程序以管理员权限运行的一个常见(错误)原因是应用程序需要写入其安装文件夹。

请参阅使用 Inno Setup 安装时应用程序不起作用

于 2017-01-06T19:43:31.407 回答
3

runascurrentuser标志属性添加到该[Run]部分

Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent; 
于 2016-01-19T14:41:48.223 回答