Если вы разрабатываете приложения на C#, которые взаимодействуют с системными компонентами, вам может понадобиться управление службами Windows: запуск, остановка или перезапуск. Эти действия особенно актуальны для утилит администрирования, установщиков и технических решений, работающих в среде Windows. Ниже приведён базовый листинг кода, который вы можете адаптировать под собственные проекты. Важно отметить, что любые операции с системными службами должны выполняться с правами администратора.
// Запуск службы
public static void StartService(string serviceName)
{
ServiceController service = new ServiceController(serviceName);
// Проверяем не запущена ли служба
if (service.Status != ServiceControllerStatus.Running)
{
// Запускаем службу
service.Start();
// В течении минуты ждём статус от службы
service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromMinutes(1));
Console.WriteLine("Служба была успешно запущена!");
}
else
{
Console.WriteLine("Служба уже запущена!");
}
}
// Останавливаем службу
public static void StopService(string serviceName)
{
ServiceController service = new ServiceController(serviceName);
// Если служба не остановлена
if (service.Status != ServiceControllerStatus.Stopped)
{
// Останавливаем службу
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromMinutes(1));
Console.WriteLine("Служба была успешно остановлена!");
}
else
{
Console.WriteLine("Служба уже остановлена!");
}
}
// Перезапуск службы
public static void RestartService(string serviceName)
{
ServiceController service = new ServiceController(serviceName);
TimeSpan timeout = TimeSpan.FromMinutes(1);
if (service.Status != ServiceControllerStatus.Stopped)
{
Console.WriteLine("Перезапуск службы. Останавливаем службу...");
// Останавливаем службу
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
Console.WriteLine("Служба была успешно остановлена!");
}
if (service.Status != ServiceControllerStatus.Running)
{
Console.WriteLine("Перезапуск службы. Запускаем службу...");
// Запускаем службу
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
Console.WriteLine("Служба была успешно запущена!");
}
}
Так же не забываем добавлять using
using System.ServiceProcess;
Вот еще альтернативный вариант.
Пример кода C# для управления службами:
using System;
using System.ServiceProcess;
class Program
{
static void Main()
{
string serviceName = "wuauserv"; // Имя службы, например, Центр обновления Windows
ServiceController service = new ServiceController(serviceName);
try
{
Console.WriteLine($"Текущее состояние службы: {service.Status}");
// Остановка службы
if (service.Status != ServiceControllerStatus.Stopped &&
service.Status != ServiceControllerStatus.StopPending)
{
Console.WriteLine("Остановка службы...");
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped);
Console.WriteLine("Служба остановлена.");
}
// Запуск службы
Console.WriteLine("Запуск службы...");
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running);
Console.WriteLine("Служба запущена.");
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"Ошибка управления службой: {ex.Message}");
}
catch (System.ComponentModel.Win32Exception ex)
{
Console.WriteLine($"Ошибка доступа: {ex.Message}. Убедитесь, что запущено от имени администратора.");
}
}
}
Важные замечания:
- Все операции должны выполняться с правами администратора. Для этого укажите в манифесте приложения
requireAdministrator
. - Имя службы (
serviceName
) можно узнать в оснасткеservices.msc
. - Вы можете дополнить код функционалом для перезапуска, обработки нескольких служб или создания графического интерфейса.
🛠 Полезные команды:
sc query
— список служб в командной строке Windows.net start
/net stop
— управление службами вручную.services.msc
— графический интерфейс для управления.