如何重现 MSI 安装错误

How to Reproduce MSI Install Error

有什么方法可以reproduce/Inject一些MSI安装错误?
我希望我的安装会因错误 1xxx/2xxx..(msi error codes)而失败,哪个错误代码并不重要,重要的是我会在 MSI 日志中看到 "Retun value 3".

* 我正在使用 WIX

不能 100% 确定您需要什么。您是否正在测试 Windows 安装程序回滚 并希望通过您的自定义操作触发它?或者您可能只是想在不触发回滚的情况下将某些内容写入 MSI 日志文件?我想您可能两者都想要,但听起来您可能只想写入日志。

触发回滚

您基本上可以通过从自定义操作返回错误代码并将自定义操作设置为 "check exit code"[ 来在 MSI 中触发回滚=44=]。有关延迟与立即模式自定义操作的说明,请参见下文。

此外:仅在需要时检查退出代码并可以处理它,否则您的设置可能会意外失败 - 通常是因为一些无关紧要和晦涩的错误(然后可能会中断您的主要升级 - 或者更糟 - 例如您完全卸载。有几个意想不到的情况。始终测试所有安装模式,包括升级)。

WiX 实用程序扩展中还有一项功能可让您触发延迟故障:WixFailWhenDeferred. I have never tried it to be honest. List of standardized WiX custom actions (and see link to "Using Standard Custom Actions" in there). See Bob Arnson's blog on this

写入日志文件

这里是 link,对于初学者,如何实际写入日志文件本身:Writing to the Log File from a Custom Action。这是来自 Flexera(Installshield 的制造商),但它涵盖了来自不同类型的自定义操作的一般日志记录及其专有方式。我不知道你用的是什么类型的动作。它是由 Robert Dickau(前 Installshield / Flexera 高级技术培训师)编写的,尽管主题很高级,但他能够让事情尽可能简单。这是一个快速阅读。

可能有更好的方法可以从我没有使用过的托管代码中执行此操作。让我们拭目以待 Chris Painter 是否会在这里返回一些信息(WiX/MSI 专家 - 特别是托管代码)。

已经很久了,但我认为在我处理此类事情的那一天,我实际上最终登录到事件日志而不是日志文件。它供公司使用,事件日志被广泛使用。恐怕现在一切都变得模糊了,我没有可用的示例代码。

题外话:立即模式 vs 延迟模式

题外话:请注意,在立即模式下不会发生回滚(例如,当您点击设置的用户界面时)。在立即模式下,没有要回滚的更改事务,您基本上只是结束执行。出于这个原因,不应使用即时模式自定义操作对系统进行任何更改 - 它们不能回滚(并且它们也不会 运行 提升 - 尽管它们可以 运行 使用真正的管理员权利,因此做出看似成功的改变,但这总是错误的设计,会让你感到悲伤)。这一点很重要,所以才提到。

对于它的价值:它打败了我为什么立即模式自定义操作不会在尝试写入任何地方时崩溃。崩溃错误不容忽视,我们会过得更好吗?也许我遗漏了什么。

我使用了除以零的 VBScript 延迟自定义操作。以在 msiexec 命令行中传入的 属性 为调用条件。这将导致回滚和 return 错误 3。