Ищите среди служб Windows, просматривайте каждое изменение заранее и смотрите, что ушло в дрейф со вчерашнего дня

Better Windows Services - это services.msc, перестроенный для тех, кто администрирует машины с Windows: окно и командная строка на одном движке. Задавайте машине вопрос вместо того, чтобы прокручивать восемьсот строк. Смотрите, что сделает изменение, прежде чем что-либо нажмёте. И то, чего в services.msc никогда не было: заморозьте каждую службу в файл и через неделю спросите, что изменилось.

  • Свободный и бесплатный, GPL-3.0
  • Один файл или установщик
  • Для просмотра не нужны права администратора
  • Никогда не обращается к интернету
Окно с пятью выбранными записями и планом их запуска над списком: пять шагов, примечание, что две из них уже в этом состоянии, строка bws start для каждой записи и кнопка Start 5 entries.
Выбранные записи, план, показанный до того, как что-либо произойдёт, и строка bws, которая просит ровно то же самое. Программа говорит по-английски: окно читает лежащий рядом файл языка, так что перевод возможен без пересборки.
Полминуты с ним

Как это выглядит в работе

Настоящий сеанс на Windows, установленной на польском: отображаемые имена приходят из Windows, поэтому они на её языке. Само окно говорит по-английски.

Четыре выбранные записи и план их запуска, принудительный перезапуск Local Session Manager, план которого предупреждает, что без неё машина не работает, и просит ввести её имя, прежде чем кнопка заработает, вопросы для начала под пустым полем поиска и Print Spooler, найденный вводом части имени и запущенный.
Четыре выбранные записи и план их запуска, принудительный перезапуск, который просит имя нужной машине службы, вопросы под пустым полем поиска и Print Spooler, найденный вводом и запущенный.
Начальный экран: три карточки с числами об этой машине - работающие службы, службы с автозапуском, которые не поднялись, и службы с автозапуском, чей файл пропал - и кнопка Show the list.
Он открывается несколькими числами об этой машине. Каждое из них - вопрос: щёлкните, и вопрос попадёт в поле поиска.
Список служб с тремя списками над полем поиска, пустое поле поиска, кнопки фильтров, раскрытые рядами для состояния, типа запуска, подписи, расхождений и триггеров, и список ниже.
Кнопки фильтров пишут в поле поиска, так что то, что вы нажали, - это запрос, который можно читать и править.
Зачем это нужно

services.msc почти не менялся со времён Windows 2000

Администраторы проводят в нём часы каждую неделю и упираются в одни и те же стены.

  • Нет поиска. Единственная навигация - прыжок на первую букву отображаемого имени.
  • Нет фильтрации. Нельзя спросить покажи, что настроено на автозапуск и не работает.
  • По одной строке за раз. Перезапуск двенадцати служб - это двенадцать щелчков правой кнопкой и двенадцать ожиданий.
  • «Stopping...» навсегда, без другого выхода, кроме Диспетчера задач и угадывания процесса.
  • Нет истории. Никто не знает, кто поставил этот тип запуска в Disabled и когда.
  • Скрытые данные. Процесс, триггеры, привилегии, дескриптор безопасности, кто подписал исполняемый файл - для всего этого нужен sc.exe по памяти или реестр.
  • Нет равноценной командной строки. У sc.exe синтаксис из девяностых, а Get-Service, поставляемый с Windows, в Windows PowerShell 5.1 не показывает, от какой учётной записи работает служба, не говоря уже об описании. PowerShell 7 показывает и то и другое, и ставится отдельно.

Другие инструменты закрывают каждый свою часть

Process Hacker и System Informer показывают богатый список и умеют принудительно завершать процессы, но в них нет аудита и командной строки. sc.exe и PsService умеют всё и ничего вам не говорят. Командлеты *-Service в PowerShell пригодны для скриптов и поверхностны.

Никто не соединяет список с поиском, предпросмотр перед каждым изменением и запись того, что менялось со временем, - а эта запись и есть причина оставить этот инструмент на машине после первого же дня.

Полное сравнение
Что он делает

Окно и командная строка на одном движке

Спрашивайте, а не прокручивайте

start:auto !status:running - это что должно работать и не работает. Один язык, в поле поиска и в bws list --query, с подсказкой полей по мере ввода.

Показывайте план до того, как что-то произойдёт

Каждая остановка, запуск, перезапуск и смена типа запуска просматривается заранее вместе со службами, которые она тянет за собой, и предпросмотр - это то, что выполняется.

Говорите, что ушло в дрейф и кто это изменил

bws snapshot create замораживает машину в файл, а bws snapshot diff говорит, что изменилось с тех пор, отделяя конфигурацию от того, что просто запустилось или остановилось. bws history по журналу System говорит, кто изменил тип запуска и кто установил службу. Окно делает всё три в разделе Audit....

Чините частую проблему одним нажатием

Вкладка Tools и bws tool fix перезапускают службу, стоящую за не печатающим принтером, пропавшим звуком или зависшим поиском, вместе с тем, что от неё зависит, по тому же плану, что и всё остальное.

Останавливайте службу, которая не хочет останавливаться

Сначала просит вежливо и завершает процесс, только если это не удалось, называя каждую другую службу, которая в нём живёт.

Показывайте то, что скрывает services.msc

Кто подписал исполняемый файл и доверяет ли ему Windows, триггеры, привилегии, дескриптор безопасности, процесс и его память. В виде столбцов и в виде того, по чему можно искать.

Говорите, когда что-то не удалось прочитать

Поле, которое не удалось прочитать, сообщается как непрочитанное и никогда не показывается пустым. Снимок, сделанный без прав администратора, сообщает об этом внутри файла.

Вписывайтесь в скрипты

--json у каждой команды, код завершения для каждого исхода и 5, когда сравнение находит дрейф.

Работайте из одного файла, автономно

Распакуйте и запустите или установите на всю машину. Ставить .NET не нужно, и он никогда не обращается к интернету. Для чтения права администратора не нужны. GPL-3.0.

То, чего services.msc никогда не делал

Что изменилось со вчерашнего дня

Снимок - это вся машина в один момент: каждая служба и драйвер с типом запуска, учётной записью, путём запуска, хешем и подписантом файла, зависимостями, триггерами, привилегиями и дескриптором безопасности. Это JSON с одним полем на строку, поэтому он помещается в репозиторий, и git diff его читает.

$ bws snapshot diff before.json --live --exit-code
Changed (2):
  Spooler  Print Spooler
    startType: Manual -> Automatic
    status: Stopped -> Running  (running state, not configuration)
  wlidsvc  Microsoft Account Sign-in Assistant
    status: Stopped -> Running  (running state, not configuration)

Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
  • Конфигурация и состояние выполнения сообщаются раздельно. Два снимка с разницей в день различаются тем, что случайно работает, и почти ничто из этого не дрейф - строка, которую стоит читать, это изменившийся тип запуска.
  • То, что нельзя было сравнить, перечислено, а не скрыто. Поле, которое один снимок никогда не читал, выходит как not compared, поэтому сравнение, говорящее ничего не изменилось, означает, что ничего не изменилось в том, что видели обе стороны.
  • --exit-code завершается кодом 5, когда конфигурация отличается, так что запланированная задача может сделать снимок при развёртывании и позвать кого-нибудь в первую же ночь, когда машина ушла в дрейф.
  • Две машины, два файла. Сделайте снимок на тестовой среде и один на рабочей и сравните их где угодно.
Как работают снимки и дрейф
Ничего не происходит без плана

Предпросмотр - это и есть выполнение

Каждая операция, которая записывает, сначала строит план, и этот же план - предпросмотр, каскад зависимых служб, отказ до того, как вы что-либо нажмёте, командная строка, которая просит то же самое, и дорога назад потом.

$ bws stop Winmgmt --dry-run --dependents
Plan: stop Winmgmt  (2 steps)
  1. stop  vmms      (would break otherwise)
  2. stop  Winmgmt   (asked for)

Warnings:
  - Stopping Winmgmt also stops one other entry: vmms
  - Winmgmt starts automatically, so it will be back after the next restart.
  • Запустите без --dry-run, и это те самые шаги, в том же порядке, с теми же причинами рядом. Второго пути в коде для настоящего выполнения нет.
  • То, что падает вместе с ним, есть в плане. Службы, которые сломались бы, - отдельные шаги, а план, который обрушил бы то, что нужно машине, говорит об этом в предупреждениях.
  • Отказ приходит раньше кнопки. Драйвер, служба, остановку которой диспетчер не принимает, процесс, который система защищает - отказ при построении плана, с причиной. Окно делает кнопку серой и рядом говорит почему.
  • Принудительная остановка - это два шага, и второй условный. bws kill просит службу остановиться и завершает её процесс, только если это не сработало, называя каждую другую службу, которая в нём живёт.
Когда служба не останавливается
Две минуты с ним

Из командной строки

Тот же движок, что и в окне, для скриптов, запланированных задач и CI. Данные идут в стандартный вывод, а всё остальное в стандартный поток ошибок, поэтому bws list --json | jq работает, а предупреждение никогда не попадёт в ваш JSON.

bws list --query "start:auto !status:running"     что должно работать и не работает
bws list --query "file:missing"                   службы, чей исполняемый файл пропал
bws list --query "signed:no peruser:no"           неподписанные, без копий для каждого сеанса
bws show Spooler                                  всё, что известно об одной записи
bws stop Winmgmt --dry-run --dependents           что потянет за собой остановка
bws kill Spooler --dry-run                        что унесёт с собой завершение его процесса
bws start-type Spooler manual --dry-run           что даст снятие его с автозапуска
bws snapshot create before.json                   заморозить машину перед изменением
bws snapshot diff before.json --live --exit-code  что изменилось с тех пор, 5, если изменилась конфигурация
bws history Spooler                               кто изменил его тип запуска и когда
bws tool fix printer --dry-run                    что сделало бы быстрое исправление зависшего принтера
Каждая команда, параметр и код завершения
Получите его

Распакуйте и запустите или установите

Windows 10 1809 или Windows Server 2019 и новее, 64-разрядная. Архивам не нужен установщик, и они ничего не пишут в реестр, а для просмотра не нужны права администратора. Для любого изменения нужен сеанс с повышенными правами, и обе половины говорят об этом, а не молча отказывают - окно предлагает Restart as admin.

ФайлЧто это
BetterWindowsServices-win-x64.zipОкно, один автономный исполняемый файл - ставить .NET не нужно
bws-cli-win-x64.zipКомандная строка, один автономный исполняемый файл, для скриптов и CI
BetterWindowsServices-win-x64.msiУстановщик: обе программы для каждой учётной записи на машине, окно в меню «Пуск» и bws в PATH

Исполняемые файлы несут подпись Authenticode, поэтому Windows называет издателя, а не предупреждает о неизвестном.