为啥我的安装程序正在搜索另一个不存在的 MSI?
Posted
技术标签:
【中文标题】为啥我的安装程序正在搜索另一个不存在的 MSI?【英文标题】:Why is my installer searching for another, non-existent MSI?为什么我的安装程序正在搜索另一个不存在的 MSI? 【发布时间】:2016-02-22 14:59:51 【问题描述】:我的安装程序最近在升级期间开始崩溃。刚放下文件后,它会显示一个框,上面写着:
尝试读取文件时发生网络错误: C:\Users\user\AppData\Local\Temp\2\MyInstaller.msi
我确信这个错误是正确的,因为我们从未发送过文件 MyInstaller.msi
。我发送Package.msi
,使用自定义引导程序将其引导为MyInstaller.exe
,然后使用MyInstaller.exe
调用msiexec /i Package.msi
。
直到最近 Package.msi
在试图寻找 MyInstaller.msi
时开始失败,这一直是完美的。为什么会这样做? Wilogutl.exe 仅显示“标准或自定义操作似乎失败了”。这不是很有帮助。
我仍然不确定为什么会发生这种情况,但我发现了一个可能相关的日志部分:
MSI (c) (D0:54) [09:03:23:868]:进入 CMsiConfigurationManager::SetLastUsedSource。
MSI (c) (D0:54) [09:03:23:869]:指定的源已经在列表中。
MSI (c) (D0:54) [09:03:23:869]:用户策略值“SearchOrder”为“nmu”
MSI (c) (D0:54) [09:03:23:869]:机器策略值“DisableBrowse”为 0
MSI (c) (D0:54) [09:03:23:869]:机器策略值“AllowLockdownBrowse”为 0
MSI (c) (D0:54) [09:03:23:869]:允许添加新源。
MSI (c) (D0:54) [09:03:23:869]:属性更改:添加 PackagecodeChanging 属性。它的值为“1”。
MSI (c) (D0:54) [09:03:23:869]:从配置数据中检索到的包名称:'MyInstaller.msi'
MSI (c) (D0:54) [09:03:23:869]:注意:1:2205 2:3:错误
MSI (c) (D0:54) [09:03:23:871]:注意:1:2262 2:AdminProperties 3:-2147287038
MSI (c) (D0:54) [09:03:23:871]:机器策略值“DisableMsi”为 1
MSI (c) (D0:54) [09:03:23:871]:机器策略值“AlwaysInstallElevated”为 0
另一个奇怪之处:添加/删除程序显示已安装旧版本,而我的二进制文件证实了这一点。但是,如果我尝试直接为新版本运行 MSI,我会收到错误消息:
已安装此产品的另一个版本。安装 此版本无法继续...
当我在开发过程中尝试安装具有相同版本但不同包代码的 MSI 时,经常会收到此错误消息。不过,Orca 表示新的 MSI 绝对是更高版本。
【问题讨论】:
【参考方案1】:关于您上次对相同版本但不同包代码的评论,版本可能有些无关紧要。 ProductCode 定义了一个产品已经安装,因此尝试使用相同的 ProductCode(但不同的版本)安装其他东西将导致该消息。 PackageCode 很重要,但大多数工具只是在每次构建时生成一个新的,所以这通常不是问题。因此,如果您真的在进行升级,您应该在前三个字段中的某个位置添加一个 WiX 主要升级元素和一个新的 ProductCode 和 ProductVersion 增量。
如果这是在客户端系统上,他们是否可以安装其他产品?您是否安装了可能与其他产品共享的任何相当常见的项目(可能来自合并模块)?例如,如果您要安装一个组件 ID 中断共享的常用共享文件(Crystal Reports、C++ Dlls 等),那么您可能会触发 Windows 尝试通过转到另一个 MSI 文件来解决共享版本问题。顺便说一句,当 MSI 安装使用“版本谎言”时,这可能是一个常见问题,而实际安装的文件的版本与 MSI 文件的文件表中的版本不同。此外,请查看 Windows 事件日志、应用程序、MsiInstaller 条目,因为可能有一个条目的组件 ID 被列为修复触发器并从其包含的产品 MSI 文件中获取文件。
为了让事情更加混乱,1 的 DisableMSI 策略会阻止某些安装(请参阅文档)。
【讨论】:
嗨菲尔,不幸的是,我仍然不知道问题是什么,但我已经找到了解决方法。当我说“升级”时,我指的是次要的。这两个软件包确实具有相同的产品代码和主要版本,但我们一直都这样做。如果您能阐明为什么 Windows 可能会缓存我的安装名称(正如我在回答中所描述的那样),我会给您一个支持 :)【参考方案2】:在我不知道的情况下,Windows 会缓存最初用于安装产品的 MSI 的文件名。因此,当我运行旧版本时,我的引导程序将 MSI 卸载为MyInstaller.msi
,并安装我的产品。
我最近更改了引导程序以将其卸载为 Package.msi
。现在,在这些神秘的情况下,windows 将文件名缓存为MyInstaller.msi
,并在运行Package.msi
的过程中尝试引用不再存在的MyInstaller.msi
。
我不知道它为什么这样做或如何让它停止,但我已恢复我的更改并再次从引导程序卸载我的 MSI 为MyInstaller.msi
。
【讨论】:
以上是关于为啥我的安装程序正在搜索另一个不存在的 MSI?的主要内容,如果未能解决你的问题,请参考以下文章
在 BizTalk 中,为啥要同时导入和安装 MSI 文件?