Главная » Язык программирования C#

Работа со службами Windows в C#

работа со службами windows с#

Как включить, отключить, приостановить службу Windows?

Для работы со службами в интерфейсе Windows имеется хороший инструмент, который так и называется — Службы. Открыть его можно если выполнить команду меню Выполнить

service.msc

Данный инструмент предоставит пользователю всю свободу действий для управления службами Windows. Для этого Вам только необходимо выбрать интересующую Вас службу и дважды нажать на неё. После этого перед Вами откроется окно Свойства этой службы. Тут можно вычитать подробное описание службы, познакомится с исполняемым файлом службы Windows, настроить тип запуска службы, остановить, включить, приостановить или продолжить работу службы(все эти настройки находится в первой вкладки для свойства любой службы):

управление службами windows

Вдобавок, Вы можете узнать от имени какого пользователя работает данная служба:

службы windows

а так же настроить попытки восстановления работоспособности службы в случае сбоя и многое другое.

работа со службами windows в с#

Но всё это делается с помощью клавиатуры и мышки. Перед Вами на скриншотах показан основной функционал данного инструмента. В данной статье мы рассмотрим основные моменты работы со службами Windows не с помощью интерфейса операционной системы, а реализуем это программно на языке программирования C#.

Управление службами WIndows в C#

Для того чтобы начать общаться со службами Windows на языке C#, нам нужно подключить директиву

System.ServiceProcess

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

  1. Правый клик мышкой по названию проекта.
  2. Добавить ссылку.
  3. В открывшемся окне переходим во вкладку .Net и ищем компонент System.ServiceProcess и выделяем его.
  4. Жмем ОК.

После чего добавляем вышеописанную директиву в проект:

using System.ServiceProcess;

Отключение, включение, приостановка и возобновление работы служб Windows

Для манипуляции с определенной службой Windows нам понадобится специальный класс(ServiceController), который предназначен для данных целей. Кроме этого нам понадобиться и имя службы, чтобы хоть как-то обращаться к службе. Имя службы Вы можете узнать в свойствах службы, используя для этого вышеописанное окно Службы. В приведенном ниже примере я используя имя службы Центра безопасности Windows — wscsvc.

службы windows c#

System.ServiceProcess.ServiceController ser = new System.ServiceProcess.ServiceController(«wscsvc»);// создаем объект для обращения к службе
ser.Start();//запуск службы Windows
ser.Pause();//приостановка службы Windows
ser.Continue();//возобновление работы службы
ser.Stop();//остановка службы
ser.Close();//закрываем созданный объект

Думаю объяснять значения команд не нужно, они интуитивно понятны, если знать английский. Но всё же я привел комментарии, которые доступно объясняют смысл соответствующей строчки кода.

Изменение типа запуска службы Windows в C#

К сожалению, я не нашел информацию как можно напрямую подключиться к службе и изменить тип её запуска(если кто-то обладает данной информацией, прошу поделиться в комментариях). Если это и возможно, то это не так просто, как в случае с включением/выключением службы. Ответ не лежит на поверхности. Ну, а так как программисты народ ленивый, пойдем простым путем — будем редактировать реестр Windows, в котором продублированы почти что все настройки операционной системы, в том числе тип запуск служб. В разделе

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

реестра хранятся различные параметры всех служб, среди которых есть параметр, регулирующий тип запуска службы. Носит данный параметр простое и запоминающееся имя — Start. Данный параметр принимает значения от 1 до 4, которые соответствуют следующим параметрам запуска:

  1. Автоматически(отложенный запуск).
  2. Автоматически.
  3. Вручную.
  4. Отключена.

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

находится множество других разделов, как правило, по одному на каждую службу. Данные разделы имеют те же названия, что и сами службы, поэтому Вы не должны потеряться. А для этого необходимо к указанному пути через слэш добавить название службы Windows:

RegistryKey regkey;
string keyValueInt = "4";//указываем тип запуска службы
string subKey = @"SYSTEM\CurrentControlSet\Services\wscsvc";//месторасположения службы
try
{
regkey = Registry.LocalMachine.CreateSubKey(subKey);  //указываем путь
regkey.SetValue(«Start», keyValueInt, RegistryValueKind.DWord); //создаем по заданному пути параметр типа DWord со значение запуска
regkey. Close();
}
catch (Exception ex)
{
MessageBox. Show(ex. ToString());
}

Данный отрезок кода изменяет запуск службы Центра обеспечения безопасности Windows на «отключено». Чтобы данный код не был выделен красным цветом, необходимо подключить следующую директиву:

using Microsoft. Win32;

<UPDATE>Уважаемый читатель блога в комментариях указал код, с помощью которого можно более прямым образом настроить тип запуска для служб Windows. Ниже привожу этот код, а так же искренне благодарю за помощь:

System.Diagnostics.ProcessStartInfo processInfo = new System.Diagnostics.ProcessStartInfo();
processInfo.FileName = «sc»;
processInfo.Arguments = «config ServiceName start= auto»; // auto|demand|disabled|delayed-auto - перечисленные аргументы соответствуют типу запуска службы
processInfo.UseShellExecute = true;
processInfo.Verb = «runas»; // от имени администратора
processInfo.WindowStyle = ProcessWindowStyle.Hidden; // скрыть окно
System.Diagnostics.Process pr = new System.Diagnostics.Process();
try
{
pr = Process.Start(processInfo);
}
catch (Win32Exception)
{
//Ничего не делаем, потому что пользователь, возможно, нажал кнопку «Нет»
// в ответ на вопрос о запуске программы в окне предупреждения UAC (для Windows 7)
}
pr.WaitForExit();

</UPDATE>

Вот такими несложными действиями Вы можете программно управлять работой служб Windows на языке C#.

Один комментарий к записи “Работа со службами Windows в C#
  1. Андрей в cказал :

    System.Diagnostics.ProcessStartInfo processInfo = new System.Diagnostics.ProcessStartInfo();

    processInfo.FileName = «sc»;
    processInfo.Arguments = «config ServiceName start= auto»; // auto|demand|disabled|delayed-auto
    processInfo.UseShellExecute = true;
    processInfo.Verb = «runas»; // от имени администратора
    processInfo.WindowStyle = ProcessWindowStyle.Hidden; // скрыть окно
    System.Diagnostics.Process pr = new System.Diagnostics.Process();

    try
    {
    pr = Process.Start(processInfo);
    }
    catch (Win32Exception)
    {
    //Ничего не делаем, потому что пользователь, возможно, нажал кнопку «Нет»
    // в ответ на вопрос о запуске программы в окне предупреждения UAC (для Windows 7)
    }

    pr.WaitForExit();

Добавить комментарий

Ваш комментарий появится после модерации.