Как я могу перезапустить службу Windows программно in.NET


Как я могу перезапустить службу windows программно в .NET?
Кроме того, мне нужно сделать операцию, когда перезапуск службы будет завершен.

8 54

8 ответов:

посмотри ServiceController класса.

чтобы выполнить операцию, которая должна быть выполнена при перезапуске службы, я думаю, вы должны сделать это в Службе самостоятельно (если это ваша собственная служба).
Если у вас нет доступа к источнику сервиса, то, возможно, вы можете использовать WaitForStatus метод ServiceController.

в этой статье использует 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
  {
    // ...
  }
}

пример использования класса 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);
    }
}

вы также можете вызвать net команда для этого. Пример:

System.Diagnostics.Process.Start("net", "stop IISAdmin");
System.Diagnostics.Process.Start("net", "start IISAdmin");

как о

var theController = new System.ServiceProcess.ServiceController("IISAdmin");

theController.Stop();
theController.Start();

Не забудьте добавить систему.Событий.dll для вашего проекта, чтобы это работало.

посмотреть этот статьи.

вот фрагмент статьи.

//[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();
                }
        }
    }
}

этот ответ основан на ответе @Donut (самый популярный ответ на этот вопрос), но с некоторыми изменениями.

  1. утилизация ServiceController класс после каждого использования, потому что он реализует IDisposable интерфейс.
  2. уменьшить параметры метода: нет необходимости в serviceName параметр передается для каждого метода, мы можем установить его в конструкторе, и каждый другой метод будет использовать это имя службы.
    Это также больше ООП дружелюбный.
  3. обработайте исключение catch таким образом, чтобы этот класс можно было использовать в качестве компонента.
  4. удалить

вызов Environment.Exit С кодом ошибки больше 0, который кажется подходящим, затем при установке мы настраиваем службу для перезапуска при ошибке.

Environment.Exit(1);

Я сделал то же самое и в моей службе. Он работает нормально.