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';