通过Windows Vista / 7上的Inno Setup将文件安装到原始用户的My Docs文件夹

时间:2010-12-09 22:28:20

标签: windows-7 windows-vista uac inno-setup

在Inno安装脚本的[Run]部分中,有一个标记runasoriginaluser,允许脚本以原始用户身份运行进程:

  

生成的进程将执行   (通常不提升)   已启动的用户的凭据   最初设置(即“UAC前”   对话框“凭证”。

{userdocs} shell文件夹常量是否有等效的标记或解决方法?

这显然是Inno Setup(以及其他安装程序)的一个已知限制,但我希望有人知道解决方法。

摘自Inno Setup帮助文件:

  

“用户”常量指的是   运行安装程序的用户的配置文件   这个用户通常不一样   当前登录的用户,请使用   “用户”常量要谨慎。

2 个答案:

答案 0 :(得分:0)

我提出的解决方法是使用外部脚本执行数据复制并使用ExecAsOriginalUser事件函数的wpReady页面中的NextButtonClick函数调用脚本。 / p>

如果有人有兴趣,我会提供更多细节。

答案 1 :(得分:0)

您的方法不正确。

有两种正确的方法:

  1. 如果安装程序仅为当前(非特权用户)安装应用程序,则不要求管理员权限,方法是将PrivilegesRequired设置为lowest

    [Setup]
    PrivilegesRequired=lowest
    

    然后"用户"常量将正确引用当前用户的文件夹。

  2. 如果安装程序为所有用户安装应用程序,则将某些文件放入某个特定用户的文件夹中没有意义。所有用户都需要这些文件,而不仅仅是文件。在这种情况下,推荐的方法是将文件安装到" Common"文件夹,使用{commonappdata} constant(或类似)。并让应用程序在第一次运行时将文件复制到用户文件夹。

    另见How to write to the user's My Documents directory with installer when the user used 'Run As Administrator'

  3. 您还可以允许用户在这两种方法之间进行选择 请参阅Make Inno Setup installer request privileges elevation only when needed

    关于其他类似问题,请参阅

    话虽如此,您可以通过使用copy(或{3}}执行外部复制实用程序(xcopyrobocopyExecAsOriginalUser function),如您所发现的那样。 [Run]部分中的runasoriginaluser flag

    ExecAsOriginalUser(
      'cmd.exe', '/c xcopy.exe "sourcefile" "%APPDATA%"',
      '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    

    有关此方法的更多详细信息,请参阅类似问题Inno Setup Creating registry key for logged in user (not admin user)

    但是,如果安装程序立即启动升级(与提升本身相反),则上述工作无法正常工作。无论如何,它无法在这种情况下工作。见How to write to the user's My Documents directory with installer when the user used 'Run As Administrator'。因此,请坚持上述方法。