Шукайте серед служб 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 називає видавця, а не попереджає про невідомого.