Windows安装程序太聪明,尝试在测试人员删除配置文件时进行修复

时间:2014-03-06 15:32:06

标签: installer windows-installer msiexec

我们的应用程序使用msi文件部署到目标计算机。一切都很好。我们的测试人员已完成他的计划,其中一项测试需要删除应用程序的配置文件。该应用程序旨在通过启动时显示“缺少配置”的对话框提醒用户。但是,会发生什么 - 不知何故! - 软件再次启动安装程序并从msi中检索丢失的文件!哪个好,但不是我们想要的。我们如何禁用这种行为?

4 个答案:

答案 0 :(得分:3)

没有深入了解Windows安装程序的机制(如果您对此有大量文章感兴趣),可能会宣传该软件的快捷方式,这意味着Windows安装程序会检查是否所有内容都在该软件已启动。

如果您可以编辑msi,请将快捷方式设为非广告。 如果不能,请使用DISABLEADVTSHORTCUTS

进行安装

e.g。 msiexec / i myMsi.msi DISABLEADVTSHORTCUTS = 1

请注意,这只是一个快速(和肮脏)的解决方法, 要解决这个问题,你需要了解整个Windows安装程序广告(也称为修复或自我恢复)机制。 但解释修复的所有原因和机制远远超出了这个答案,并且在互联网上有相当多的文章和帖子(特别是在MSDN和stackoverflow上)

答案 1 :(得分:2)

对此有一个更正确的答案,它不是DISABLEADVTSHORTCUTS。您在MSI文件中将组件ID设置为null,以防止修复该单个文件。请参阅此处的ComponentId注释:

http://msdn.microsoft.com/en-us/library/aa368007(v=vs.85).aspx

使用Orca编辑MSI文件以删除Componenty ID,并编写卸载自定义操作以在卸载时删除该文件(如果存在)。

此外,这是一项冗余测试。如果缺少Windows,Windows将为您恢复该文件,因此您需要通过测试来通知它丢失的想法毫无意义。真正的测试应该是,如果文件丢失,Windows将恢复该文件,并且您的应用程序可能无需对丢失的文件做任何事情。

答案 2 :(得分:1)

你没有提到你正在使用什么工具制作你的MSI,但是我会想出去思考Visual Studio部署项目(.VDRPOJ)。

关于这个工具的(很多)可怕的事情之一是它没有暴露组件的基本概念。相反,它使每个文件成为它自己组件的密钥文件,并隐藏了组件的存在。我说'是'因为微软在VS中杀死了这个项目类型。有大约5万人在UserVoice上抱怨要把这个工具带回来,我猜他们中有49,990人不知道关键路径是什么。

Windows Installer有一个称为组件规则的概念,每个组件都有一个keypath。 keypath教MSI如何处理修复方案。但是你的工具必须允许你控制它才能使它工作。

Windows Installer的运行方式完全正常。你只是不知道那是什么。

但是,如果您想忽略Windows Installer最佳做法并继续使用您今天使用的工具,那么诀窍是将app.config文件安装为另一个文件。然后让应用程序将文件复制到运行时的真实文件名。 Windows Installer无法为未安装的内容提供服务。

答案 3 :(得分:1)

提供了几个可行的答案:

  • 您可以使用空白guid 安装该文件。然后,您需要使用RemoveFile功能在卸载时将其删除。如果要在升级期间替换它,也会遇到问题。有时可能很棘手。
  • 您可以停用播发的快捷方式,但这在我看来影响太大。
  • 最后,您可以使用我的建议安装一个单独的未公布的快捷方式来用于启动该应用程序。这样的快捷方式绕过了自我修复检查。它仍然可以通过其他方式调用,例如缺少文件关联,COM注册或类似方法,但这些是异常状态。

但是,我的偏好是应用程序可以在没有配置文件的情况下启动,如果可能的话。我总是建议使用“内部默认值”的良好启动例程可用。如果遇到任何文件系统访问被拒绝的情况,启动例程也应正常降级

最重要的是,您应将此配置文件放在用户配置文件中,这样您就可以在首次启动时为相关用户生成该文件。它甚至可以从主安装目录中的只读副本进行复制。

从内部默认值生成文件并将其放在userprofile位置时,该文件根本不会干扰Windows Installer。导致的问题是如何清除用户数据卸载。我曾与Stefan Kruger(MSI MVP)讨论过这个问题,我同意他的观点,即用户数据确实是用户数据,安装人员根本不会自动处理。保持安装状态,并在必要时通过系统管理员工具进行清理 - 例如登录脚本。