我正在努力让 Inno setup (5.5.9u) 创建一个桌面快捷方式,该快捷方式有一个图标并设置了“以管理员身份运行” 的高级属性。
问题
这个问题与:How to set 'Run as administrator' on a file using Inno Setup 有点不同。
因为我想做的不是在安装时以管理员权限运行程序(安装程序已经在管理员运行),而是在具有高级 “以管理员身份运行” 的属性。
代码示例
[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 本身不支持创建带有“以管理员身份运行” 标志集的快捷方式。
“以管理员身份运行” 标志有点像 .lnk 文件。见:
- LinkFlags在 [MS-SHLLINK] 中:Shell 链接 (.LNK) 二进制文件格式;
- How to create a Run As Administrator shortcut using Powershell
- 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 $20);
Stream.Seek(-1, soFromCurrent);
Stream.WriteBuffer(Buffer, 1);
finally
Stream.Free;
end;
end;
在 Inno Setup 的 Unicode 版本(Inno Setup 6 的唯一版本)上进行了测试。但更自然地,它也应该适用于 Ansi 版本。
关于inno-setup - 具有 "Run as administrator"高级属性集的 Inno Setup 桌面快捷方式(链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073886/