Как я могу перезапустить службу Windows программно в .NET?
Кроме того, мне нужно выполнить операцию, когда перезапуск службы завершен.
Как я могу перезапустить службу Windows программно в .NET.
Ответ 1
Взгляните на класс ServiceController.
Чтобы выполнить операцию, которая должна быть выполнена при перезапуске службы, я думаю, вы должны сделать это в Сервисе самостоятельно (если это ваша собственная служба).
Если у вас нет доступа к источнику службы, возможно, вы можете использовать метод WaitForStatus
для ServiceController
.
Ответ 2
В этой статье используется класс ServiceController
для методы записи для запуска, остановки и перезапуска служб Windows; это может стоить взглянуть на.
Отрывок из статьи (метод "Перезапуск службы" ):
public static void RestartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = Environment.TickCount;
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2-millisec1));
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch
{
// ...
}
}
Ответ 3
Пример использования класса ServiceController
private void RestartWindowsService(string serviceName)
{
ServiceController serviceController = new ServiceController(serviceName);
try
{
if ((serviceController.Status.Equals(ServiceControllerStatus.Running)) || (serviceController.Status.Equals(ServiceControllerStatus.StartPending)))
{
serviceController.Stop();
}
serviceController.WaitForStatus(ServiceControllerStatus.Stopped);
serviceController.Start();
serviceController.WaitForStatus(ServiceControllerStatus.Running);
}
catch
{
ShowMsg(AppTexts.Information, AppTexts.SystematicError, MessageBox.Icon.WARNING);
}
}
Ответ 4
Вы также можете вызвать команду net
, чтобы сделать это. Пример:
System.Diagnostics.Process.Start("net", "stop IISAdmin");
System.Diagnostics.Process.Start("net", "start IISAdmin");
Ответ 5
Как насчет
var theController = new System.ServiceProcess.ServiceController("IISAdmin");
theController.Stop();
theController.Start();
Не забудьте добавить System.ServiceProcess.dll в свой проект, чтобы это работало.
Ответ 6
См. статью .
Вот фрагмент из статьи.
//[QUICK CODE] FOR THE IMPATIENT
using System;
using System.Collections.Generic;
using System.Text;
// ADD "using System.ServiceProcess;" after you add the
// Reference to the System.ServiceProcess in the solution Explorer
using System.ServiceProcess;
namespace Using_ServiceController{
class Program{
static void Main(string[] args){
ServiceController myService = new ServiceController();
myService.ServiceName = "ImapiService";
string svcStatus = myService.Status.ToString();
if (svcStatus == "Running"){
myService.Stop();
}else if(svcStatus == "Stopped"){
myService.Start();
}else{
myService.Stop();
}
}
}
}
Ответ 7
Этот ответ основан на @Donut Answer (самый верный ответ на этот вопрос), но с некоторыми изменениями.
- Устранение класса
ServiceController
после каждого использования, поскольку он реализует интерфейсIDisposable
. - Уменьшить параметры методов: нет необходимости передавать параметр
serviceName
для каждого метода, мы можем установить его в конструкторе, и каждый другой метод будет использовать это имя службы.
Это также больше подходит для ООП. - Обрабатывать исключение catch таким образом, чтобы этот класс мог использоваться как компонент.
- Удалите параметр
timeoutMilliseconds
из каждого метода. - Добавьте два новых метода
StartOrRestart
иStopServiceIfRunning
, которые можно рассматривать как оболочку для других базовых методов. Цель этого метода заключается только в том, чтобы избежать исключений, как описано в комментарии.
Вот класс
public class WindowsServiceController
{
private string serviceName;
public WindowsServiceController(string serviceName)
{
this.serviceName = serviceName;
}
// this method will throw an exception if the serivce is NOT in Running status.
public void RestartService()
{
using (ServiceController service = new ServiceController(serviceName))
{
try
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped);
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running);
}
catch (Exception ex)
{
throw new Exception($"Can not restart the Windows Service {serviceName}", ex);
}
}
}
// this method will throw an exception if the serivce is NOT in Running status.
public void StopService()
{
using (ServiceController service = new ServiceController(serviceName))
{
try
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped);
}
catch (Exception ex)
{
throw new Exception($"Can not Stop the Windows Service [{serviceName}]", ex);
}
}
}
// this method will throw an exception if the service is NOT in Stopped status.
public void StartService()
{
using (ServiceController service = new ServiceController(serviceName))
{
try
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running);
}
catch (Exception ex)
{
throw new Exception($"Can not Start the Windows Service [{serviceName}]", ex);
}
}
}
// if service running then restart the serivce, if the service is stopped then start it.
// this method will not throw an exception.
public void StartOrRestart()
{
if (IsRunningStatus)
RestartService();
else if (IsStoppedStatus)
StartService();
}
// stop the service if it is running, if it is already stopped then do nothing.
// this method will not throw an exception if the service is in Stopped status.
public void StopServiceIfRunning()
{
using (ServiceController service = new ServiceController(serviceName))
{
try
{
if (!IsRunningStatus)
return;
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped);
}
catch (Exception ex)
{
throw new Exception($"Can not Stop the Windows Service [{serviceName}]", ex);
}
}
}
public bool IsRunningStatus => Status == ServiceControllerStatus.Running;
public bool IsStoppedStatus => Status == ServiceControllerStatus.Stopped;
public ServiceControllerStatus Status
{
get
{
using (ServiceController service = new ServiceController(serviceName))
{
return service.Status;
}
}
}
}
Ответ 8
Вызовите Environment.Exit
с кодом ошибки больше 0, что кажется уместным, а затем при установке мы настроим службу для перезапуска при ошибке.
Environment.Exit(1);
Я сделал то же самое в своей службе. Он работает нормально.