如何重启 Windows 服务。

3

我想重启名为“Spooler”的Windows服务,我尝试了以下代码,但没有成功。是否有人知道出了什么问题?代码如下:

using System.ServiceProcess;

ServiceController service = new ServiceController("Spooler");

if ((service.Status.Equals(ServiceControllerStatus.Stopped)) ||
    (service.Status.Equals(ServiceControllerStatus.StopPending)))
{
    service.Start();
}
else
{
    service.Stop();
    service.Start();
}

异常是

"System.InvalidOperationException: 无法在计算机 '.' 上启动服务 Spooler。---> System.ComponentModel.Win32Exception: 该服务的一个实例已经在运行。

--- 内部异常堆栈跟踪到此为止 ---

在 System.ServiceProcess.ServiceController.Start(String[] args)

在 System.ServiceProcess.ServiceController.Start()

在 servicerestart.Form1.button1_Click(Object sender, EventArgs e) 中 D:\samplecodes\servicerestart\servicerestart\Form1.cs:line 33"


2
“但是没有运气”不是非常精确的问题描述。您能否提供更具体的问题描述,而不涉及运气或上帝,而是涉及具体的错误消息或不希望发生的行为? - Darin Dimitrov
1
@Darin Dimitrov,我已经更新了我的问题。 - vettori
2个回答

9
停止服务后,如果要使用WaitForStatus方法再次启动该服务,请等待一段时间:
else
{
    service.Stop();
    service.WaitForStatus(ServiceControllerStatus.Stopped);
    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running);
}

1
看起来它会工作,但我没有看到服务在服务应用程序(SCM)中停止和启动。我们是否有任何机制可以快速停止并立即启动? - vettori
不,这是在.NET中启动和停止服务的正确方式。您还可以在服务启动后等待。 - Darin Dimitrov
我认为在 .Start(); 方法之后,不会有 ServiceControllerStatus.Started 方法。这会导致编译错误。 - vettori
是的,应该是“Running”而不是“Started”。我已经更新了我的答案。 - Darin Dimitrov
在小程序窗口中,我无法看到服务已停止和启动。也许一切都很快?是否有任何机制可以从注册表或其他地方查看服务是否已停止和启动?从事件日志中我也看不到它。 - vettori
很正常你看不到它,因为它可能发生得很快,而你可能没有及时刷新窗口。你可以在代码中的service.Start();行处设置断点,在服务停止后再执行它。 - Darin Dimitrov

0

我认为问题在于您需要管理员权限来启动和停止服务,这就是为什么您必须提供所需的权限。

要做到这一点,请转到ISS中更改应用程序池的身份为LocalSystem。

希望这可以帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接