如何找出已安装的产品 - 已安装较新的产品 MSI windows

Posted

技术标签:

【中文标题】如何找出已安装的产品 - 已安装较新的产品 MSI windows【英文标题】:how to find out which products are installed - newer product are already installed MSI windows 【发布时间】:2015-05-11 20:29:22 【问题描述】:

我可以通过 WIX 创建 MSI -> 我们将它安装在 IIS 上。发生了什么 - 我们已经安装了一些版本的应用程序,比如说 1.8,然后我们安装了版本,比如说 99.0,只是为了测试目的,然后我们卸载了这个 99 版本。然后我尝试安装其他版本,得到:已经安装了新版本的产品。

然后我尝试更改产品的升级代码 - 再次制作高版本,然后卸载并安装低版本 - 效果很好。

所以我觉得我遗漏了一些东西 - 附加信息是在程序和功能列表中我在卸载后找不到更高的应用程序 - 那么我的问题是安装程序如何评估有更新的版本?有关已安装(并用于比较)的信息究竟存储在哪里以及如何有效和轻松地访问它们?这样我可以直接看吗?

【问题讨论】:

不确定它是否回答了核心问题,但添加了一个指向答案的链接,该链接描述了如何获取给定机器的相关产品代码、升级代码和产品名称的完整列表:How can I find the Upgrade Code for an installed MSI file?. 【参考方案1】:

ProductCode 标识特定产品。每次您运送新的替换产品时,它都会发生变化。 UpgradeCode 定义了一系列产品,通过在更新的产品中使用相同的 UpgradeCode,其版本预计会不断增加。默认情况下,新产品版本会通过重大升级替换旧产品版本。因为 upgradecode 定义了一个产品系列,Windows 将寻找具有相同 UpgradeCode 的产品,因为相同的 UpgradeCodes 意味着互斥产品,使用它们将旧产品替换为新产品。在 WiX 中,主要升级是使用您可能正在使用的 majorupgrade 元素完成的,因为您会收到“安装了较新版本”的消息。如果您想“升级”到较低版本,那里有一个 AllowDowngrade 选项。

产品版本(如文件版本)不仅仅是有用的信息 - 系统使用它们时理解新版本替换旧版本,通常返回较低版本是一件坏事,这就是默认行为不允许降级的原因.

这个脚本可能会有所帮助。它使用 Windows Installer 脚本 API 来枚举所有已安装的产品,显示版本、用户 sid、ProductCode 等:

Option Explicit
Public installer, fullmsg, comp, prod, a, fso, pname, ploc, pid,contxt, sid, psorce, pcache, pvers

Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.CreateTextFile("prodex.txt", True)

' Connect to Windows Installer object
Set installer = CreateObject("WindowsInstaller.Installer")
a.writeline ("Products")
'on error resume next
For Each prod In installer.ProductsEx("", "", 7)
   pid = prod.ProductCode
   contxt = prod.Context
   sid=prod.usersid
   pname = prod.InstallProperty("ProductName")
   psorce = prod.InstallProperty("InstallSource")
   ploc =prod.InstallProperty("InstallLocation")  
   pcache = prod.InstallProperty("LocalPackage") 
   pvers=prod.InstallProperty("VersionString")
   a.writeline (pid & " " & pname & " " & pvers & " installed at <" & ploc & "> from " & psorce & " Context " & contxt & " Local " & pcache)
Next

【讨论】:

好吧,我或多或少知道你写了什么,但是问题就是问题-> 据说根据 windows 有更新的版本。如果有人有更直接的答案 - 我在哪里可以看到操作系统窗口决定是否真的有更新版本的某种表格?在日志中您可以看到相关产品 - 然后我获取了日志中列出的产品代码,删除了注册表中的条目,但仍然收到安装新版本的错误 - 那么它可能不是注册表,MSI决定是否安装了某些东西 谢谢,我们可能找到了解决方案。我在颠覆中弄乱了升级代码(最初它们是错误的,但是我修复了它们) - 我们从旧版本构建,我们是否为 4 个应用程序留下了相同的升级代码,所以在服务器上安装了差异。具有相同升级代码的应用程序弄得一团糟。 请注意,第 5 行有一个错误,当有 Unicode 产品名称时,脚本会崩溃 - 它应该是:fso.CreateTextFile("prodex.txt", True, True)。我编辑了答案以纠正这个问题,但审稿人出于某种原因拒绝了我的编辑... *耸耸肩*

以上是关于如何找出已安装的产品 - 已安装较新的产品 MSI windows的主要内容,如果未能解决你的问题,请参考以下文章

获取已安装 Msi 的产品代码

是否可以/建议安装TortoiseHg如果已安装(较新的)mercurial?

Wix 重大升级,无论文件版本较新,都替换文件

安装后MSI文件复制到哪里?

如何找到已安装 MSI 文件的升级代码?

如何解决会声会影已安装这个产品的另一个版本