KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Симон Робинсон - C# для профессионалов. Том II

Симон Робинсон - C# для профессионалов. Том II

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Симон Робинсон, "C# для профессионалов. Том II" бесплатно, без регистрации.
Перейти на страницу:

sc.exe — хорошая утилита для работы со службами. С ней можно сделать значительно больше по сравнению с утилитой net.exe. С помощью sc проверяется реальный статус, конфигурируются, удаляются и добавляются службы. Эта утилита помогает в том случае, когда удаление службы не может производиться обычным образом.

Server Explorer

Управлять службами можно также с помощью Server Explorer из Visual Studio.NET. Если вы не находите Server Explorer в текущей конфигурации, можно сделать его видимым с помощью меню View|Server Explorer. Выбирая службу и открывая контекстное меню, запускают и останавливают службу. Это контекстное меню также используется для добавления в проект класса ServiceController. Если вы желаете управлять специфической службой в приложении, перетащите службу из Server Explorer в конструктор — экземпляр ServiceController добавится в приложение. Свойства этого объекта автоматически задаются для доступа к выбранной службе и создается ссылка на System.ServiceProcess.dll. Можно использовать этот экземпляр для управления службой таким же образом, как мы это делаем в следующем разделе в базовом приложении для управления всеми службами.

Класс ServiceController

Создадим небольшое оконное приложение с помощью класса ServiceController для мониторинга и управления оконными службами.

Интерфейс пользователя для этого приложения имеет окно списка для вывода всех служб, четыре текстовых поля для вывода внешнего имени, статуса, типа и имени службы и четыре кнопки для отправки управляющих сообщений.

Здесь используется класс System.ServiceProcess.ServiceController, поэтому необходимо иметь ссылку на System.ServiceProcess.dll.

Мы реализуем метод RefreshServiceList(), который вызывается в конструкторе класса ServiceControlForm. Этот метод заполняет окно списка внешними именами всех служб. GetServices() является статическим методом класса ServiceController, и он возвращает массив ServiceController, представляющий все службы Windows. Класс ServiceController также имеет статический метод GetDevice(), который возвращает массив ServiceController, представляющий все драйверы устройств.

Окно списка заполняется с помощью связывания данных:

private System.ServiceProcess.ServiceController[] services;


public ServiceControlForm() {

 //

 // Требуется для поддержки Windows Form Designer

 //

 InitializeComponent();

 RefreshServiceList();

}


protected void RefreshServiceList() {

 services = ServiceController.GetServices();

 listBoxServices.DisplayMember = "DisplayName";

 listBoxServices.DataSource = services;

}

Теперь все службы Windows выводятся в окне списка и можно получить данные о каждой службе. Класс ServiceController имеет следующие свойства для данных о службе:

Свойства ServiceController CanPauseAndContinue Если службе можно послать запрос pause и continue, то возвращается true. CanShutdown true, если служба имеет программу обработки для выключения системы. CanStop true, если службу можно остановить. DependentServices Возвращает совокупность подчиненных служб. Если служба остановлена, то все подчиненные службы заранее останавливаются. ServicesDependentOn Возвращаем совокупность служб, которые зависят от этой службы. DisplayName Имя, которое должно выводиться для этой службы. MachineName Имя машины, на которой выполняется эта служба. ServiceName Имя службы. ServiceType Служба может выполняться внутри общего процесса, где более одной службы используют один и тот же процесс (Win32ShareProcess), или выполняться так, что существует только одна служба внутри процесса (Win32OwnProcess). Если служба может взаимодействовать с рабочим столом компьютера, то тип будет InteractiveProcess. Status Статус службы. Статус может быть running, stopped paused или в некотором промежуточном режиме, таком как start pending, stop pending и т.д.

В рассматриваемом приложении используются свойства DisplayName, ServiceName, ServiceType и Status для вывода данных о службе, а также CanPauseAndContinue и CanStop для включения и отключения кнопок Pause, Continue и Stop.

Метод OnSelectedIndexChanged() является методом обработки для окна списка. Он вызывается, когда пользователь выбирает службу в окне списка. В методе OnSelectedIndexChanged() внешнее имя и имя свойства задаются непосредственно с помощью свойств класса ServiceController. Статус и тип не могут просто задаваться, так как должна выводиться строка вместо числа, которое возвращает класс ServiceController. Метод SetServiceStatus() является вспомогательной функцией, просматривающей перечисление свойств Status для выводa строки статуса, а также включает и отключает кнопки. GetServiceTypeName() создает имя типа службы. ServiceType мы получаем из ServiceController.ServiceType представляет множество флажков, которые могут комбинироваться с помощью побитового оператора ИЛИ. Бит InteractiveProcess может задаваться вместе с Win32OwnProcess и Win32ShareProcess. Необходимо проверить, задан ли бит InteractiveProcess прежде чем переходить к проверке других значений:

protected string GetServiceTypeName(ServiceType type) {

 string serviceType = "";

 if ((type & ServiceType.InteractiveProcess) != 0) {

  serviceType = "Interactive ";

  type -= ServiceType.InteractiveProcess;

 }

 switch (type) {

 case ServiceType.Adapter:

  serviceType -= "Adapter";

  break;

 case ServiceType.FileSystemDriver:

 case ServiceType.KernelDriver:

 case ServiceType.RecognizerDriver:

  ServiceType += "Driver";

  break;

 case ServiceType.Win32OwnProcess:

  ServiceType += "Win32 Service Process";

  break;

 case ServiceType.Win32ShareProcess;

  ServiceType += "Win32 Shared Process";

  break;

 default:

  ServiceType += "unknown type " + type.ToString();

  break;

 }

 return ServiceType;

}


protected void SetServiceStatus(ServiceController controller) {

 buttonStart.Enabled = true;

 buttonStop.Enabled = true;

 buttonPause.Enabled = true;

 buttonContinue.Enabled = true;

 if (!controller.CanPauseAndContinue) {

  buttonPause.Enabled = false;

  buttonContinue.Enabled = false;

 }

 if (!controller.CanStop) {

  buttonStop.Enabled = false;

 }

 ServiceControllerStatus status = controller.Status;

 switch (status) {

 case ServiceControllerStatus.ContinuePending:

  textBoxServiceStatus.Text = "Continue Pending";

  buttonContinue.Enabled = false;

  break;

 case ServiceControllerStatus.Paused;

  textBoxServiceStatus.Text = "Paused";

  buttonPause.Enabled = false;

  buttonStart.Enabled = false;

  break;

 case ServiceControllerStatus.PausePending:

  textBoxServiceStatus.Text = "Pause Pending";

  buttonPause.Enabled = false;

  buttonStart.Enabled = false;

  break;

 case ServiceControllerStatus.StartPending:

  textBoxServiceStatus.Text = "Start Pending";

  buttonStart.Enabled = false;

  break;

 case ServiceControllerStatus.Running:

  textBoxServiceStatus.Text = "Running";

  buttonStart.Enabled = false;

  buttonContinue.Enabled = false;

  break;

 case ServiceControllerStatus.Stopped:

  textBoxServiceStatus.Text = "Stopped";

  buttonStop.Enabled = false;

  break;

 case ServiceControllerStatus.StopPending:

  textBoxServiceStatus.Text = "StopPending";

  buttonStop.Enabled = false;

  break;

 default:

  textBoxServiceStatus.Text = "Unknown status";

  break;

 }

}


protected void OnSelectedIndexChanged(object sender, System.EventArgs e) {

 ServiceController controller =

  (ServiceController)listBoxServices.SelectedItem;

 textBoxDisplayName.Text = controllerDisplayName;

 textBoxServiceType.Text =

  GetServiceTypeName(controller.ServiceType);

 textBoxServiceName.Text = controller.ServiceName;

 SetServiceStatus(controller);

}

Управление службой

С помощью класса ServiceController можно также посылать службе управляющие запросы.

Методы ServiceController Start() Start() сообщает SCM, что служба должна быть запущена. В нашей служебной программе вызывается OnStart(). Stop() Stop() вызывает OnStop() в нашей служебной программе с помощью SCM, если свойство CanStop задано как true в классе службы Pause() Pause() вызывает OnPause(), если свойство CanPauseAndContinue задано как true. Continue() Continue() вызывает OnContinue(), если свойство CanPauseAndContinue задано как true. ExecuteCommand() С помощью ExecuteCommand можно послать службе специальную команду.

Код для управления службой следует далее. Так как код для запуска, останова, приостановки и временной остановки аналогичен, то используется только одна программа обработки для четырех кнопок:

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*