有关创建 (Inno Setup) 安装程序的一个非常常见的问题涉及从以提升/管理员权限运行的安装程序访问/修改特定用户(当前登录的用户)的配置文件。
这样做有很多缺点并且容易出错。
所有现有答案都涵盖了部分问题(注册表、文件、桌面图标等)。此问题的目的是收集通过所有可能的方法在全球范围内解决该问题的答案。
Inno Setup 没有任何内置机制来从以提升/管理员权限运行的安装程序访问或修改用户环境。
实现这一目标的所有尝试都依赖于以下技巧:
runasoriginaluser
标志或ExecAsOriginalUser
功能。一些例子:
修改或访问登录用户的注册表:
Inno Setup 为登录用户(非管理员用户)创建注册表项 或
如何从以管理员身份运行的 Inno Setup 安装程序中读取登录用户的注册表 HKCU
访问登录用户的
AppData
文件夹:或使用
{user*}
常量。
虽然这些并不可靠,但至少出于以下原因:
当当前用户没有管理员权限时,他需要在安装程序 UAC 提示符下输入管理员凭据。这会将安装程序切换到不同的用户。因此
{user*}
常量不会引用启动安装的用户。
当用户以提升的权限显式运行安装程序时,例如通过右键单击安装程序并选择 “以管理员身份运行” 或从另一个提升的应用程序(文件管理器)运行它,
runasoriginaluser
标志或 ExecAsOriginalUser
功能的“原始用户”将已经提升。
在企业环境中,应用程序由管理员安装,管理员不是将使用该应用程序的用户。
此问题的唯一正确的通用解决方案是将用户环境的设置仅推迟到实际的用户会话。
最简单的方法是让应用程序本身在首次运行时进行设置。
安装程序只能部署应用程序可用于安装的共享文件。
如果您出于某种原因无法修改应用程序,则必须迭代所有帐户并修改它们:
如果您需要确保将设置分发到仅在安装后创建的帐户,请参阅如何在 Inno Setup 中为每个用户(包括未来的新用户)安装文件?
PrivilegesRequired=lowest
:
[Setup]
PrivilegesRequired=lowest
然后
{user*}
常量将正确引用当前用户的文件夹。
如果您仍然需要安装的某些子任务的管理员权限,您可以仅请求该子任务的权限提升:
如果您想防止用户通过以管理员权限显式运行安装程序来破坏此设置,请参阅
或者您可以通过编程方式找出当前 Windows 登录会话的帐户是什么:
另一个选项是允许安装程序仅为当前用户安装:
使 Inno Setup 安装程序仅在需要时请求权限提升
这个SO答案指出了一种新机制,允许将程序安装到用户帐户或所有用户:“Inno Setup - 允许用户选择“只有我”或“任何使用这台计算机的人””。
也许这就是OP的想法。