Управление службами Windows через командную строку

Зачем использовать командную строку для управления службами
Стандартный путь — открыть Панель управления → Администрирование → Службы (services.msc) и управлять сервисами вручную. Это удобно для одиночных машин, но неудобно при работе с десятками или сотнями компьютеров. Командная строка даёт:
- Быструю проверку состояния всех служб на удалённом хосте.
- Удалённую остановку/запуск конкретной службы одной командой.
- Возможность автоматизировать операции через скрипты и планировщик задач.
Важно: для удалённого использования SC нужны административные права на целевой хост и разрешённый сетевой доступ (RPC/SMB).
Основные команды SC и примеры
Краткое объяснение терминов:
- Служба — фоновый процесс Windows, который запускается системой или по требованию.
- Имя службы (ServiceName) — внутренний идентификатор, а не отображаемое имя.
Примеры команд:
- Просмотр всех служб на локальной машине:
sc query- Просмотр всех служб на удалённой машине (замените COMPUTERNAME):
sc \\COMPUTERNAME query | more- Показать только остановленные службы:
sc \\COMPUTERNAME query state= inactive | more- Показать статус конкретной службы:
sc \\COMPUTERNAME query Spooler- Остановить службу на удалённом хосте:
sc \\COMPUTERNAME stop Spooler- Запустить службу:
sc \\COMPUTERNAME start SpoolerПримечание: символы экранирования — два обратных слеша \\ перед именем компьютера.
Просмотр вывода постранично и логирование
Пайп | more делает вывод постраничным. Чтобы сохранить вывод в файл на локальной машине, перенаправьте результат:
sc \\COMPUTERNAME query > C:\temp\services.txtЧтобы логировать результаты операций (старт/стоп) используйте перенаправление вывода в файл:
sc \\COMPUTERNAME stop Spooler >> C:\temp\results.txt 2>&1Пример интерактивного скрипта на VBScript для остановки/запуска службы
Этот скрипт спрашивает имя компьютера, имя службы и действие, выполняет команду SC и сохраняет вывод в файл. Поместите код в файл с расширением .vbs и запустите двойным щелчком или через cscript.
' sc-control.vbs
Option Explicit
Dim objShell, strComputer, strService, strAction, cmd, exec, outputFile, fso, outFile, line
Set objShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
outputFile = "C:\\temp\\results.txt"
If Not fso.FolderExists("C:\\temp") Then fso.CreateFolder("C:\\temp")
strComputer = InputBox("Введите имя компьютера (или "." для локального):", "Компьютер", ".")
If strComputer = "" Then WScript.Quit
strService = InputBox("Введите имя службы (ServiceName):", "Служба")
If strService = "" Then WScript.Quit
strAction = InputBox("Введите действие: start или stop:", "Действие", "stop")
If LCase(strAction) <> "start" And LCase(strAction) <> "stop" Then
WScript.Echo "Неверное действие"
WScript.Quit
End If
cmd = "cmd /c sc \\\" & strComputer & "\\\" " & LCase(strAction) & " " & strService
Set exec = objShell.Exec(cmd)
Set outFile = fso.OpenTextFile(outputFile, 8, True)
outFile.WriteLine("=== " & Now & " ===")
outFile.WriteLine("Команда: " & cmd)
Do While Not exec.StdOut.AtEndOfStream
line = exec.StdOut.ReadLine()
outFile.WriteLine(line)
Loop
If Not exec.StdErr.AtEndOfStream Then
Do While Not exec.StdErr.AtEndOfStream
line = exec.StdErr.ReadLine()
outFile.WriteLine("ERR: " & line)
Loop
End If
outFile.Close
WScript.Echo "Готово. Результаты в " & outputFileВажно: этот пример запускает внешнюю команду cmd и записывает вывод в файл. Убедитесь, что у пользователя есть права на запись в C:\temp и права администратора на целевой хост.
Современная альтернатива — PowerShell
PowerShell предоставляет объекты, лучше подходит для автоматизации и даёт гибкость:
- Локально:
Get-Service -Name Spooler
Stop-Service -Name Spooler -Force
Start-Service -Name Spooler- Удалённо, если включён PowerShell Remoting:
Invoke-Command -ComputerName COMPUTERNAME -ScriptBlock { Stop-Service -Name Spooler -Force }- Получить все остановленные службы на удалённом хосте:
Invoke-Command -ComputerName COMPUTERNAME -ScriptBlock { Get-Service | Where-Object {$_.Status -eq 'Stopped'} }Преимущества PowerShell: структурированный вывод (объекты), более тонкий контроль и возможность использовать креденшлы безопасно.
Когда использовать SC, а когда PowerShell
Используйте SC если:
- Нет PowerShell Remoting.
- Нужно быстро выполнить одну команду и получить текстовый вывод.
- Требуется совместимость со старыми системами.
Используйте PowerShell если:
- Нужна сложная логика, фильтрация, параллелизм.
- Требуется безопасная передача учётных данных.
- Вы хотите вернуть объекты для последующей обработки.
Проверки прав и сетевых требований
Важно:
- Для выполнения SC против удалённой машины пользователь должен быть администратором на целевой машине.
- Необходим доступ к RPC/SMB (обычно порты TCP 135, 139, 445 и динамические порты RPC). В сетях с жёстким firewall это может быть заблокировано.
- Если машина находится в другом домене, потребуется доверие между доменами или явные учётные данные.
Проверка соединения:
ping COMPUTERNAME
telnet COMPUTERNAME 135
sc \\COMPUTERNAME queryЕсли ping проходит, но sc возвращает ошибку доступа, проверьте права и UAC (локальная политика может блокировать удалённое управление даже для членов группы Администраторы).
Отказоустойчивость и сценарии, когда это не сработает
Когда SC может не помочь:
- Служба висит в состоянии STOP_PENDING длительное время — остановка не гарантирует немедленного завершения.
- Процессы зависли на уровне драйвера или ядра — SC не сможет завершить такие процессы.
- Низкий уровень сети/брендмауэр блокирует RPC/SMB.
Альтернативы в этих случаях:
- Перезапуск сервиса-зависимости или связанного процесса вручную.
- Перезагрузка сервера как крайняя мера.
- Использование WMI/PowerShell с расширенными правами.
Чек-листы по ролям
Сисадминистратор:
- Проверьте административные права на целевой хост.
- Убедитесь, что порт 135 и SMB открыты.
- Логируйте операции и сохраняйте результаты в централизованное хранилище.
Служба поддержки/Helpdesk:
- Ищите отображаемое имя службы и ServiceName (используйте services.msc для проверки).
- Если нужно быстро остановить сервис — используйте sc stop, записывайте причину в тикет.
DevOps/Automation:
- Предпочитайте PowerShell Remoting и Runbooks.
- Добавьте retries и проверки состояния после операций.
Шаблон SOP для остановки/запуска службы
- Подтвердить причину и окно обслуживания.
- Проверить зависимости службы:
sc qc Spooler- Сделать бэкап конфигурации/важных файлов (если релевантно).
- Выполнить остановку и зафиксировать вывод:
sc \\COMPUTERNAME stop Spooler >> C:\temp\results.txt 2>&1- Подтвердить состояние:
sc \\COMPUTERNAME query Spooler- При проблемах восстановить из резервной копии или перезагрузить сервер.
Критерии приёмки
- Служба должна перейти в состояние STOPPED в течение согласованного окна.
- Логи операций должны быть сохранены и прикреплены к тикету.
Отладка и распространённые ошибки
- ERROR 5: Access is denied — нет прав администратора.
- The account is not authorized to logon locally — попробуйте использовать учетные данные доменного администратора или включить управление удалёнными службами в политике.
- RPC server is unavailable — проблема с сетью или службой RPC на удалённом хосте.
Советы:
- Запустите оболочку от имени администратора.
- Используйте PsExec или PowerShell Remoting как альтернативу при проблемах с SC.
Пример автоматизации с PowerShell и параллельной обработкой
$computers = Get-Content -Path C:\temp\computers.txt
$service = 'Spooler'
$script = { param($svc) Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue; Get-Service -Name $svc }
$results = Invoke-Command -ComputerName $computers -ScriptBlock $script -ArgumentList $service -ThrottleLimit 20
$results | Export-Csv C:\temp\svc-results.csv -NoTypeInformationЭтот подход масштабируется и возвращает структурированный CSV для последующего анализа.
Безопасность и соответствие
- Никогда не храните пароли в открытом виде в скриптах. Используйте защищённые учётные данные (Credential Manager, секретные хранилища).
- Логи операций считаются служебной информацией. При работе с клиентскими машинами соблюдайте политики конфиденциальности.
Быстрый справочник (cheat sheet)
- sc \HOST query — список служб на HOST
- sc \HOST query state= inactive — только остановленные
- sc \HOST query ServiceName — статус конкретной службы
- sc \HOST stop ServiceName — остановить
- sc \HOST start ServiceName — запустить
- PowerShell: Get-Service, Stop-Service, Start-Service, Invoke-Command
Ментальные модели и рекомендации
- Думайте в терминах зависимостей: останавливая сервис, проверьте, не зависит ли от него что-то важное.
- Минимизируйте время простоя: тестируйте команды на тестовом хосте и логируйте результат.
- Автоматизируйте повторы и проверки: если служба не остановилась, попробуйте повторную команду с таймаутом, затем эскалацию.
Решения для распространённых сценариев
- Если вы не можете подключиться по SC: проверьте сети, firewall и права. Попробуйте PsExec или PowerShell Remoting.
- Если служба не останавливается и висит в STOP_PENDING: просмотрите журнал событий (Event Viewer) и процессы, связанные с этой службой.
Заключение
SC — простой и надёжный инструмент для администраторов, которым нужно быстро проверять и управлять службами на локальных и удалённых машинах. Для долгосрочной автоматизации и сложной логики лучше использовать PowerShell. Всегда проверяйте права, сетевые правила и зависимости перед выполнением операций, и логируйте результаты.
Краткие рекомендации:
- Используйте SC для быстрых одноразовых задач и диагностики.
- Используйте PowerShell для сценариев автоматизации и массовых изменений.
Поделитесь в комментариях: какой инструмент вы используете чаще — SC или PowerShell, и какие приёмы автоматизации помогают вам в работе?
Image Credit: Shutterstock







