Windows のサービスを検索し、変更を実行前にプレビューし、昨日から何がドリフトしたかを確認する
Better Windows Services は、Windows マシンを管理する人のために作り直した services.msc です。ウィンドウとコマンドラインが、同じエンジンの上で動きます。800 行をスクロールする代わりに、マシンに質問してください。何かを押す前に、変更で何が起きるかを確認できます。そして services.msc にはなかった機能があります。すべてのサービスをファイルに固定し、1 週間後に何が変わったかを尋ねられます。
- 無料でオープンソース、GPL-3.0
- 1 つのファイル、またはインストーラー
- 見るだけなら管理者権限は不要
- インターネットには一切接続しません
bws の行。プログラムは英語で表示されます。ウィンドウは隣に置かれた言語ファイルを読み込むため、再ビルドなしで翻訳できます。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。
昨日から何が変わったか
スナップショットは、ある時点のマシン全体です。すべてのサービスとドライバーについて、スタートアップの種類、アカウント、起動パス、ファイルのハッシュと署名者、依存関係、トリガー、特権、セキュリティ記述子が含まれます。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はサービスに停止を要求し、それがうまくいかない場合にのみプロセスを終了します。そのプロセスに存在するほかのサービスはすべて名前が示されます。
コマンドラインから
スクリプト、スケジュールされたタスク、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 は不明な発行元として警告せず、発行元の名前を表示します。


