如何检查应用程序是否已安装(对于任何用户)并使其升级而不是安装?

How to check if an application is installed (For any user) while and make it an upgrade, instead of install?

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

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

这适用于 MSI 安装的东西。

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

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

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

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

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