WiX“服务安装”究竟是如何在内部工作的?
Posted
技术标签:
【中文标题】WiX“服务安装”究竟是如何在内部工作的?【英文标题】:How exactly does the WiX 'Service Install' work internally? 【发布时间】:2018-09-22 21:35:50 【问题描述】:我对使用 WiX 工具集创建的 .msi 安装和启动的 Web 服务有疑问。
该服务可以在我测试的所有机器上安装和启动(显示为在服务管理器中运行),但在某些机器上它无法访问(例如通过浏览器)并且未显示在监听列表中该机器上的端口(显示为“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 作为服务安装并启动时,它不会在每台计算机上按预期工作。例如,如果我在笔记本电脑上安装并启动该服务,它在服务管理器中显示为正在运行,但在其分配的 URL 上无法访问(甚至在 localhost 上也无法访问),活动侦听端口中也没有显示特定端口,例如使用“netstat -a”。 服务本身在没有任何错误消息的情况下启动,并且不会记录任何错误或异常,因为它似乎运行时没有任何问题。
我联系了供应商,但有时他不会很快回复,而且他的回复也不是很具体。
在问这个问题之前,我认为这是 Windows 用户权限和 WiX 安装程序的问题,但在此处的讨论中,我觉得这可能是服务本身的问题。 我希望这条“新”信息有助于隔离和定位问题。
感谢迄今为止提供帮助的所有人!
【问题讨论】:
这不是直接的安装程序问题。您需要分析您的程序以了解它的依赖关系并查看这台机器上缺少什么。然后决定它是否是安装程序可以安装的东西,或者它是否是安装程序需要检测并在不存在时中止的东西。它也可能只是您的服务中的一个错误,由这台机器的配置暴露。 我也是这么想的。问题是,服务不是我的。我是从提供商(LogicNP、CryptoLicensing)那里购买的,无法访问源代码或内部流程的任何信息。因此我也无法真正调试服务。您认为编辑问题并添加该信息(因为它可能是与该特殊服务相关的问题)或因此而打开一个新问题可能会更好吗? 我花了数年时间做一些叫做“应用程序重新打包”的事情。这基本上意味着您使用一个疯狂的第三方安装程序并将其逆向工程为一个干净的 MSI。您不仅要确定他们的安装程序做了什么,还要确定它应该做什么。我已经分析了许多这样的服务,其中我没有源代码来预测丢失的内容。即使没有源也可以完成。这很痛苦,但使用 ProcessMonitor 之类的东西来寻找它试图访问和失败的东西。使用 Depends 或 .NET 反射器或其他工具尽可能多地了解它。 这个问题解决了吗?如果是这样,也许自己添加一个答案,因为其他人也可能面临这个特定问题? 不,恐怕 - 我仍在试图弄清楚,可能是什么问题。但是与开发人员的沟通需要相当长的时间。如果问题得到解决,我会添加答案。 【参考方案1】:希望这里没有说明这一点,但 WiX 除了填充 MSI 文件中的 ServiceInstall 表外并没有做太多事情,所以这就是为什么 Windows Installer 不会启动该服务的原因。服务安装表:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa371637(v=vs.85).aspx
此外,这实际上与 ServiceInstall 无关 - 它可能与您的 WiX 源代码中的 ServiceControl 元素有关,但尚不清楚您是如何启动它,还是稍后手动启动它。这确实有所作为。什么是错误消息,您从哪里得到它,它是 1920 还是 1921 错误(在 ServiceControl 的上下文中)。
服务将在一个系统上启动但在另一个系统上启动的主要原因是缺少依赖项。如果您的服务是基于 C++ 的(帖子没有说),那么可能依赖于 C 运行时、UCRT 运行时、MFC 或 ATL 运行时等。
【讨论】:
这里有个提示:将服务控制元素设置为在安装过程中不启动服务,这样您至少可以完全安装。然后尝试手动启动服务。分析它...附加调试器,查找丢失的文件,检查注册表访问等等。 Servicecontrol 只是尝试启动服务。问题出在服务本身。 这可能不是 WiX 安装程序的问题,而是服务本身的问题。我实际上可以使用命令行服务控制 (sc.exe) 安装和启动该服务,但问题仍然存在 - 即使该服务实际上正在运行(在服务管理器中可见)它也不能正常工作(它是一个 Web 服务,应该正在侦听特定端口,但侦听端口甚至不会显示在带有“netstat -a”的活动端口列表中)。如上面评论所述,该服务不是我的,所以我无法调试它。 因此甚至没有显示任何错误消息 - 服务的安装和启动顺利,(Web)服务无法访问。由于这往往是特定服务本身的问题,因此编辑问题甚至发布新问题是否是个好主意?【参考方案2】:首先:您确定该服务打算作为LocalSystem 运行吗? (MSDN,SO)。
第二:您是否详细检查了事件日志是否有任何明显的地方?如果服务很好,您至少应该找到提示。有什么要开始的。我发现有时我会错过事件查看器中的实际日志,因为它太“拥挤”了。我的看法:清空日志并停止并重新启动服务。
某些东西锁定/阻塞:如果服务安装并运行正常,我会怀疑其他因素,例如 防火墙(硬件和软件), 安全软件(防病毒、恶意软件扫描程序)、网络配置问题(代理、WINS、DNS 和网络中涉及的所有复杂性)。 服务是否试图到达 UNC 路径?
各种机器:目标机器是什么?它们是虚拟的,它们是物理的,它们是测试机器,它们是在企业网络中运行的SOE机器吗?它们是否相同操作系统版本和版本?
Further Ideas:不是很相关,但可能会从另一个答案中略过这个调试建议列表(我不确定为什么它被否决,我认为这是一个激发调试想法的好列表):Windows Application Startup Error Exception code: 0xe0434352(也许只是略过粗体字的想法 - 推荐)。
sc.exe:最后,也许检查一下sc.exe tool(服务控制),看看它是否能为您提供一些有用的调试信息。 p>
sc.exe in the context of killing hung services(示例使用)。 sc.exe from MSDN一些进一步的链接:
Windows Services Frequently Asked Questions (FAQ)。内容似乎是最新的——至少从表面上看。这些人自称是服务专家。我不知道他们是谁。 Essential Tools for Windows Services: SC.EXE Run Service Control (sc.exe) command on secure port【讨论】:
感谢您的详细解答!我使用 LocalSystem 是因为当我使用任何其他帐户时服务没有启动。您认为这可能是故障的原因吗?并考虑目标机器 - 到目前为止,它运行在装有 Windows Server 2008 R2 和 Windows 10 的机器上(使用 Parallels Desktop for Mac。不运行该服务的机器是 Windows 7(桌面)和 Windows 10(虚拟)。我的猜测是,问题与用户权限有关 - 但我并不是该主题的专家。 只是为了掩盖显而易见的情况,以防它在“激烈的战斗”中被遗漏:-):您是否详细查看了事件日志?如果服务良好,那里应该有大量信息可以帮助您开始调试。该服务是否需要许可证? @BeniEnge 问题机器,它们是否正确加入域?虚拟机在这里臭名昭著。只是检查。该服务的服务器组件是否安装在某处?如果是这样,UNC 可以访问该服务器上的共享吗? 该服务不需要许可证,它也不会记录任何错误或异常,因为它启动和运行时没有任何(可见的)问题。它只是没有监听它应该监听的端口,也没有显示在带有“netstat -a”的活动端口列表中。请参阅上面我最近的其他 cmets,我不拥有源代码,因此无法调试服务。到目前为止,我只在本地机器上进行了测试,在失败的情况下没有涉及服务器。在成功的情况下,我将服务安装在服务器上,并且可以从网络(同一域)内访问它。【参考方案3】:在将近 20 个月之后,我们终于(并且意外地)找到了解决问题的方法!对于服务无法正常运行的少数机器,将注册表中的 NoInteractiveServices 值设置为 0 即可解决问题。值 1(默认值)表示不允许任何服务以交互方式运行,无论它是否具有 SERVICE_INTERACTIVE_PROCESS 属性。更多关于Interactive Services的信息。
我对解决方案并不完全满意,因为在所有其他机器上 NoInteractiveServices 都设置为 1 并且服务仍然正常运行。但是,在服务没有以交互方式运行的机器上,这个解决方案对我们有用。因此,我会接受这个作为答案。
如果有人对此问题有更多信息并可以解释为什么会这样,请随时 添加它们 - 我会很感兴趣的!
【讨论】:
这些机器有什么共同点?什么操作系统和版本?什么安全软件?他们有相同版本的服务吗?等等...Here is a good service FAQ - 参见“进化”部分。以上是关于WiX“服务安装”究竟是如何在内部工作的?的主要内容,如果未能解决你的问题,请参考以下文章
这个 Angular 2 应用程序中的服务层次结构究竟是如何工作的?