MSI 安装成功但未安装服务,事件日志中出现 MsiExec 错误

MSI installation succeeds but services are not installed, MsiExec error in event log

我有一个安装两个 windows 服务的 msi 安装程序。在WindowsServer 2016 64位机器上安装没有报错,安装成功但是没有安装服务。我能够使用 installutil 手动安装服务,但没有关于为什么 msi 无法安装服务的线索。到目前为止,安装程序已经完成了数百次安装。我能够从机器上获取事件日志,我能在应用程序日志中找到的唯一错误是:

     Faulting application name: MsiExec.exe, version: 5.0.14393.0, time 
     stamp: 0x57899002
     Faulting module name: MSIC9AE.tmp, version: 4.0.30319.33440, time 
     stamp: 0x52004298
     Exception code: 0xc0000005
     Fault offset: 0x000064ff
     Faulting process id: 0x2244
     Faulting application start time: 0x01d3db09c12691f2
     Faulting application path: C:\Windows\syswow64\MsiExec.exe
     Faulting module path: C:\Windows\Installer\MSIC9AE.tmp
     Report Id: c5ffdc35-5ccd-4b00-9d60-1a198848062e
     Faulting package full name: 
     Faulting package-relative application ID: 

使用详细日志记录重新安装不是一个选项。 非常感谢任何帮助。

关于您如何安装服务,或者您使用什么工具生成 MSI 和安装这些服务的信息不多,但我可以从该日志中做出一些猜测:

您似乎正在使用安装程序 class 自定义操作来安装服务。在我知道的每种情况下(Visual Studio 设置除外)这是不必要的。 Windows 安装程序内置支持安装服务,无需 运行 任何代码。自定义操作(而不是标准的内置功能)容易出错。更好的工具提供了对 ServiceInstall table and the ServiceControl table 的支持,这让您不再需要 运行 代码和相关问题。

该日志显示您正在 运行正在使用 32 位 msiexec.exe 进程在 64 位系统上安装服务。我相信 32 位子系统在 Windows 服务器上是可选的,但不清楚这是否是一个问题,因为安装显然是成功的,尽管安装程序 class 失败通常会引发错误并完全回滚安装。你是静默安装吗?另一个问题可能是没有 32 位 NET FW 到 运行 那个(显然)32 位自定义操作。或者存在 NET FW 体系结构不匹配(您有一些 NET 2 代码试图在 4.0 运行 时间 运行)。如果该错误 0xC0000005 是可信的,那么您在自定义操作代码中存在访问冲突 - 自定义操作通过将代码从 MSI 二进制文件 table 提取到一个随机名称的 .tmp 文件中,然后从一个msiexec.exe 进程,因此自定义操作代码可能由于某种原因无法访问该 \installer 文件夹。还有一个 C++ shim Dll 加载一个框架到 运行 托管代码,所以那里也有 C++ 依赖失败的空间

安装程序 class 自定义操作框架在失败时真的很难调试,因为有很多失败点,这就是为什么我指出安装程序 classes 可能容易出错以及不必要的。

Windows 需要针对不同的体系结构进行不同的设置,因此对于 64 位安装,如果问题与跨体系结构相关,则值得确保所有自定义操作代码都是为 64 位明确构建的.