如何配置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
相关产品推荐
相关产品推荐

