2009-09-25 87 views
4

我最近编写了Windows服务并将其安装在生产系统上。在一些应用Windows更新之后,服务器必须重新启动,并且我的服务没有正确加载,尽管它被设置为自动启动。在我们注意到客户失败后,该服务开始手动处理。经过一番调查后,我发现我错过了为服务添加服务依赖项。所以服务的引导顺序在我们的案例中是错误的。收集Windows服务依赖关系

我可以解决这个问题,但我现在真的很关心如何收集所有必要的服务依赖关系的工具或过程。你知道任何可以处理这个问题的代码吗?

我欣赏任何提示。

+1

我也有这个完全相同的问题。现在我已经被束缚在安装时将这些依赖关系添加到服务中,但我不知道它们可能是什么...... – TheKingDave 2013-06-04 10:42:00

回答

3

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

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

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

+0

分析源代码将是一个选项。假设您使用'ManagementObjectSearcher',这是一个肯定使用WMI的类。因此添加依赖关系。也许这也可能基于程序集依赖关系,尽管这也会增加误报。 – Scoregraphic 2009-09-25 08:06:09

+0

我仍然认为,如果Windows在启动服务时会自行判断出来,它会更简单。这不是火箭科学。 – 2009-09-25 12:06:03

+0

但我怎么会知道,我的代码需要哪些依赖关系?我是否需要依赖于DHCP才能从本地主机绑定/调用的WCF服务?我怎么知道,从win7 home到win10 pro的客户机器上有哪些“常规”服务? – 2017-10-08 08:59:41

2

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

如果要发现服务依赖关系,则需要以编程方式在注册表中遍历服务密钥,并注意它们所依赖的服务和服务。一旦你完成了,你可以打印出结果。

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

+0

感谢您的回答,但这不是我所期待的。我正在自己编写服务,并想知道,我需要在那里写什么依赖关系(或安装程序需要编写)。 – Scoregraphic 2009-09-25 08:29:19