我构建了一个作为Windows服务运行的应用程序,并通过我的代码安装。
除登录外,一切都很好。
在第一个Windows XP / 2003服务器登录屏幕上,我不确定该服务是否正在运行。如果是,那么它确实工作,因为它不起作用(该服务使用WINPCAP,因此可能是一个问题)。
服务设置设置为“与桌面交互”并以SYSTEM身份运行。
如何确保在Windows登录前启动服务?另外,即使我注销后,如何确保它仍在运行?
答案 0 :(得分:3)
有几个问题需要考虑。
首先,您可以通过将事件记录到Windows事件日志来检查您的服务是否真正在登录前和注销后运行。几乎所有服务都会在它们启动和停止时执行此操作,您的服务也应该这样做。
可能是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,那么你的服务将无法启动。
我认为无法确保您的服务在桌面出现之前启动。但是,您可以通过创建服务控制组,将其添加到现有服务控制组列表的末尾,并将您的服务放入此组中来帮助解决问题。我并不完全相信这是一种“批准”的方式,可以让您的服务尽快启动,因为如果有一种批准的方式,那么每个人都会这样做而且它将不再起作用。但有人建议组中的服务是在服务不在组内之前启动的。
查看HKEY_LOCAL_MACHINE,“SYSTEM \ CurrentControlSet \ Control \ GroupOrderList”和HKEY_LOCAL_MACHINE,“SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder”并进行一些谷歌搜索。