【问题标题】:Windows Service not starting on Windows 10 upgradeWindows 服务未在 Windows 10 升级时启动
【发布时间】:2015-10-20 13:55:24
【问题描述】:

我编写了一个 Windows 服务,它在大多数操作系统中都能正常工作并且启动良好。我缩小了以下事实,即从 Windows 8 升级的 Windows 10 会导致服务设置为自动时服务无法在重新启动时启动的问题。 我发现延迟启动确实可以。 想知道是否有人知道完全从头开始安装和升级之间的细微差别,这可能会缩小这个难以捉摸的问题的范围。

当它不起作用时,不会生成日志或事件。它似乎没有尝试失败 - 只是没有运行(开始)。


我刚刚遇到了一个运行良好的安装,并且操作系统是从 Win 8 升级的。似乎存在一些不同的依赖关系。该服务是针对 .Net Framework 4.0 x86 编写的。 该服务手动启动就好了。 自动(启动时)启动不起作用。我正要说它失败了——但事实并非如此,因为它似乎甚至没有尝试过。

【问题讨论】:

  • 您的前提似乎是 “如果您将 Windows 8 升级到 Windows 10,则在重新启动计算机时不会启动设置为“自动”的自安装服务” ,这当然不是真的。如果是这样,那将是其他人在您之前遇到的一个巨大问题。我简直不敢相信没有生成单个事件日志消息。你确定吗?
  • 没有产生任何事件。
  • 我遇到了完全相同的问题,但还没有弄清楚它在什么情况下会重现。 windows 日志显示超时错误,但我的 log4net 日志均未生成。
  • 我也遇到了这种情况 - 使用 VS 2015 (C# .NET 4) 开发的自定义 Windows 服务(在 Win7 上运行良好)在我的使用 Win10 机器的客户重新启动时无法启动。没有 Windows 应用程序事件日志条目,特别是没有一行 log4net 日志输出 - Windows 完全跳过了我们。

标签: windows service


【解决方案1】:

我们在 Windows 10 中遇到了类似的问题,大多数基于 .Net 的服务在启动时会失败,但以后可以手动启动就好了。出于某种原因,使用 .NET 编写的服务在 Windows 10 中启动需要更长的时间。默认情况下,如果服务启动时间超过 30 秒而没有响应,则该服务会被 Windows 终止。

我能够在注册表中将该行为更改为 60 秒。前往:

HKLM\SYSTEM\CurrentControlSet\Control\

如果它不存在,请创建一个名为“ServicesPipeTimeout”(减引号)的 DWORD(32 位)键。将其值设置为 60000(十进制)。这与以毫秒为单位的 60 秒相关。

我什至创建了一个 regfile 来自动执行此操作:

Windows 注册表编辑器 5.00 版

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control] "ServicesPipeTimeout"=dword:0000ea60

只需粘贴到记事本中并保存为 .reg 文件。

不是延迟启动,而是增加了启动后服务响应的时间。这解决了我们在多台机器上的问题。不幸的是,我仍然不知道为什么 .NET 服务需要这么长时间才能启动,以至于它们会被终止。不过,我觉得这是微软的错误,不一定是我们用户做错了什么......

【讨论】:

  • 不要自己更改注册表,如果使用延迟启动对您不起作用,您可以转到服务的属性并尝试服务恢复。在恢复选项卡下,您可以选择服务无法启动时的操作。实际上,您可以尝试延迟重新启动它(“X 分钟后重新启动服务”)。
【解决方案2】:

我们有一个类似的问题,即我们的一项服务 (.net) 在升级到 Windows 10 后在某些情况下不会自动启动。此外,在许多情况下,在更新到 Windows 内部版本 10.0.10240 后问题已得到解决;但并非在所有情况下。事件日志中也没有错误。

更新:在某些情况下,延迟启动似乎也有效。

【讨论】:

    【解决方案3】:

    我们创建的 C++ windows 服务也有同样的问题。自动启动对大多数人来说都很好。但是,我们现在有 5 个实例,客户的服务工作正常,现在它不会自动启动。

    似乎唯一可行的方法是设置延迟启动,但这不是一个好的选择,因为我们希望服务立即启动。我们还尝试添加 NetLogon 的服务依赖项——但没有奏效。

    另请注意,这对客户来说效果很好,并且在某些时候(可能是 Windows 更新?)它只是停止自动启动。

    客户还可以进入服务并手动启动服务,并且可以正常工作。我会关注这个帖子,希望能找到比延迟启动更好的解决方案。

    【讨论】:

      【解决方案4】:

      为我们解决的问题是,如果您可以自己更改服务可执行文件:

      在项目文件中将 Prefer 32-bit 标志更改为 false,然后重新安装服务。

      通过CorFlags.exe 检查您的服务。 32BITREQ 和 32BITPREF 应该是 0。

      Version   : v4.0.30319
      CLR Header: 2.5
      PE        : PE32
      CorFlags  : 0x1
      ILONLY    : 1
      32BITREQ  : 0
      32BITPREF : 0
      Signed    : 0
      

      【讨论】:

      • 感谢您的提示 - 遗憾的是,库依赖项阻止了我这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2014-01-16
      相关资源
      最近更新 更多