Inno Setup 文档如下:
{group}
"开始"菜单文件夹的路径,由用户在安装程序的">选择开始菜单文件夹">向导页上选择。此文件夹在"所有用户"配置文件下创建,除非安装应用程序的用户没有管理权限,在这种情况下,将在用户的配置文件中创建此文件夹。
当我使用PrivilegesRequired=admin
(即默认值)时,将在C:ProgramDataMicrosoftWindowsStart MenuPrograms
中为所有用户创建"开始"菜单项。
当我使用PrivilegesRequired=lowest
但使用右键单击以管理员身份运行来运行安装程序时,仅在C:Usersadmin-userAppDataRoamingMicrosoftWindowsStart MenuPrograms
中为管理员用户创建"开始"菜单项。 即使当前用户是管理员,也会发生这种情况。
使用右键单击提升时,如何使"开始"菜单项适用于所有用户? 在此情况下,安装程序为C:Program Files
中的所有用户安装程序文件。 所以我希望开始菜单项也适用于所有用户。
使用脚本化常量根据安装程序的提升状态动态更改"开始"菜单根路径。
您必须使用 WinAPI(例如SHGetFolderPath
)检索公共"开始"菜单文件夹的路径,因为{commonprograms}
实际上返回{userprograms}
,如果PrivilegesRequired=lowest
,即使安装程序实际运行提升。
[Icons]
Name: "{code:GetMenuRootPath}{groupname}My Program"; Filename: "{app}MyProg.exe"
[Code]
const
CSIDL_COMMON_PROGRAMS = $0017;
SHGFP_TYPE_CURRENT = 0;
MAX_PATH = 260;
S_OK = 0;
function SHGetFolderPath(
hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWORD;
pszPath: string): HResult;
external 'SHGetFolderPathW@shell32.dll stdcall';
function GetMenuRootPath(Param: string): string;
var
R, I: Integer;
begin
if IsAdminLoggedOn then
begin
SetLength(Result, MAX_PATH);
R := SHGetFolderPath(0, CSIDL_COMMON_PROGRAMS, 0, SHGFP_TYPE_CURRENT, Result);
if R <> S_OK then
begin
Log('Failed to resolve path to common Start menu folder');
end
else
begin
SetLength(Result, Pos(#0, Result) - 1);
Log(Format('Resolved path to common Start menu folder: %s', [Result]));
end;
end
else
begin
Result := ExpandConstant('{userprograms}');
Log(Format('Using user''s Start menu folder: %s', [Result]))
end;
end;
该代码适用于 Unicode 版本的 Inno Setup(Inno Setup 6 的唯一版本)。
但请注意,在"开始"菜单中使用组违反了 Windows 8 及更高版本的 Windows 指南。
您可以使用(已弃用且现已未记录)值PrivilegesRequired=none
使 Inno 适应它是否在有管理员权限的情况下运行,包括相应地重定向"开始"菜单条目。
但是,弃用此设置的原因是整个概念有点愚蠢。 大多数应用程序应设计为需要管理员权限才能安装(因为通常非管理员不应安装软件)。
如果您最终以管理员和普通用户的身份安装了应用程序,那么您会遇到某些用户将看到已安装的应用程序的两个副本并且不知道要使用哪个副本的情况。 此外,管理员可能会升级他们安装的那个,认为所有用户都会看到它,但与此同时,一些用户仍在使用旧版本。
我强烈建议您放弃让非特权用户安装您的应用程序的想法,而只是坚持使用PrivilegesRequired=admin
,或者如果您真的想允许这样做,那么PrivilegesRequired=lowest
。
如果您确实使用PrivilegesRequired=lowest
,则还要在DefaultDirName
中使用{userpf}
,以便在有人以管理员身份错误地运行它时,它不会安装到程序文件中。