如何查找已安装的产品 - 较新的产品已经安装在MSI Windows中

4
我可以通过WIX创建MSI ->我们在IIS上安装了它。现在的情况是,我们已经安装了某个版本的应用程序,比如说1.8,然后我们为了测试目的安装了版本99.0,接着卸载了这个版本。然后我尝试安装其他版本时出现了错误:已经安装了更新的产品版本。
之后,我尝试更改产品的升级代码 - 并再次制作高版本,然后卸载并安装低版本 - 这样就可以正常工作了。
所以我感觉自己遗漏了一些东西 - 另外的信息是,在程序和功能列表中,我找不到卸载后的高版本应用程序 - 那么我的问题是,安装程序是如何评估是否有更新版本的?安装的信息(用于比较)存储在哪里,如何有效且轻松地访问它们?这样我就可以直接查看了。

不确定是否回答了核心问题,但是添加了一个链接,其中描述了如何获取给定机器的所有关联产品代码、升级代码和产品名称的完整列表:如何找到已安装的MSI文件的升级代码? - Stein Åsmul
1个回答

6

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有更新版本。如果有人有更直接的回答 - 我在哪里可以看到某种表格,其中OS Windows决定是否真的有更新版本?在日志中,您可以查看相关产品 - 然后我获取了日志中列出的产品代码,删除了注册表中的条目,但仍然出现错误,提示已安装新版本 - 那么它可能不是注册表,在那里MSI决定某些东西是否已经安装。 - Petr Kováč
谢谢,我们可能已经找到解决方案了。我在Subversion中搞砸了升级代码(最初它们是错误的,但我已经修复了),我们从旧版本构建,对于4个应用程序我们使用相同的升级代码,因此在服务器上安装了不同的应用程序,这造成了混乱。 - Petr Kováč
请注意,第5行中存在一个错误,当存在Unicode产品名称时,脚本将崩溃 - 应该是:fso.CreateTextFile("prodex.txt", True, True)。我编辑了答案以更正此问题,但审核人员出于某种原因拒绝了我的编辑... *耸肩* - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接