遇到WIX升级问题

时间:2015-04-24 07:59:41

标签: wix windows-installer installer custom-action msiexec

WIX安装程序升级存在问题。以前我们为每台机器安装了2个安装程序版本1,为每个用户安装了另一个版本。

目前我们已开发出双模MSI。

当选择自行安装选项时,双模式MSI升级先前安装程序的PerUser版本(在PC 1上)但是当选择安装(在PC 2上)时,它会安装新产品

我们正在做或者必须设置一些属性是否有些错误。我们正在使用WIX。

请帮忙

4 个答案:

答案 0 :(得分:2)

每用户安装允许为不同用户多次安装同一产品 - 也可以在不同版本中安装。这使得升级和补丁难以处理,我完全不喜欢这个每用户概念。 我更喜欢将每台计算机的安装程序设置为标准。我觉得功能上没有太多损失,但在管理能力方面获得了很多。虽然这不是您的问题的答案,但值得指出的是,每用户安装是一个有缺陷的概念 - 充其量。

我不知道是否可以选择设置每台计算机的安装程序,但我找到了一种方法,通过使用Installshield及其自动将安装从每个用户迁移到每台计算机自定义 ISSetAllUsers 自定义操作。该过程在此处描述: windows Installer - uninstalling previous version when the versions differ in installation policy (per-user, per-machine)

据我所知,

Wix 没有这样的自定义操作,但您可以使用 Win32 API 调用::MsiEnumRelatedProducts()编写自己的自定义操作Rob Mensching在此描述:how to change from per user to all user installation?

以下是类似的帖子供参考:How can a perUser installation program deal with a perMachine older version of the program?

以下是一篇描述(进一步)每用户安装问题的博客:Understanding “Per-User” or “Per-Machine” context for application Setup packages

让我补充几点意见:

  • 您可以在没有按用户安装的情况下进行每用户设置。这没问题,只需让应用程序在启动时设置userprofile即可。我更喜欢安装每台机器的所有资源文件和设置,并让应用程序将它们复制到每个用户进行首次启动初始化。这可确保用户设置完全不与MSI纠缠在一起。
  • 很少同时维护同一产品的两个单独版本 - 因此用户都可能使用相同版本的产品。从这个角度来看,每用户只是更头疼。
  • 每用户安装程序方案中涉及的升级和修补逻辑打败了我 - 这对我没有任何意义。如果已经安装了每台机器,那么每用户安装是否对您有意义?这是否会再次安装应用程序?
  • 如果每个用户的安装仍然很重要,也许您可​​以尝试ClickOnce(如果它仍然有效)。来自维基百科的引用:“ ... ClickOnce部署的应用程序被认为是”低影响“,因为它们是按用户而不是按机器安装的。安装其中一个应用程序不需要管理员权限。每个ClickOnce应用程序与其他应用程序隔离。这意味着一个ClickOnce应用程序无法“破坏”另一个应用程序。“。如果用户安装与自动更新和Web部署相关联,则更有意义。

答案 1 :(得分:1)

我相信这是因为在您的安装程序中,默认模式是每用户,因此它不会检测每台计算机。 如果赋值类型为“1”,您可以使用MSIGetProductInfo查找已安装的产品,然后您可以将以下属性设置为每机器产品的产品代码 WIX_UPGRADE_DETECTED OLDERVERSIONBEINGUPGRADED

在按钮单击上使用自定义操作或在FindRelatedProducts之后安排它。 这告诉安装程序现有版本,安装就像升级一样处理。

答案 2 :(得分:1)

Windows Installer不会在每个用户和每台计算机之间进行升级,反之亦然。如果您希望这种情况发生,您需要以某种方式进入安装前,并找出已安装的类型。在为另一个用户(即不是当前的安装用户)安装产品时尝试这样做是很棘手的。可以调用MsiEnumRelatedProuctsEx几次,查找每台机器和每个用户的安装情况,以查看正在进行的操作。但是,您可能会遇到问题,用户A,尝试卸载用户B为每个用户安装的产品。如果您是同一个用户,则更容易。可以调用MsiEnumRelatedProductsEx几次以查看产品是按用户还是机器(可能在启动器中),并且可以在安装新升级之前卸载产品,或者至少告诉用户进行卸载。无论如何,它可能是一团糟,坚持每台机器安装的建议是值得的。

我还应该指出,允许每个用户和每台机器安装在同一台机器上是一个功能,而不是一个错误。

答案 3 :(得分:1)

如果之前有两个设置,可能是您有两个升级代码,并且需要同时处理两个升级才能在所有情况下都能正常运行?

我处理每个用户的内容已经很长时间了,但一般情况下,您必须作者 Upgrade table以包含两个升级代码您的设置,以检测以前安装的所有风格。升级表允许您在安装新产品之前检测应安排卸载的任意数量的先前安装。

FindRelatedProducts MSI操作将搜索目标计算机上的所有程序包,以便查找升级代码属性与升级表中指定的值匹配的任何位置。

按建议制作详细日志文件

msiexec.exe /I "File.msi" /QN /L*V "C:\Temp\msilog.log"
/I = run installation sequence
/L*V "C:\Temp\msilog.log"= verbose logging
/QN = run completely silently