这样做有许多缺点,并且容易出错.
所有现有的答案都包含问题的一部分(注册表,文件,桌面图标等).这个问题的目的是通过所有可能的方法收集解决全球问题的答案.
解决方法
实现这一目标的所有尝试都依赖于以下技巧:
> 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函数的“原始用户”将已升级.
>在企业环境中,应用程序由管理员安装,管理员不是将使用该应用程序的用户.
此问题的唯一正确的通用解决方案是仅将用户环境的设置推迟到实际的用户会话.
最简单的方法是让应用程序在第一次运行时进行设置.
安装程序只能部署应用程序可用于设置的共享文件.
如果由于某种原因无法修改应用程序,则必须迭代所有帐户并进行修改:
>对于文件:Inno Setup Create individual shortcuts on all desktops of all users
>对于注册表:Uninstall auto-run registry entries for all users
如果您需要确保将设置分发到仅在安装后创建的帐户,请参阅How to install files for each user,including future new users,in Inno Setup?
如果您对仅为登录用户设置应用程序这一事实感到满意,请使用PrivilegesRequired=lowest
:
[Setup] Privilegesrequired=lowest
如果您仍需要安装的某个子任务的管理员权限,则只能请求子任务的权限提升:
> Inno Setup – Register components as an administrator
> Inno Setup – Access unprivileged account folders from installer that requires privileges
如果要通过显式运行具有管理员权限的安装程序来防止用户违反此规定,请参阅
> Can’t get Inno Setup postinstall Run item to runasoriginaluser或
>我对How to write to the user’s My Documents directory with installer when the user used ‘Run As Administrator’的回答.
或者您可以通过编程方式找出当前Windows登录会话的帐户: