如何使用Inno Setup在文件上设置“以管理员身份运行”

时间:2013-06-07 07:50:00

标签: inno-setup elevated-privileges

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

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

我可以通过在tomcat7w.exe上手动设置“以管理员身份运行”来修复它(问题和tomcat7的根本原因也是一样),但我不知道如何通过Inno来做到这一点建立。

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

3 个答案:

答案 0 :(得分:14)

您可以在[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

答案 1 :(得分:11)

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

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

这基于:

在Inno Setup的Unicode版本上测试过。但是,它应该更自然地适用于Ansi版本,不管你是should use Unicode version

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

如果安装程序使用管理员权限运行,您只需添加runascurrentuser flag

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

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

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

尽管如此,请确保您有充分的理由以管理员权限运行您的应用程序。用户应用程序不需要管理员权限。如果他们需要它,通常表明设计不好。希望应用程序以管理员权限运行的一个常见(坏)原因是应用程序需要写入其安装文件夹。

请参阅Application does not work when installed with Inno Setup

答案 2 :(得分:1)

u-r-180标记属性添加到runascurrentuser部分

[Run]