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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Windows Vista / 7上的Inno Setup将文件安装到原始用户的My Docs文件夹相关的知识,希望对你有一定的参考价值。

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

生成的进程将使用最初启动安装程序的用户(通常是非提升的)凭据(即“UAC前对话框”凭据)执行。

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

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

摘自Inno Setup帮助文件:

“用户”常量指的是运行安装程序的用户的配置文件。此用户通常与当前登录的用户不同,因此请谨慎使用“用户”常量。

答案

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

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

另一答案

你的方法不正确。

有两种正确的方法:

  1. 如果安装程序仅为当前(非特权用户)安装应用程序,则不要求管理员权限,方法是将PrivilegesRequired设置为lowest[Setup] PrivilegesRequired=lowest 然后“用户”常量将正确引用当前用户的文件夹。
  2. 如果安装程序为所有用户安装应用程序,则将某些文件放入某个特定用户的文件夹中是没有意义的。所有用户都需要这些文件,而不仅仅是文件。在这种情况下,建议的方法是使用{commonappdata} constant(或类似文件)将文件安装到“Common”文件夹。并让应用程序在第一次运行时将文件复制到用户文件夹。 另见How to write to the user's My Documents directory with installer when the user used 'Run As Administrator'

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

对于其他类似的问题,请参阅


话虽如此,你可以像你发现自己一样,使用copy(或xcopy部分中的robocopy)执行外部复制实用程序(ExecAsOriginalUser functionrunasoriginaluser flag[Run])。

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'。因此,请坚持上述方法。

以上是关于通过Windows Vista / 7上的Inno Setup将文件安装到原始用户的My Docs文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Windows Vista/7 上的 SDL_Mixer MIDI 音量问题

如果防火墙打开,Java 7 会阻止 Windows Vista 和 7 上的 FTP 传输。有任何想法吗?

Windows Vista/7:如何对输出音频混合进行采样?

带有 .NET 安装程序的 Windows Vista 上的文件安全性

哪里是存储与XP,Vista和Windows 7兼容的日志文件的安全位置?

Windows 7 上错误的桌面快捷方式图标(Inno Setup)