如何获得服务以请求重新启动?

问题描述:

如何重新启动Windows服务请求?我知道Environment.Exit(1)连同恢复选项服务设置,但如果服务真的出错,该怎么办?如何获得服务以请求重新启动?

背景:

我们有一堆使用自主组件作为我们的SOA架构的一部分的Windows服务。我们希望在自主组件更新时重新启动服务,但我们不希望每天限制为两次重新启动(发布),并且如果存在真正的错误,我们不希望该服务无限期地重新启动。

我们得到了周围这样做:

using System.Diagnostics; 

Process.Start("cmd", "/c net stop \"Service1\" && net start \"Service1\""); 

看来Process.Start()要么不创建子进程,或者当父母去世那子进程没有被杀死。

请注意,进程运行的用户必须具有启动和停止进程的权限。

我已经创建了一些使用此技术的自更新服务。我发现依靠恢复选项并不理想,因为它通常会让系统管理员觉得您的服务正在他们的机器上爆炸(向事件日志写入由于服务意外停止而发生服务恢复)。

我在我的例子中做了什么,虽然这很冒险但很有效,它是在服务安装期间创建的帐户下启动特制的可执行文件。该帐户被拒绝登录权限,并且只能控制我们的特定服务(使用icacals或同等授权服务控制权限)。启动可执行文件,它使用许多预定义的OnCustomCommandservice commands与服务进行通信,告诉服务它已被更新,它需要完成它的工作,并尽快关闭它。可执行文件等待一段时间,一旦服务停止,它会围绕二进制文件移动,并执行许多其他自定义步骤,然后启动服务备份并退出。

我确信有更干净的方法可以做到这一点,但在找了几个小时后没有拿出更清洁的东西之后,我决定这会适用于我们的情况。在大量计算机上安装这些产品之前,我一直没有遇到任何问题,除了由于管理员与运行该可执行文件的用户帐户相关的偶然性权限问题。

+0

感谢您的输入。对需要严格用户帐户控制的环境非常有用。 – sennett 2013-03-05 22:09:02