WiX 'Service Install' 内部究竟是如何工作的?

How exactly does the WiX 'Service Install' work internally?

我在使用使用 WiX 工具集创建的 .msi 安装和启动的 Web 服务时遇到问题。

该服务可以在我目前测试的所有机器上安装和启动(在服务管理器中显示为 运行ning),但在某些机器上无法访问(例如通过浏览器)并且未显示在该计算机上的侦听端口列表中(显示为 'netstat -a')。

我想找出问题所在,但我对 Web 服务开发和配置并不十分熟悉。这是第三方服务,因此我不知道它在内部是如何工作的。 对我来说,一个好的起点是找出在执行 .msi 文件期间安装和启动服务时到底发生了什么。 也许我可以尝试在较低的层次上解决这个问题。

下面是我在 ServiceInstall-Element 中的代码:

<ServiceInstall
            Id="ServiceID"
            Type="ownProcess"
            Vital="yes"
            Name="ServiceName"
            DisplayName="ServiceDisplayName"
            Description="Lorem Ipsum"
            Start="auto"
            Account="LocalSystem"
            ErrorControl="normal"
            Interactive="no"
            Arguments="action=run">
    </ServiceInstall>

参数很重要 - 没有它,服务将无法启动或 运行。 也许其他人遇到了相同或类似的问题,可以帮助我。

提前致谢 - 不胜感激。


编辑 I (15.04.18):

可能是具体服务的问题,我再补充一下:

这是一款名为 CryptoLicensing 的第三方软件: http://www.ssware.com/cryptolicensing/cryptolicensing_net.htm

该软件的一部分是该特定程序,它用作许可证服务器并进行许可证注册,例如在客户的网络中。 该服务可以 运行 作为 Windows 应用程序或已安装并 运行 作为 Windows 服务。在这两种情况下,它都应该在已安装机器上的(预先)指定端口上进行监听。 每当我将 .exe 作为应用程序启动时,一切都按预期工作。该服务是可访问的(例如通过浏览器)并且可以从网络中的其他机器访问。 当 .exe 作为服务安装和启动时,它并不是在每台机器上都按预期工作。例如,如果我在笔记本电脑上安装并启动该服务,它在服务管理器中显示为 运行ning,但在其分配的 URL 上无法访问(甚至在本地主机上也无法访问)在活动侦听端口中显示的特定端口,例如 'netstat -a'。 该服务本身在没有任何错误消息的情况下启动,并且不会记录任何错误或异常,因为它似乎 运行ning 没有任何问题。

我联系了供应商,但有时他的回复并不迅速,而且他的回复也不是很具体。

在问这个问题之前,我认为这是 Windows 用户权限和 WiX 安装程序的问题,但在讨论期间我觉得这可能是服务本身的问题。 我希望这条 'new' 信息有助于隔离和定位问题。

感谢迄今为止提供帮助的所有人!

First:您确定此服务旨在 运行 作为 LocalSystem? (MSDN, SO).

其次:您是否详细检查了事件日志是否有任何明显的内容?如果服务很好,您至少应该找到提示。有什么可以开始的。我发现我有时会错过事件查看器中的实际日志,因为它是如此 "crowded"。我的看法:清空日志并停止并重新启动服务。


某些锁定/阻塞:如果服务安装并且 运行s OK 我会怀疑其他因素,例如 防火墙(硬件和软件),安全软件 一般(防病毒、恶意软件扫描程序),网络配置 问题(代理、WINS、DNS 以及网络中涉及的所有复杂问题)。 服务是否试图到达 UNC 路径?

Diverse Machines目标机器有哪些?它们是虚拟机,它们是物理机,它们是测试机,它们是公司网络中运行的 SOE 机器OS 版本和 edition 是否相同?

进一步的想法:这不是很相关,但也许可以从另一个答案(我不是确定为什么它被否决了,我认为这是一个可以 激发调试想法 的列表):Windows Application Startup Error Exception code: 0xe0434352(也许只是略读想法的粗体词 - 推荐).

sc.exe:最后,也许检查 sc.exe tool(服务控制)并查看它是否可以为您提供一些有用的调试信息。

一些进一步的链接:

希望这里没有说明明显的问题,但 WiX 除了在 MSI 文件中填充 ServiceInstall table 之外并没有做太多事情,所以这就是 Windows 安装程序无法启动该服务的原因.服务安装 table:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa371637(v=vs.85).aspx

此外,这实际上与 ServiceInstall 无关 - 它可能与 WiX 源中的 ServiceControl 元素有关,但不清楚您是通过这种方式启动它,还是稍后手动启动它。这确实有所作为。错误消息是什么,从哪里得到它,它是 1920 还是 1921 错误(在 ServiceControl 的上下文中)。

服务将在一个系统上启动而不在另一个系统上启动的主要原因是缺少依赖项。如果您的服务是基于 C++ 的(post 没有说明),那么可能依赖于 C 运行时、UCRT 运行时、MFC 或 ATL 运行时等。

在将近 20 个月后,我们终于(意外地)找到了解决问题的方法!对于服务未正确 运行 的少数机器,将注册表中的 NoInteractiveServices 值设置为 0 就可以了。值 1(默认值)表示不允许任何服务以交互方式 运行,无论它是否具有 SERVICE_INTERACTIVE_PROCESS 属性。有关 Interactive Services.

的更多信息

我对这个解决方案并不完全满意,因为在所有其他机器上 NoInteractiveServices 设置为 1 并且服务 运行s 正确。然而,在服务没有 运行 交互的机器上,这个解决方案对我们有效。因此我会接受这个作为答案。

如果有人有关于这个问题的更多信息并且可以解释为什么这样做,请随时 添加它们 - 我会非常感兴趣!