Inno setup 如何在以管理员身份运行PrivilegesRequired=lower的安装程序时为所有用户创建“开始”菜单项

Inno setup 如何在以管理员身份运行PrivilegesRequired=lower的安装程序时为所有用户创建“开始”菜单项,inno-setup,Inno Setup,Inno安装文档说明如下: {group} “开始菜单”文件夹的路径,由用户在安装程序的“选择开始菜单文件夹向导”页面上选择。此文件夹是在“所有用户”配置文件下创建的,除非安装应用程序的用户没有管理权限,在这种情况下,它是在用户配置文件中创建的* 当我使用PrivilegesRequired=admin(即默认设置)时,会在C:\ProgramData\Microsoft\Windows\Start menu\Programs中为所有用户创建开始菜单项 当我使用PrivilegesRequire

Inno安装文档说明如下:

{group}
“开始菜单”文件夹的路径,由用户在安装程序的“选择开始菜单文件夹向导”页面上选择。此文件夹是在“所有用户”配置文件下创建的,除非安装应用程序的用户没有管理权限,在这种情况下,它是在用户配置文件中创建的*

当我使用
PrivilegesRequired=admin
(即默认设置)时,会在
C:\ProgramData\Microsoft\Windows\Start menu\Programs
中为所有用户创建开始菜单项

当我使用
PrivilegesRequired=lower
,但使用右键单击“以管理员身份运行”来运行安装程序时,只为
C:\Users\admin user\AppData\Roaming\Microsoft\Windows\Start menu\Programs
中的管理员用户创建开始菜单项。即使当前用户是管理员,也会发生这种情况

使用鼠标右键单击“立面”时,如何使“开始”菜单项适用于所有用户?在这种情况下,安装程序会在
C:\program files\
中为所有用户安装程序文件。因此,我希望开始菜单项也适用于所有用户。

根据安装程序的提升状态,使用a动态更改开始菜单根路径

您必须使用WinAPI(例如)来检索公共开始菜单文件夹的路径,因为即使安装程序实际运行,如果
PrivilegesRequired=lower
,则
{commonprograms}
实际上返回
{userprograms}

[图标]
名称:“{code:GetMenuRootPath}\{groupname}\My Program”;文件名:“{app}\MyProg.exe”
[代码]
常数
CSIDL_公共_计划=0017美元;
SHGFP_类型_电流=0;
最大路径=260;
S_OK=0;
函数SHGetFolderPath(
hwnd:hwnd;csidl:Integer;hToken:THandle;dwFlags:DWORD;
pszPath:string):HResult;
外部的SHGetFolderPathW@shell32.dllstdcall';
函数GetMenuRootPath(参数:string):string;
变量
R、 I:整数;
开始
如果我是德米兰戈登的话
开始
设置长度(结果,最大路径);
R:=SHGetFolderPath(0,CSIDL_公共_程序,0,SHGFP_类型_当前,结果);
如果你同意的话
开始
日志('无法解析公用开始菜单文件夹的路径');
结束
其他的
开始
设置长度(结果,位置(#0,结果)-1);
日志(格式('common Start menu文件夹的解析路径:%s',[Result]);
结束;
结束
其他的
开始
结果:=ExpandConstant({userprograms}');
日志(格式('使用用户的开始菜单文件夹:%s',[Result]))
结束;
结束;
代码用于(Inno Setup 6的唯一版本)


但请注意,在“开始”菜单中使用组违反了Windows 8及更新版本的Windows指导原则。

您可以使用(已弃用且现在未记录)值
PrivilegesRequired=none
使Inno适应是否使用管理员权限运行,包括相应地重定向“开始”菜单项

但是,不推荐使用此设置的原因是因为整个概念有点愚蠢。大多数应用程序应该设计为需要管理员权限才能安装(因为通常非管理员的人不应该安装软件)

如果您最终以管理员和普通用户的身份安装了一个应用程序,那么在某些情况下,某些用户会看到安装的应用程序的两个副本,而不知道使用哪一个副本。此外,管理员可能会升级他们安装的版本,以为所有用户都会看到它,但与此同时,一些用户仍在使用旧版本

我强烈建议您放弃让非特权用户安装您的应用程序的想法,只需坚持使用
PrivilegesRequired=admin
,或者如果您真的想这样做,那么
PrivilegesRequired=lowest


如果您确实使用了
PrivilegesRequired=lower
,那么也可以在
DefaultDirName
中使用
{userpf}
,这样,如果有人错误地将其作为管理员运行,则不会将其安装到程序文件中。

当计算机处于空气间隙(没有internet访问权限)且用户没有管理员访问PC时,对于非特权用户来说,能够升级已安装的软件是至关重要的。PrivilegesRequired=尝试创建如上所述的菜单项时,Inno v 6中的Lower失败。希望{userpf}trickola能为我的用例工作。谢谢你的提示。应用程序实际上是用“lowest”安装的,只有“开始”菜单项失败了。对于我上面在这些评论中提到的用例:在[Icons]部分指定“{userprograms}”和“{userdesktop}”,安装时不会报告任何错误。我使用“最低”作为所需的特权。