Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何让服务请求重新启动?_.net_Windows_Service - Fatal编程技术网

.net 如何让服务请求重新启动?

.net 如何让服务请求重新启动?,.net,windows,service,.net,Windows,Service,如何让Windows服务请求重新启动?我了解环境。请结合“恢复选项”服务设置退出(1),但如果该服务确实出现错误怎么办 背景: 我们有许多Windows服务,它们使用自治组件作为SOA体系结构的一部分。我们希望在自治组件更新时重新启动服务,但我们不希望一天只能重新启动(发布)两次,如果出现真正的错误,我们也不希望服务无限期地重新启动。我创建了许多使用此技术的自更新服务。我发现依赖恢复选项并不理想,因为它经常让系统管理员感觉您的服务在他们的机器上爆炸(写入事件日志,说明服务恢复是由于意外的服务停止

如何让Windows服务请求重新启动?我了解
环境。请结合“恢复选项”服务设置退出(1)
,但如果该服务确实出现错误怎么办

背景:


我们有许多Windows服务,它们使用自治组件作为SOA体系结构的一部分。我们希望在自治组件更新时重新启动服务,但我们不希望一天只能重新启动(发布)两次,如果出现真正的错误,我们也不希望服务无限期地重新启动。

我创建了许多使用此技术的自更新服务。我发现依赖恢复选项并不理想,因为它经常让系统管理员感觉您的服务在他们的机器上爆炸(写入事件日志,说明服务恢复是由于意外的服务停止而进行的)

在我的案例中,我所做的是在服务安装过程中创建的帐户下启动一个特制的可执行文件,这是公认的黑客行为,但很有效。该帐户被拒绝登录权限,并且只能控制我们的特定服务(使用ICACAL或等效工具授予服务控制权限)。启动可执行文件,它使用许多预定义的
OnCustomCommand
与服务通信,这些命令告诉服务它已经更新,它需要完成它的工作,并尽快关闭。可执行文件将等待给定的时间,一旦服务停止,它将在二进制文件中移动,并执行许多其他自定义步骤,然后启动服务并退出


我相信有更干净的方法可以做到这一点,但在寻找了几个小时后,我没有找到任何更干净的方法,因此我决定在我们的案例中这样做是可行的。这几年来,我在很多计算机上都没有遇到过任何问题,除了偶尔会出现权限问题,因为管理员弄乱了可执行文件所使用的用户帐户。

我们解决了这一问题:

using System.Diagnostics;

Process.Start("cmd", "/c net stop \"Service1\" && net start \"Service1\"");
似乎
Process.Start()
没有创建子进程,或者父进程死亡时子进程没有被终止


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

感谢您的输入。对于要求严格控制用户帐户的环境非常有用。