sc + Restart-Service: керування службами Windows — IT-Wiki

[IT-FORMAT]
Новий формат бізнесу

» » » sc та Restart-Service: керування службами Windows з консолі — без services.msc

sc та Restart-Service: керування службами Windows з консолі — без services.msc

Цикл: IT-Wiki / Атлас команд Windows Переглядів: 2
Перед стартом
  • Керування службами потребує прав адміна. Запускайте cmd або PowerShell як адміністратор.
  • sc — це sc.exe, legacy-команда. У PowerShell 7+ алiас sc НЕ прив'язаний до sc.exe — треба писати sc.exe явно, або використовувати PS-командлети.
  • Усі приклади працюють і на Windows 10/11, і на Windows Server 2016+.

Яку команду вибрати: sc vs PowerShell

Це одне з типових «чому у Windows 10 способів робити одне й те саме».

  • sc.exe — швидка, працює навіть без PowerShell, синтаксис коротший у рядку. Але менш гнучка: не повертає об'єктів, parsing виводу — через findstr.
  • PowerShell (Get-Service, Restart-Service, Set-Service, Start-Service, Stop-Service) — повертає об'єкти, гарно ланцюжиться (|), легко скриптувати.

Типовий вибір: для інтерактивної разової дії — sc query wuauserv. Для скриптів, автоматизації, масових операцій — PowerShell.

Довідкова таблиця — sc.exe

КомандаЩо робить
sc query [name]Статус служби (running/stopped/paused). Без name — усі запущені.
sc queryex nameРозширений статус з PID процесу — корисно для kill-ання.
sc query type= service state= allУсі служби (включно зі stopped). Увага: пробіл після =обов'язковий.
sc start nameЗапустити.
sc stop nameЗупинити.
sc config name start= auto|delayed-auto|demand|disabledЗмінити тип запуску.
sc config name binPath= "..."Змінити шлях до exe.
sc qc nameQuery Config — показати повну конфігурацію служби.
sc qfailure nameПереглянути recovery actions.
sc failure name reset= N actions= restart/60000/restart/60000/run/0Налаштувати recovery на падіння.
sc description name "..."Описати службу.
sc create name binPath= "..." start= autoСтворити нову службу.
sc delete nameВидалити службу.
Синтаксис sc — пастка на рівному місці

Після = у параметрах sc config і sc failure завжди має бути пробіл. start= auto — працює. start=auto — не працює, але помилка невиразна. Це єдиний CLI-інструмент Windows з такою особливістю, тому перевіряйте двічі при копіюванні з чужих скриптів.

Сценарій 1. Дізнатися стан служби й перезапустити її

sc:

sc query spooler

У виводі: STATE : 4 RUNNING. Перезапуск класичним способом — стоп+старт:

sc stop spooler
sc start spooler

Між ними може знадобитися пауза, якщо служба довго зупиняється. sc не має рестарту в одну команду.

PowerShell:

Get-Service spooler
Restart-Service spooler -Force

-Force — потрібне якщо у служби є залежні, які теж треба перезапустити. Без нього буде запит підтвердження.

Сценарій 2. Змінити тип запуску (startup type)

Задача: вимкнути Print Spooler на серверах без принтерів (регулярна security-вимога після PrintNightmare).

sc:

sc stop spooler
sc config spooler start= disabled

PowerShell:

Stop-Service spooler
Set-Service spooler -StartupType Disabled

Значення -StartupType: Automatic, AutomaticDelayedStart, Manual, Disabled.

Delayed-auto — для важкого старту

Тип AutomaticDelayedStart (sc config X start= delayed-auto) — служба запускається через 2 хвилини після boot. Корисно для важких служб, які вимагають щоб мережа, AD, DNS уже підтяглися (бекапи, моніторинг, антивіруси). Зменшує час boot'у, бо одразу стартує критичний мінімум.

Сценарій 3. Перезапуск з залежностями

Задача: треба перезапустити W32Time (Windows Time), але вона залежить від RPC, і від неї залежать інші — потрібно правильний порядок.

Перевірити залежності перед запуском:

Get-Service W32Time | Select-Object -ExpandProperty ServicesDependedOn

І зворотно — хто залежить від W32Time:

Get-Service W32Time | Select-Object -ExpandProperty DependentServices

Правильний рестарт з усіма залежними (Force зупиняє залежні, потім стартує їх разом):

Restart-Service W32Time -Force

sc еквівалент — нема прямого, треба стартувати стек вручну.

Сценарій 4. Налаштування recovery actions — «рестартуй мене, якщо я впаду»

Задача: ваш власний application-сервіс іноді крашиться раз-два на місяць. Треба, щоб Windows автоматично стартував його після падіння.

sc failure MyAppService reset= 86400 actions= restart/60000/restart/60000/run/0

Розбір:

  • reset= 86400 — лічильник «скільки падінь» скидається через 86400 секунд (24 години).
  • actions= — список пар тип/мілісекунди затримки. У прикладі:
    • 1-е падіння: restart/60000 — перезапустити через 60 секунд.
    • 2-е: те саме.
    • 3-е й далі: run/0 — зовнішня дія (запустити команду) з 0 затримки.

Переглянути поточні налаштування:

sc qfailure MyAppService

Це те саме, що вкладка Recovery у services.msc, але без GUI.

Сценарій 5. PID процесу служби — щоб kill-нути, якщо застрягла

Задача: Restart-Service висне, і сам stop теж — процес служби не завершується. Треба знайти PID і вбити taskkill'ом.

sc queryex spooler

Вивід містить PID : 4532. Далі:

taskkill /F /PID 4532

Або в PowerShell одним рядком:

Get-Process -Id (Get-WmiObject Win32_Service -Filter "Name='spooler'").ProcessId | Stop-Process -Force

Після примусового вбивства — треба перевірити, що state не застряг у STOP_PENDING:

sc query spooler

Сценарій 6. Масова перевірка — «які служби впали на 50 серверах»

$hosts = Get-Content C:\Temp\servers.txt
foreach ($h in $hosts) {
    $s = Get-Service -ComputerName $h -Name 'BITS','wuauserv','W32Time' -ErrorAction SilentlyContinue
    foreach ($svc in $s) {
        if ($svc.Status -ne 'Running') {
            [PSCustomObject]@{
                Server = $h
                Service = $svc.Name
                Status = $svc.Status
            }
        }
    }
} | Export-Csv C:\Temp\stopped-services.csv -NoTypeInformation

Get-Service -ComputerName вимагає прав адміна на цільовій машині і відкритих WMI-портів.

Типові пастки

Пастка 1: STOP_PENDING назавжди

Якщо служба зависла у стані STOP_PENDING, повторний sc stop не допомагає. Вирішується примусовим вбивством процесу (див. Сценарій 5) з подальшим sc start. Тайм-аут очікування явного завершення — до 125 секунд за замовчуванням, до цього sc висітиме.

Пастка 2: sc config binPath= з лапками

Якщо шлях до exe містить пробіл, потрібні внутрішні лапки з escape:

sc config MyService binPath= "\"C:\Program Files\MyApp\svc.exe\" -arg"

Типова помилка — забути escape внутрішніх лапок, тоді служба створюється з некоректним шляхом і не стартує.

Пастка 3: Set-Service -StartupType не зупиняє

Зміна startup type через Set-Service не зупиняє працюючу службу. Якщо treба зараз зупинити і заборонити запуск, потрібні обидві команди: Stop-Service X + Set-Service X -StartupType Disabled.

Небезпека: sc delete

sc delete одразу видаляє реєстровий ключ служби. Відновити — тільки заново створити через sc create з тими ж параметрами (а ви їх пам'ятаєте?). Перед sc delete завжди робіть sc qc NAME і зберігайте повний вивід — саме звідти потім брати binPath, start, description, dependencies.

Чеклист типових операцій

Пам'ятка
  • Перевірка стану: sc query X / Get-Service X.
  • Перезапуск (правильно, з залежними): Restart-Service X -Force.
  • Змінити startup: sc config X start= auto або Set-Service X -StartupType Automatic.
  • Delayed-auto: sc config X start= delayed-auto.
  • Recovery при падінні: sc failure X reset= 86400 actions= restart/60000/restart/60000//0.
  • Знайти PID: sc queryex X.
  • Залежності: Get-Service X | Select -Expand ServicesDependedOn.
  • Повна конфігурація: sc qc X (зберегти перед delete!).

Пов'язане

services.msc і PowerShell не виключають одне одного. GUI — для огляду. CLI — для точкових змін і масових операцій.

  • Коментарі


Привіт, незнайомець
Опитування

Якою програмою обліку ви користуєтесь?