Windows のサービスを検索し、変更を実行前にプレビューし、昨日から何がドリフトしたかを確認する

Better Windows Services は、Windows マシンを管理する人のために作り直した services.msc です。ウィンドウとコマンドラインが、同じエンジンの上で動きます。800 行をスクロールする代わりに、マシンに質問してください。何かを押す前に、変更で何が起きるかを確認できます。そして services.msc にはなかった機能があります。すべてのサービスをファイルに固定し、1 週間後に何が変わったかを尋ねられます。

  • 無料でオープンソース、GPL-3.0
  • 1 つのファイル、またはインストーラー
  • 見るだけなら管理者権限は不要
  • インターネットには一切接続しません
5 つのエントリを選択し、リストの上にそれらを開始するプランが表示されたウィンドウ。5 つのステップ、そのうち 2 つはすでにその状態であるという注記、各エントリ用の bws start 行、Start 5 entries ボタンがあります。
選択されたエントリ、何かが起きる前に表示されるプラン、そして全く同じことを要求する bws の行。プログラムは英語で表示されます。ウィンドウは隣に置かれた言語ファイルを読み込むため、再ビルドなしで翻訳できます。
30 秒で見る

実際に使うとこうなります

ポーランド語でインストールされた Windows での実際のセッションです。表示名は Windows から取得するため、その言語で表示されます。ウィンドウ自体は英語です。

4 つのエントリを選択してそれらを開始するプラン。Local Session Manager の強制再起動では、プランが「これがないとマシンは動作しない」と警告し、ボタンが有効になる前にその名前の入力を求めます。空の検索ボックスの下にある最初の質問。名前の一部を入力して見つかった Print Spooler が開始されます。
4 つのエントリを選択してそれらを開始するプラン、マシンに必要なサービスの名前を尋ねる強制再起動、空の検索ボックスの下の質問、そして入力して見つけ、開始した Print Spooler。
最初の画面。このマシンについての数字が書かれた 3 枚のカード(実行中のサービス、自動開始に設定されているのに起動しなかったサービス、自動開始に設定されているのにファイルがなくなったサービス)と、Show the list ボタン。
最初に、このマシンについての数字がいくつか表示されます。それぞれが質問になっていて、クリックするとその質問が検索ボックスに入ります。
検索ボックスの上に 3 つのリストがあるサービス一覧。空の検索ボックス、状態、スタートアップの種類、署名、不一致、トリガーごとの行に展開されたフィルターボタン、その下の一覧。
フィルターボタンは検索ボックスに書き込むので、クリックした内容は読んで編集できるクエリになります。
なぜ作ったのか

services.msc は Windows 2000 からほとんど変わっていません

管理者は毎週何時間もこれを使い、同じ壁にぶつかっています。

  • 検索がありません。操作できるのは、表示名の最初の文字へジャンプすることだけです。
  • 絞り込みがありません。自動開始に設定されているのに実行されていないものを表示してと尋ねる方法がありません。
  • 1 行ずつしか操作できません。12 個のサービスを再起動するには、右クリックを 12 回、待機を 12 回繰り返します。
  • 「Stopping...」のまま戻らない。逃げ道は、タスク マネージャーとプロセスの推測だけです。
  • 履歴がありません。誰がいつスタートアップの種類を Disabled にしたのか、誰にもわかりません。
  • 隠れたデータ。プロセス、トリガー、特権、セキュリティ記述子、実行ファイルの署名者。これらすべてに、記憶に頼った sc.exe かレジストリが必要です。
  • コマンドラインが同等ではありません。sc.exe の構文は 1990 年代のものです。Windows に付属する Windows PowerShell 5.1 の Get-Service は、サービスを実行しているアカウントを表示せず、説明も表示しません。PowerShell 7 はどちらも表示しますが、別途インストールが必要です。

ほかのツールは、それぞれ一部だけを解決します

Process Hacker と System Informer は豊富な一覧を表示し、強制終了もできますが、監査機能もコマンドラインもありません。sc.exe と PsService は何でもできますが、何も教えてくれません。PowerShell の *-Service コマンドレットはスクリプトで使えますが、浅い情報しか得られません。

検索できる一覧、すべての変更の前のプレビュー、時間をかけた変更の記録を組み合わせたものはありません。そして最初の 1 日が過ぎてもこのツールをマシンに置いておく理由は、この記録です。

詳しい比較
できること

ウィンドウとコマンドラインが、同じエンジンの上で動きます

スクロールではなく、質問する

start:auto !status:running は起動しているはずなのに起動していないものです。検索ボックスでも bws list --query でも同じ言語で、入力中にフィールドが候補として表示されます。

何かが起きる前にプランを表示する

停止、開始、再起動、スタートアップの種類の変更はすべて、巻き込まれるサービスとともに事前にプレビューされ、プレビューがそのまま実行されます。

何がドリフトしたか、誰が変更したかを伝える

bws snapshot create はマシンをファイルに固定し、bws snapshot diff はその後に何が変わったかを、単に開始や停止をしただけのものとは分けて構成として示します。bws history は System ログから、誰がスタートアップの種類を変更し、誰がサービスをインストールしたかを示します。ウィンドウでは、この 3 つすべてを Audit... から実行できます。

よくある問題を 1 回の操作で修正する

Tools タブと bws tool fix は、印刷されないプリンター、出なくなった音、止まった検索の裏にあるサービスを、それに依存するものとともに、ほかの操作と同じプランで再起動します。

止まらないサービスを止める

最初は丁寧に停止を要求し、それが失敗した場合にのみプロセスを終了します。同じプロセスに存在するほかのサービスはすべて名前が示されます。

services.msc が隠しているものを表示する

実行ファイルを誰が署名したか、Windows がそれを信頼しているか、トリガー、特権、セキュリティ記述子、プロセスとそのメモリ。列として表示でき、検索条件にもできます。

読み取れなかったときに伝える

読み取れなかったフィールドは、空ではなく読み取れなかったものとして報告されます。管理者権限なしで取得したスナップショットには、ファイルの中にそのことが記録されます。

スクリプトに組み込める

すべてのコマンドで --json、終了のたびに終了コード、差分でドリフトが見つかったときは 5。

1 つのファイルからオフラインで動かす

展開して実行するか、マシン全体にインストールします。.NET のインストールは不要で、インターネットには一切接続しません。読み取りに管理者権限は不要です。GPL-3.0。

services.msc にはなかった機能

昨日から何が変わったか

スナップショットは、ある時点のマシン全体です。すべてのサービスとドライバーについて、スタートアップの種類、アカウント、起動パス、ファイルのハッシュと署名者、依存関係、トリガー、特権、セキュリティ記述子が含まれます。1 行に 1 フィールドの 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.
  • 構成と実行状態は分けて報告されます。1 日あけて取得した 2 つのスナップショットは、たまたま実行されているものが異なるだけで、そのほとんどはドリフトではありません。読むべき行は、変更されたスタートアップの種類です。
  • 比較できなかったものは、隠さず一覧に出ます。片方のスナップショットが一度も読み取っていないフィールドは not compared と表示されます。したがって、何も変わっていないと示す差分は、両方が見られた範囲で何も変わっていないという意味です。
  • --exit-code は、構成が異なる場合に 5 で終了します。そのため、スケジュールされたタスクがデプロイ時にスナップショットを取り、マシンがドリフトした最初の夜に誰かを呼び出せます。
  • 2 台のマシン、2 つのファイル。ステージング環境と本番環境でそれぞれスナップショットを取り、どこでも比較できます。
スナップショットとドリフトの仕組み
プランなしでは何も起きません

プレビューが、そのまま実行です

書き込みを行う操作はすべて、最初にプランを作ります。同じプランが、プレビュー、依存サービスへの連鎖、何かを押す前の拒否、同じことを要求するコマンドライン、そして実行後に元へ戻す方法になります。

$ 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 を外して実行すると、それがそのままのステップです。同じ順序で、同じ理由が横に表示されます。実際の実行のための別のコード経路はありません。
  • 一緒に停止するものがプランに含まれます。壊れるサービスはそれぞれ独立したステップになり、マシンに必要なものを停止してしまうプランは、警告でそう伝えます。
  • 拒否はボタンより前に来ます。ドライバー、マネージャーが停止を受け付けないサービス、システムが保護しているプロセスは、プランを作る時点で理由とともに拒否されます。ウィンドウではボタンがグレーになり、その横に理由が表示されます。
  • 強制停止は 2 つのステップで、2 つ目は条件付きです。bws kill はサービスに停止を要求し、それがうまくいかない場合にのみプロセスを終了します。そのプロセスに存在するほかのサービスはすべて名前が示されます。
サービスが止まらないとき
2 分で試す

コマンドラインから

スクリプト、スケジュールされたタスク、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                                  1 つのエントリについてわかっているすべて
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ウィンドウです。1 つの自己完結型の実行ファイルで、.NET のインストールは不要です
bws-cli-win-x64.zipコマンドラインです。スクリプトと CI のための、1 つの自己完結型の実行ファイルです
BetterWindowsServices-win-x64.msiインストーラーです。マシン上のすべてのアカウント向けに両方のプログラムをインストールし、ウィンドウをスタート メニューに、bws を PATH に追加します

実行ファイルには Authenticode 署名があるため、Windows は不明な発行元として警告せず、発行元の名前を表示します。