You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Inno Setup仅在以管理员权限运行时创建公共桌面图标

解决Inno Setup仅在管理员权限下创建公共桌面图标问题

我来帮你搞定这个问题——你碰到的错误根源很明确:当安装程序以低权限运行时,普通用户没有写入**公共桌面目录({commondesktop})**的权限,尝试创建图标自然会弹出错误。我们只需要给图标配置添加一个判断条件,让它仅在安装程序处于管理员权限(elevated)状态时才执行创建操作即可。

具体修改方案

直接在你的[ICONS]段条目里添加Check: IsElevated参数,修改后的代码如下:

[ICONS]
Name: {commondesktop}\{#oemtitle}; Filename: {app}\app.exe; WorkingDir: {app}; IconIndex: 0; Flags: createonlyiffileexists; Check: IsElevated

参数说明

  • Check: IsElevated:这个条件会检查当前安装程序进程是否已提升至管理员权限。只有当条件为True时,才会执行该图标创建操作。当用户选择“仅为我安装”(低权限模式)时,该条件不满足,图标创建会被跳过,自然也就不会触发权限错误。

兼容旧版本Inno Setup(低于5.6)

如果你的项目使用的是Inno Setup 5.6之前的版本,IsElevated()函数还未被引入,这时可以自定义一个判断函数来替代。在[Code]段添加以下代码:

[Code]
function IsProcessElevated: Boolean;
var
  TokenHandle: THandle;
  TokenInformation: TTokenElevation;
  ReturnLength: DWORD;
begin
  Result := False;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, TokenHandle) then
  begin
    try
      ReturnLength := 0;
      if GetTokenInformation(TokenHandle, TokenElevation, @TokenInformation, SizeOf(TokenInformation), ReturnLength) then
      begin
        Result := TokenInformation.TokenIsElevated;
      end;
    finally
      CloseHandle(TokenHandle);
    end;
  end;
end;

然后把图标条目的Check参数改成Check: IsProcessElevated即可。

可选扩展:低权限时创建用户专属图标

如果你希望在低权限安装时,给当前用户创建一个桌面图标(而非公共桌面),可以额外添加一条图标配置:

[ICONS]
; 管理员权限时创建公共桌面图标
Name: {commondesktop}\{#oemtitle}; Filename: {app}\app.exe; WorkingDir: {app}; IconIndex: 0; Flags: createonlyiffileexists; Check: IsElevated
; 低权限时创建当前用户桌面图标
Name: {userdesktop}\{#oemtitle}; Filename: {app}\app.exe; WorkingDir: {app}; IconIndex: 0; Flags: createonlyiffileexists; Check: not IsElevated

这样无论用户选择哪种安装模式,都能得到对应的桌面图标,同时避免权限错误。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:33:11