2010-10-26 68 views
8

我构建了一个作为Windows服务运行并通过我的代码安装的应用程序。确保Windows服务在登录之前运行

除了登录以外,一切正常。

当在第一个Windows XP/2003服务器登录屏幕上,我不确定服务是否运行。如果是这样,那么它确实工作,因为它不起作用(该服务正在使用WINPCAP,因此可能是一个问题)。

服务设置被设置为“与桌面交互”并以SYSTEM身份运行。

如何确保服务在Windows登录之前启动?另外,即使在注销后,我如何确保它仍在运行?

回答

3

有几个问题需要考虑。

  1. 首先,您可以通过将事件记录到Windows事件日志来检查您的服务是否确实在登录之前和注销之后运行。几乎所有的服务都会在开始和停止时执行此操作,而您的操作也应该如此。

  2. 可能是WinPcap是问题的一部分。在服务中使用WinPcap有几条黄金法则。您的服务不得做任何可能导致WinPcap服务尝试在自己的服务启动时启动的任何操作,因为这会导致Windows服务控制管理器出现死锁。这意味着,如果WinPcap服务在您的服务开始启动时不是已经是SERVICE_RUNNING,那么在服务为SERVICE_RUNNING之前,您不得做任何可能导致它启动的事情。

    有两种方法可以确保这一点。要么使您的服务依赖于npf网络数据包筛选器服务。或者在您的服务是SERVICE_RUNNING之前不要调用任何WinPcap函数。我没有尝试过后一种方法。我认为WinPcap函数会阻塞,直到npf为SERVICE_RUNNING。如果您的服务依赖于npf,那么您还必须使其依赖nm(网络监视器驱动程序) - 当且仅当在系统上安装了nm时。 nm为WinPcap提供了PPP/VPN支持,如果安装了WinPcap,它总是会尝试使用它。显然,如果你让nm成为你的服务的依赖,而nm没有安装,那么你的服务将无法启动。

  3. 我不认为有保证的方式来确保您的服务在桌面出现之前启动。但是您可以通过创建一个服务控制组,将其添加到现有服务控制组列表的末尾,然后将您的服务放入该组中,从而帮助解决问题。我并不完全相信,这是一种“已批准”的方式,可以让您的服务尽快启动,因为如果采用了已批准的方式,那么每个人都会这样做,而且不会再有任何工作。但有人建议,一个组中的服务在服务不在一个组中之前开始。

    查看HKEY_LOCAL_MACHINE,“SYSTEM \ CurrentControlSet \ Control \ GroupOrderList”和HKEY_LOCAL_MACHINE,“SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder”并做一些Google搜索。