sc query state= all
从命令行开始按预期工作。
在另一个服务中,sc query state= all
不会向该子流程'stdout打印任何内容(当然,由父级捕获)。
是否有服务需要的权限/特权才能列出/启动/停止其他服务?
一点背景:我正在制作一项服务,定期重启一些行为不端的服务。
答案 0 :(得分:0)
嗯,因为一个人不这样做,至少不是以阻止的方式。为了使您自己的服务响应SCM(服务控制管理器)以返回其状态,服务必须能够执行其调度程序代码。这意味着如果您调用此程序并等待它退出,您将无限期地等待。减轻这种情况的一种方法是将其放入一个单独的线程中,这样就不会阻止您的调度,您的服务将继续与SCM通信。
或者(可能更好)您可以使用EnumServicesStatusEx
功能与SCM交谈并自行查询其他服务的状态。函数本身没有提到任何关于阻塞的内容,所以你必须弄清楚自己是否然后再使用一个线程来防止你的服务停止与SCM交谈。
最后一点:如果那些行为不端的服务属于您,那么您应该更有可能修复相应的代码。我有一部分遗留代码,并且有一个行为不端的服务,它将自己的帮助应用程序作为“故障操作”(可以在服务配置中配置为SERVICE_CONFIG_FAILURE_ACTIONS
),只要崩溃就会启动并重新启动服务。一旦我接过代码,找出原因并修复它,服务再次稳定,并且不再需要该应用程序了。