关于创建(Inno Setup)安装程序的一个非常常见的问题是围绕从使用提升/管理员权限运行的安装程序访问/修改特定用户(当前登录用户)的配置文件。
这样做有很多缺点,并且容易出错。
所有现有答案都包含问题的一部分(注册表,文件,桌面图标等)。这个问题的目的是通过所有可能的方法收集解决全球问题的答案。
答案 0 :(得分:3)
Inno Setup没有任何内置机制来访问或修改使用提升/管理员权限运行的安装程序的用户环境。
所有实现这一目标的尝试都依赖于以下技巧:
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登录会话的帐户: