API: Службы Windows

Функции для получения статуса, запуска, остановки и перезапуска служб Windows.

Регистрация в C++: regService(js).

Требует запуска JsN.exe от имени администратора.


Возможные состояния службы

Состояние (state) Код (code) Описание
"running" 4 Служба работает
"stopped" 1 Служба остановлена
"start_pending" 2 Выполняется запуск
"stop_pending" 3 Выполняется остановка
"paused" 7 Приостановлена
"pause_pending" 6 Переход в состояние паузы
"continue_pending" 5 Возобновление работы
"unknown" Неизвестное состояние

svc_status

svc_status(name: string) → object

Получить текущее состояние службы.

Параметры:

Параметр Тип Описание
name string Системное имя службы (не отображаемое имя)

Результат:

Поле Тип Описание
state string Состояние из таблицы выше
code number Числовой код SERVICE_* (1–7)
pid number PID процесса службы (0, если не работает)
error string Сообщение об ошибке или ""

Пример:

let s = svc_status("MyService");

if (s.error) {
    console.log("Ошибка:", s.error);
} else {
    console.log("Состояние:", s.state);  // "running"
    console.log("PID:", s.pid);          // 4321
}

svc_start

svc_start(name: string) → object

Запустить службу.

Параметры:

Параметр Тип Описание
name string Системное имя службы

Результат:

Поле Тип Описание
ok bool true — команда запуска успешно отправлена
error string Сообщение об ошибке или ""

Пример:

let r = svc_start("MyService");
if (r.ok) {
    console.log("Служба запускается");
} else {
    console.log("Ошибка запуска:", r.error);
}

svc_stop

svc_stop(name: string) → object

Остановить службу.

Параметры:

Параметр Тип Описание
name string Системное имя службы

Результат:

Поле Тип Описание
ok bool true — команда остановки успешно отправлена
error string Сообщение об ошибке или ""

Пример:

let r = svc_stop("MyService");
if (r.ok) {
    console.log("Служба останавливается");
} else {
    console.log("Ошибка остановки:", r.error);
}

svc_restart

svc_restart(name: string) → object

Перезапустить службу: остановка → ожидание завершения (до 15 сек) → запуск.

Параметры:

Параметр Тип Описание
name string Системное имя службы

Результат:

Поле Тип Описание
ok bool true — служба успешно перезапущена
error string Сообщение об ошибке или ""

Пример:

let r = svc_restart("MyService");
if (r.ok) {
    console.log("Служба перезапущена");
} else {
    console.log("Ошибка перезапуска:", r.error);
}

Полный пример: проверка состояния и автоматический перезапуск

let svcName = "MyService";

// Проверить состояние
let s = svc_status(svcName);

if (s.error) {
    console.log("[ОШИБКА] Не удалось получить статус:", s.error);
} else if (s.state === "stopped") {
    console.log("[ПРЕДУПРЕЖДЕНИЕ] Служба остановлена, запуск...");
    let r = svc_start(svcName);
    console.log("Результат:", r.ok ? "OK" : r.error);

} else if (s.state === "running") {
    console.log("[OK] Служба работает, PID:", s.pid);

    // Проверить, отвечает ли процесс
    let alive = proc_alive(s.pid);
    if (!alive.responding) {
        console.log("[ПРЕДУПРЕЖДЕНИЕ] Процесс завис, перезапуск службы...");
        let r = svc_restart(svcName);
        console.log("Перезапуск:", r.ok ? "OK" : r.error);
    }

} else {
    console.log("[ИНФО] Состояние:", s.state);
}

Как найти системное имя службы

Системное имя (не отображаемое) можно найти:

  1. PowerShell: Get-Service | Where-Object { $_.DisplayName -like "*MyApp*" } | Select-Object Name
  2. Диспетчер задач: Вкладка «Службы» → столбец «Имя»
  3. services.msc: правая кнопка мыши → Свойства → поле «Имя службы»