我们有一个安装在客户位置的应用程序。此应用程序由作为 Windows 服务运行的自承载 WCF 服务器以及与此问题无关的客户端应用程序组成。
我们通过让服务在后台下载我们的 WiX 生成的 .msi 文件来向我们的客户发布更新,然后在客户选择安装它时安装它。安装过程如下:
- 服务器将引导程序应用程序复制到临时路径并运行它,将路径传递给 MSI 文件以进行安装
- 引导程序使用 MSI 文件中的升级代码卸载以前的版本,然后安装新版本。它使用与 MSI 相关的各种 P/Invoke 调用来调用安装程序,例如
MsiInstallProduct
. - 引导程序重新启动服务
问题是,在几乎呼叫客户的站点上,这个自动化过程失败了,尽管与所有事情一样,它在我们所在地的测试和生产中都有效。有时它会在卸载过程中失败,但通常是在安装过程中。错误代码 1601 (InstallServiceFailure) 和 1603 (InstallFailure) 很常见,因为它们完全无助于确定出了什么问题。
我们有一个备份过程,用户可以通过在 Windows 中运行引导程序来手动调用安装程序(当然,需要以管理员身份运行)。此过程不会失败,并且它使用与失败的自动化过程完全相同的安装逻辑。
所有服务都作为帐户运行,至少在服务器上具有管理权限。
我可以从哪里开始尝试查找有关导致错误的原因的更多信息,或者更好地从一开始就阻止它们?
编辑这是安装失败的详细日志文件的一个示例:
=== Verbose logging started: 3/29/2013 8:23:30 Build type: SHIP UNICODE 5.00.7600.00 Calling process: <<PATH TO MSI>> ===
MSI (c) (00:7C) [08:23:30:194]: Resetting cached policy values
MSI (c) (00:7C) [08:23:30:262]: Machine policy value 'Debug' is 0
MSI (c) (00:7C) [08:23:30:418]: ******* RunEngine:
******* Product: <<PATH TO MSI>>
******* Action:
******* CommandLine: **********
MSI (c) (00:7C) [08:23:30:491]: Client-side and UI is none or basic: Running entire install on the server.
MSI (c) (00:7C) [08:23:30:520]: Grabbed execution mutex.
MSI (c) (00:7C) [08:23:30:562]: Failed to connect to server. Error: 0x800703FA
MSI (c) (00:7C) [08:23:30:605]: Failed to connect to server.
MSI (c) (00:7C) [08:23:30:637]: MainEngineThread is returning 1601
=== Verbose logging stopped: 3/29/2013 8:23:30 ===