【问题标题】:Collect Windows service dependencies收集 Windows 服务依赖项
【发布时间】:2009-09-25 07:46:14
【问题描述】:

我最近编写了一个 Windows 服务并将其安装在生产系统上。在应用了一些 Windows 更新后,服务器必须重新启动,并且我的服务没有正确加载,尽管它被设置为自动启动。在我们注意到客户失败后,该服务手动启动正常。经过一番研究,我发现我错过了为我们的服务添加服务依赖项。因此,对于我们的案例,服务的启动顺序是错误的。

我可以解决这个问题,但我现在对如何收集所有必要的服务依赖项的工具或程序非常感兴趣。您知道任何可以处理此问题的代码吗?

感谢任何提示。

【问题讨论】:

  • 我也有同样的问题。现在,我一直忙于在安装服务时将这些依赖项添加到服务中,但我不知道它们可能是什么......

标签: windows-services dependencies


【解决方案1】:

工具如何知道您需要哪些服务?通过分析源代码?通过运行您的服务直到服务失败?

实现这项工作的唯一方法是了解您所依赖的服务,并在安装服务时将它们添加到注册表中。

我并不是说这不可能自动化;但如果它可以自动化,那么 Windows 就已经在这样做了:当连接到另一个服务时,Windows 可能会停止你的启动,直到另一个服务可用为止。

【讨论】:

  • 分析源代码是一种选择。假设您使用即ManagementObjectSearcher,这是一个肯定使用 WMI 的类。所以添加依赖。也许它也可能基于程序集依赖关系,尽管这也会增加误报。
  • 我仍然认为如果 Windows 在启动服务时自己解决这个问题会更简单。这不是火箭科学。
  • 但是我怎么知道我的代码需要哪些依赖项?对于仅绑定到本地主机/从本地主机调用的 WCF 服务,我是否需要依赖 DHCP?我怎么知道,从 win7 home 到 win10 pro 的客户机器上提供了哪些“通用”服务?
  • @PatrickStalph 同意。 Linux systemd 通过要求服务作者指定他们需要和提供的内容来解决这个问题。这允许他们构建依赖树。
【解决方案2】:

服务及其依赖项在注册表中的 HKLM/System/CurrentControlSet/Services/xxx 下进行了描述,其中 xxx 是服务的名称。有数百个服务,在 Services.msc 控制台中只有其中一些是可见的。在服务控制台中,您可以调出服务的属性窗口并查看 Dependencies 选项卡。将枚举依赖于服务的服务以及服务所依赖的服务。在注册表中,每个服务都有两个可选键,名为“DependOnService”和“DependOnGroup”。两者都是 REG_MULTI_SZ 类型,这意味着它们可以包含多个值。查看这些值时使用 RegEdt32.exe。这是定义依赖关系的地方。例如,如果您想让您的服务依赖于 Microsoft SQL Server,请在您的服务的键中添加一个名为“DependOnService”的键,其中包含“MSSQLSERVER”。通过查看服务属性的 Dependencies 选项卡来验证这一点。

如果您想发现服务依赖项,您需要以编程方式遍历注册表中的 Services 键,记录服务和它们所依赖的服务。完成后,您可以打印出结果。

当我想发现 .NET 程序集之间的依赖关系时,我写了类似的东西。

【讨论】:

  • 感谢您的回答,但这不是我想要的。我正在自己编写服务并想了解我需要在那里编写哪些依赖项(或安装程序需要编写)。
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 2011-09-10
  • 1970-01-01
  • 2011-11-27
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多