Как я могу перезапустить службу Windows программно in.NET
Как я могу перезапустить службу windows программно в .NET?
Кроме того, мне нужно сделать операцию, когда перезапуск службы будет завершен.
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 (самый популярный ответ на этот вопрос), но с некоторыми изменениями.
- утилизация
ServiceController
класс после каждого использования, потому что он реализуетIDisposable
интерфейс.- уменьшить параметры метода: нет необходимости в
serviceName
параметр передается для каждого метода, мы можем установить его в конструкторе, и каждый другой метод будет использовать это имя службы.
Это также больше ООП дружелюбный.- обработайте исключение catch таким образом, чтобы этот класс можно было использовать в качестве компонента.
- удалить