【问题标题】:How to set 'Run as administrator' on a file using Inno Setup如何使用 Inno Setup 在文件上设置“以管理员身份运行”
【发布时间】:2013-06-03 10:54:45
【问题描述】:

我正在使用 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 将其标记为“以管理员身份运行,而不是实际运行。

【问题讨论】:

  • 您可以在[Registry] 部分添加注册表条目,该条目将设置为以管理员身份运行作为运行此应用程序的默认操作。例如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
  • 完美运行,谢谢。我现在看到我应该在几个小时前发布这个问题:)。如果需要,请将评论作为答案发布,以便我接受。再次感谢
  • Ermm,应用程序兼容性不应该对服务起作用。它们将以配置为的任何用户身份运行,通常是管理员或本地计算机。

标签: inno-setup elevated-privileges


【解决方案1】:

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

【讨论】:

  • 兼容性设置是一种创可贴,不是正确的解决方案。在这种情况下,正确的解决方案可能是首先使用管理员凭据将其作为服务运行。
【解决方案2】:

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

[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 版本上工作,尽管你 should use Unicode version 无论如何。


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

如果安装程序运行管理员权限,您可以简单地添加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

【讨论】:

  • 对于 Inno Devs:如果 [Run] 部分中的 postinstall 条目实际上是另一个 Inno Setup 可执行文件,请定义一个标志来捕获(失败的)子进程的返回码,并选择将其 XAND 到.返回父安装的代码。
  • @LaurieSearn 为什么在这里发布功能请求?将其发布在 Inno Setup 网站上。
  • Yes, of course。无论如何应该是异或。进步的解决方法here
【解决方案3】:

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

Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent; 

【讨论】:

  • 将在安装结束时以管理员身份正确启动可执行文件,但不会让桌面快捷方式以管理员身份启动它。
  • @Winter 我根据答案添加了runascurrentuser,它在从快捷方式执行应用程序时询问我的权限。 Inno Setup 6.0.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2011-03-30
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
相关资源
最近更新 更多