Inno Setup 桌面快捷方式 (link) 已设置 "Run as administrator" 高级 属性

Inno Setup desktop shortcut (link) which has "Run as administrator" advanced property set

我正在努力让 Inno setup (5.5.9u) 创建一个桌面快捷方式,该快捷方式有一个图标并且具有 属性 的高级 属性运行 作为管理员” 设置。

问题

这个问题与以下内容略有不同:How to set 'Run as administrator' on a file using Inno Setup

因为我想要做的不是 运行 一个在设置时具有管理员权限的程序,(设置已经 运行 在管理员处),而是留下一个 link 在桌面上有 运行 的 advanced 属性 as Administrator.

代码示例

[Icons]
Name: "{group}\EGPL Watson Uninstall"; Filename: "{uninstallexe}"; \
    WorkingDir: "{app}"
Name: "{commondesktop}\DashBoard"; \
    Filename: "{app}\dashboard\node_modules\electron\dist\electron.exe main.js"; \
    WorkingDir: "{app}\dashboard"; \
    IconFilename: "{src}\dashboard\build\configure.ico"

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

Application does not work when installed with Inno Setup


Inno Setup 本身不支持创建快捷方式 "运行 作为管理员" 标志集。

"运行 as Administrator" 标志有点像 .lnk 文件。参见:

    [MS-SHLLINK] 中的
  • LinkFlags:Shell Link (.LNK) 二进制文件格式;
  • How can I use JScript to create a shortcut that uses "Run as Administrator"

您可以使用以下代码设置该位:

[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 );
    Stream.Seek(-1, soFromCurrent);
    Stream.WriteBuffer(Buffer, 1);
  finally
    Stream.Free;
  end;
end;

在 Inno Setup 的 Unicode 版本(Inno Setup 6 的唯一版本)上测试。但更自然地,它也应该适用于 Ansi 版本。