确保在登录前运行Windows服务

Eri*_*vid 8 windows-services

我构建了一个作为Windows服务运行的应用程序,并通过我的代码安装.

一切都很好,除了登录.

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

服务设置设置为"与桌面交互"并作为SYSTEM运行.

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

Ian*_*dby 4

有几个问题需要考虑。

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

  2. WinPcap 可能是问题的一部分。在服务中使用 WinPcap 有几个黄金规则。

    1a) 您的服务不得执行任何可能导致 WinPcap 服务在您自己的服务启动时尝试启动的操作,因为这将导致 Windows 服务控制管理器中出现死锁。这意味着,如果您的服务开始启动时 WinPcap 服务尚未处于 SERVICE_RUNNING 状态,则在服务处​​于 SERVICE_RUNNING 状态之前,您不得执行任何可能导致其启动的操作。

    有两种方法可以确保这一点。要么使您的服务依赖于 npf(网络数据包过滤器服务)。或者,在服务处于 SERVICE_RUNNING 状态之前,不要调用任何 WinPcap 函数。我没有尝试过后一种方法。我认为 WinPcap 函数将阻塞,直到 npf 为 SERVICE_RUNNING。

    1b) 如果您使服务依赖于 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”并进行一些谷歌搜索。