0

我有一个安装在许多站点上的产品。现在我们发布了升级版。但问题是,在第一个版本中,安装是按用户进行的,现在我们已经按照机器安装进行了安装。当检测到旧安装 (v2) 时,新版本 (v3) 中有一些自定义操作会运行。但是,当 msi 以安装版本 2 的其他用户身份运行时,它不会被检测为已安装。有没有办法检测是否安装了旧版本(即使它是由与当前用户不同的用户安装的),可能在安装脚本中。

4

2 回答 2

1

检查两个注册表 64/32 以获取已安装的应用程序。在这些键下查找您的产品 G​​UID。如果它在那里,它已安装。

这适用于 MSI 安装的东西。

32 位:[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall]

64 位:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall]

于 2015-09-09T19:53:57.927 回答
0

由于您不知道一台机器上可能有多少用户以及谁按机器或每个用户安装了您的产品,我认为唯一彻底的方法是使用MsiGetProductInfoEx()或等效于为机器的所有用户搜索您的产品。例如,我不知道您的确切情况,但是如果管理员代表为每个用户安装它的用户安装您的新的每台机器产品,那么除非您能找到实际安装它的用户,否则您将陷入困境。寻找每个用户的管理员安装并不好!您需要枚举所有用户,获取每个 SID 并询问它是否使用该 API(或等效项)安装了您的产品。如果找到,您会告诉用户以该用户身份登录并卸载产品。IIRC 当另一个用户(甚至是管理员)尝试卸载另一个用户安装的每用户产品时,它并不总是成功。

根据我的经验,在大多数情况下,人们会尝试使用某种独立于安装上下文的检测方法来检测产品是否已安装。然后,如果您的每台机器主要升级没有设置表明它发现每台机器安装的属性,则只需抛出一个错误并要求手动卸载。

注意:添加了自定义操作并使用::MsiConfigureProduct()来卸载和MsiGetProductInfoEx()来检查产品是否已安装

于 2015-09-16T18:25:32.897 回答