为什么在使用 MSI 时将文件部署限制到用户配置文件或 HKCU 是个好主意?

Why is it a good idea to limit deployment of files to the user-profile or HKCU when using MSI?

为什么从我的 MSI 或安装文件中将文件部署限制到用户配置文件或 HKCU 是个好主意?


部署是大多数开发的关键部分。请给这个内容一个机会。我坚信,通过对应用程序设计进行微小更改,使部署更合理、更可靠,可以显着提高软件质量 - 这就是 "answer" 的全部内容 - 软件开发.


这是一个 Q/A-style 问题,从一个太长的答案中拆分出来:

如上所述这部分是从范围更广的现有答案中拆分出来的(一个旨在帮助开发人员做出更好的部署决策)。


9。 过度使用每用户文件和注册表部署

有些应用程序无法 运行 正确地为一台机器上的所有用户使用,因为在安装过程中添加的用户特定数据没有正确添加到其他用户的配置文件和注册表中。换句话说,该应用程序仅适用于安装该软件的用户。 这显然是一个严重的设计错误

有几种方法可以"fix",但是部署每用户文件和设置的整个问题有点混乱,原因有几个:

  • 如何引用多次安装的计数组件? (对于机器上的每个用户)
  • 您如何处理卸载时安装的数据和设置?
  • 您如何处理要安装的新文件和设置,这些文件和设置不同于磁盘上和注册表中的文件和设置,并且有用户更改?你确定不会自动覆盖?

没有真正明确的答案,但有几种替代方法可以处理 "problems"。我的首选选项是 2 和 3,因为我认为 Windows 安装程序不应该部署、跟踪或尝试修改,或者更糟的是,根本不应该卸载用户数据和设置——用户数据不应该被干涉:

9.1 使用 Windows 安装程序自我修复或类似功能

第一个选项是通过设置本身或类似设置的功能正确部署设置和文件以及 HKCU 注册表项。有两种主要方法可以做到这一点:依靠 Windows 安装程序“自我修复”,通常由广告快捷方式触发,或使用 Microsoft Active Setup.

  • 自我修复是当您启动快捷方式来启动您的应用程序时发生的事情,并且 Windows 安装程序启动并且您在安装 "something" 时看到进度条.通常添加的是 HKCU 注册表项和用户配置文件。

  • 还有另一种方法可以实现这一点,它被称为 Active Setup and is also a Microsoft feature. It essentially registers "something runnable" to run once per user on logon. This can be used to set up per-user data. Active Setup 允许执行 "anything runnable" - 例如将文件复制到用户配置文件。 .

  • 这两个选项都意味着用户数据和设置被复制到位一次 - 从那时起它们通常不会被触及,但在 "self-repair" 的情况下可能会被卸载对于实际 运行 卸载应用程序的任何用户(除非安装程序设计为不这样做)。

  • 虽然使用自我修复和活动设置设置用户数据是"established"正确获取应用程序运行的方法,但使用[=跟踪用户数据似乎是错误的176=] 安装程序组件。为什么?因为它真的是用户数据,一旦初始化就不能乱动。

  • 因此,我对整个问题的诚实看法是尽量避免完全部署用户特定数据或注册表项和值,这就是所描述的内容接下来是另外两种用户数据部署方法。

9.2 用户数据的应用程序初始化

第二种选择,也是我发现更简洁的一种,是更改您的应用程序可执行文件,以便能够根据默认设置和从每台计算机位置或基于复制的模板初始化所有每用户设置和文件关于应用程序内部默认值(来自源代码),而不是通过您的设置编写它们。

  • 在这种情况下 Windows 安装程序将不会跟踪复制到每个用户的文件或设置。它被视为根本不应受到干扰的用户数据。 这避免了升级和自我修复(以及手动卸载和重新安装)过程中重置或覆盖用户数据等所有干扰

  • 如果在某些情况下必须对应用程序设置进行 "fixes",这可以通过让应用程序可执行文件在启动时更新每个用户的设置,然后标记注册表来实现更新已经完成。

  • 总的来说 "conclusion" 您的设置应该 为首次启动准备您的应用程序 ,它不应该设置用户数据和设置环境.应用程序应默认所有用户配置文件和 HKCU 设置,以防它们在启动时丢失 - 这会产生更强大的应用程序,也更容易为 QA 人员测试。这对于根本不允许自我修复 运行 的终端服务器尤为重要。在这种情况下,如果您依靠自我修复来放置用户数据,应用程序数据将会丢失。

9.3 "Cloud" 或用户设置的数据库存储

在今天的 "cloud environment" 中更进一步 - 这是我认为的首选方案。为什么您的应用程序应仅限于文件和注册表项和值?为什么不将所有用户特定设置存储在解决方案的数据库中?

  • 所有设置的完全访问、控制和持久性,根本没有任何部署问题。

  • 虽然您确实遇到了新的管理问题,但它们必须在开发人员、系统管理员和数据库管理员之间共享。但现在云不是几乎成为行业标准吗?

  • 我们已经为漫游配置文件、损坏的用户注册表、错误处理的用户配置文件数据文件等问题苦苦挣扎了很长时间...。开发人员,为自己省去很多麻烦,给自己制造一些新的数据库管理问题而不是部署问题——然后开始对一群新人大喊大叫! :-).

  • 数据库中的设置是:

    • 未患"dual source problems"。有一个实例,它是实时更新的。不像 user-profile 和 "roaming".

    • 中出现的同步问题
    • 可检查、可管理和可修补

    • 可修改(版本控制 - 可以恢复旧设置)

  • 您甚至可以 "tweak" 您的设置中的所有用户设置仍然通过 运行ning 数据库脚本作为部署的一部分,但是如果您在公司环境中 - 是只是提出一个问题,然后让您的数据库管理员 运行 具有适当事务支持和回滚的维护脚本的想法更有吸引力吗?

  • 即使您交付的是供一般分发和第三方使用的大型胖客户端供应商应用程序(换句话说,不是定制的企业 client/server 解决方案,您可以保证有后端数据库),应该考虑用户设置的云存储,让用户使用他们的电子邮件或类似的方式登录到云,然后实时同步设置。

    • 这么大的应用程序一般总是需要"cache"一些设置文件在电脑上和HKCU里,但似乎越来越有可能将所有设置保存在一个临时文件中完全 "sacrificial" 的用户配置文件区域,如果损坏甚至可以删除,然后下载最后保存的设置。

    • 不用自己托管云,显然可以使用公司 DBO 配置他们自己的公司范围的云,他们可以完全控制所有设置,还可以强制执行策略和限制为您的软件的操作。更不用说所有用户设置都可以进行适当的备份了。