有关创建(Inno Setup)安装程序的一个常见问题围绕从安装程序访问/修改特定用户(当前登录的用户)以提升/管理员权限运行。从以管理员身份运行的Inno Setup安装程序安装当前登录用户的应用程序
这样做有许多缺点,并且容易出错。
所有现有的答案都涵盖了部分问题(注册表,文件,桌面图标等)。这个问题的目的是收集全球解决问题的答案,并采取一切可能的方法。
有关创建(Inno Setup)安装程序的一个常见问题围绕从安装程序访问/修改特定用户(当前登录的用户)以提升/管理员权限运行。从以管理员身份运行的Inno Setup安装程序安装当前登录用户的应用程序
这样做有许多缺点,并且容易出错。
所有现有的答案都涵盖了部分问题(注册表,文件,桌面图标等)。这个问题的目的是收集全球解决问题的答案,并采取一切可能的方法。
Inno安装程序没有任何内置机制来访问或修改以提升/管理员权限运行的安装程序的用户环境。
所有旨在实现这一依靠类似的技巧:
runasoriginaluser
flag或ExecAsOriginalUser
function。一些例子:
修改或访问的登录用户的注册表:
Inno Setup Creating registry key for logged in user (not admin user)或
How to read registry HKCU for logged In user from Inno Setup installer running as administrator
访问的登录用户AppData
文件夹:
Inno Setup always installs into admin's AppData directory或
Inno Setup Using {localappdata} for logged in user或
Inno Setup - puts user files in admin documents。
或使用{user*}
constants。
虽然这些都是不可靠的,至少这些原因:
如果当前用户没有管理员权限,他(她)需要在安装UAC提示输入管理员凭据。将安装程序切换到不同的用户。因此{user*}
常量不会引用启动安装的用户。
当用户使用提升的权限显式运行安装程序时,通过右键单击安装程序并选择“以管理员身份运行”或从另一个高级应用程序(文件管理器)运行它,runasoriginaluser
标志的“原始用户”或ExecAsOriginalUser
函数已被提升。
在企业环境中,应用程序由管理员安装,管理员不是将使用应用程序的用户。
唯一正确的通用解决这个问题是用户环境的设置推迟,以实际用户会话。
最简单的就是让应用程序本身在第一次运行时执行安装。
安装程序只能部署应用程序可用于安装的共享文件。
如果您不能修改无论什么原因,应用程序,你会遍历所有帐户并进行修改:
如果您需要确保将设置分配到仅在安装后才创建的帐户,请参阅How to install files for each user, including future new users, in Inno Setup?
如果你是幸福的一个事实,即应用程序将被设置为只有已登录的用户,使用PrivilegesRequired=lowest
:
[Setup]
PrivilegesRequired=lowest
然后{user*}
常量将正确指当前用户的文件夹。
如果您仍然需要管理员权限安装的某些子任务,可以请求权限提升为只有子任务:
如果您希望通过以管理员权限明确运行安装程序来防止用户破坏此操作,请参阅
或者,你可以通过编程发现,如果账户当前的Windows登录会话: