【问题标题】:Proper way of installing per-user files during a per-machine installation在每台机器安装期间安装每用户文件的正确方法
【发布时间】:2016-08-18 19:48:13
【问题描述】:

我有一个每台机器的 WiX 安装程序 (InstallScope="perMachine" InstallPrivileges="elevated"),我需要创建一个文件夹并将一些文件复制到每个运行该应用程序的用户的 Documents 文件夹中。目前我将文件安装到当前用户的个人文件夹中,但这是错误的,我收到 ICE91 验证警告:

ICE91: The file 'SomeFile' will be installed to the per user directory 'SomeDir'
that doesn't vary based on ALLUSERS value. This file won't be copied to each
user's profile even if a per machine installation is desired.

我希望将文件自动复制到每个用户的 Documents 文件夹中。有人可以发布分步说明如何做到这一点吗?

更新:我将放假到 9 月,在此期间我将无法回复任何 cmets。

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    Windows Installer 将执行此操作 - 这就是宣传的快捷方式将执行的操作。如果您将文件安装到用户特定的文件夹位置并且其他用户登录,则该用户将丢失该文件,并且广告快捷方式修复的修复机制将从原始 MSI 文件安装它。在您的情况下, PersonalFolder 属性是用户的 Documents 文件夹。

    为此,文件必须是组件的键路径,并且该组件必须位于具有广告快捷方式的功能中。使用快捷方式时,会检查组件和包含功能的“自我修复”并安装丢失的文件。这适用于尚不存在的用户。旧版 Office 安装程序曾经这样做是为了安装特定于用户的项目,例如模板。

    显然必须有 MSI 才能正常工作,并且没有在卸载时删除文件的机制。

    另一种方法(或者如果没有广告的快捷方式)是将代码添加到调用 MsiProvideComponment(或等效 p/invoke)的应用程序中,传递 ProductCode、功能名称、组件 ID(该文档文件的)并使用 INSTALLMODE_DEFAULT,如果这里记录的文件丢失,它将安装该文件:

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa370356(v=vs.85).aspx

    它会丢失,因此将为之前没有运行过该应用程序的用户安装。

    【讨论】:

    • 这甚至是可能的
    • 请注意,它要求每个用户都可以使用原始 .msi(和 .cab,如果是外部文件)。
    • 我更改了要宣传的功能,但没有帮助。我安装的所有文件都将其 keypath 属性设置为 true,它们属于添加到功能中的组件组。缺少什么?
    • 宣传的不是功能,而是捷径。要做的第一个测试是从当前安装的产品中删除文件,然后使用快捷方式并查看它是否重新安装文件。如果这对您有用,那么它将适用于缺少该文件的其他用户。
    • Hmmm.... 主可执行文件的快捷方式已公布,但当我删除文件并尝试使用快捷方式启动应用程序时没有修复发生。
    【解决方案2】:

    您为什么要这样做?如果机器上有 10000 个(仅举例)用户怎么办?您想将文件复制到所有 10000 个文档文件夹中,占用潜在的 GB 空间(取决于文件复制的大小)?如果这些是您的应用所需的配置选项,则应用本身应在首次运行时在用户的文档位置创建默认文件(如果它们不存在),否则从这些文件加载​​设置。您不应该在安装时为机器上的每个用户放置默认文件。

    对于安装后添加的新用户,此方法也会失败。他们将如何获取文档文件夹中的文件?他们必须重新安装产品吗?

    【讨论】:

    • 我从另一个离开的开发人员那里继承了一个项目,我别无选择,只能保留原始设计,这将是一个突破性的变化,用户不希望将文件移动到其他地方。我问了和你一样的问题——新用户如何在他们的文档文件夹中获取文件?这些文件很小,所以不会是 GB 的数据,工程师(我的软件的用户)通常不会在他们的机器上创建 1000 个用户。
    • 这只是一个夸张的例子来说明为什么我认为这样做是一种不好的做法。广告方法似乎是您想要的,但让它工作似乎可能很复杂。
    【解决方案3】:

    考虑每台机器安装每个用户的安装程序,并使用感兴趣的用户可以启动的快捷方式。例如,templates.msi、examples.msi。

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多