コマンドライン リファレンス
bws バージョン 0.5.0 のすべてのコマンド、オプション、終了コード。権威あるものは bws --help で、そちらのほうが長くなります。このページは同じ内容を、読みやすく並べたものです。
コマンド
11 個のコマンドがあります。snapshot は名詞で、後ろに語が続きます。tool も名詞で、単独で実行するとツールの一覧を表示します。
bws list [--query TEXT] [--signatures] [--memory] [--required-by] [--follow-network] [--json] [--timing]
bws show NAME [--full] [--follow-network] [--json] [--timing]
bws stop|start|restart NAME [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
bws kill NAME [--force] [--restart] [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
bws start-type NAME automatic|delayed|manual|disabled [--stop] [--dry-run] [--json] [--timing]
bws snapshot create [FILE] [--note TEXT] [--follow-network] [--force] [--json] [--timing]
bws snapshot diff EARLIER LATER [--exit-code] [--json] [--timing]
bws snapshot diff EARLIER --live [--exit-code] [--json] [--timing]
bws history [NAME] [--json] [--timing]
bws tool
bws tool fix
bws tool fix NAME [--dry-run] [--timeout SECONDS] [--json] [--timing]
bws license [--components]
bws --help
bws --version
入力ミスのあるコマンドには、おそらく意図したものが提示され、頼んだものに近いことをする代わりに、コード 2 で終了します。
$ bws lst
There is no command lst. Did you mean list?
各コマンドの動作
list と show
list はマシン全体で、--query で絞り込みます。show は 1 つのエントリについてわかっているすべてを表示します。署名、特権、セキュリティ記述子、メモリはすべて毎回読み取られます。1 つのエントリなら約 60 ミリ秒で済むのに対し、マシン全体では 1 秒かかるためです。本当に空のフィールドは、--full を指定しない限り省かれます。誰も読み取れなかったフィールドは、省くと答えのように見えてしまうため、常に表示されます。
stop、start、restart
それぞれ、プランを作成して実行します。--dry-run はプランを表示するだけで何も変更しません。--dependents は、壊れるサービスを独立したステップとしてプランに含めます。--timeout は、1 つのステップが進捗なしで続けられる時間を指定します。ドライバーは、試行されずに拒否されます。カーネルドライバーの停止は、再起動なしには元に戻せないことが多いためです。
kill:止まらないサービスのために
サービスに停止を要求し、それがうまくいかない場合にのみその背後のプロセスを終了します。そのため、自力で停止するエントリが強制終了されることはありません。プロセスを終了すると、そのプロセスに存在するほかのすべてのサービスも、先に停止していたかどうかにかかわらず巻き込まれます。プレビューはそれらの名前を示し、プロセスを番号で示します。--force は丁寧なステップを省略し、プレビューには 2 つではなく 1 つのステップが表示されます。--restart は、あとですべてを元に戻します。
Windows は、この考え方を異なる形で表します。Stop-Service の --force は「何かが依存していても」を意味し、ここでは --dependents がそれにあたります。これが、stop のオプションではなく独立したコマンドになっている理由です。
start-type:動かすのではなく、設定
次回の起動時にマネージャーがエントリをどう扱うかを設定します。--stop がなければ何も動かしません。実行中のエントリは実行されたまま、停止中のものは停止したままで、プランもそう伝えます。disabled は立ち止まって考える価値があります。ほかの何かが必要としたときのオンデマンド開始を含めて、マネージャーがエントリを開始すること自体を止めるからです。delayed は自動で、ほかの自動のエントリより少しあとに開始されます。クエリで start:delayed が尋ねる語がこれです。Windows はロード順グループに属するエントリに対してこれを拒否し、プランは何かが起きる前にそのことを伝えます。4 つのいずれも、sc.exe と同様に、エントリが遅れて開始されるかどうかを書き込みます。--stop は disabled と組み合わせたときのみ使え、設定を書き込んだあと、同じプランの中でエントリを停止します。
snapshot create と snapshot diff
create は常に署名とハッシュを読み取ります。スナップショットは保存されてあとで比較されるため、それらがないものを、あるものと比較すると、マシンが変わったかのように見えてしまうからです。diff は、最初のファイルから 2 番目のファイルへ、または --live を付けてファイルからこのマシンへ、何が変わったかを示します。スナップショットのページに、形式と考え方があります。
history:誰が変更したか、System ログから
System ログから、スタートアップの種類の変更とインストールを新しい順に、Windows が記録したアカウントとともに表示します。最初の行は、ログがどこまでさかのぼるか、消去されたかどうかを示します。履歴はログの長さまでしか存在しないからです。名前を指定すると、そのサービスのスタートアップの種類の変更になります。インストールは、名前なしの場合のみ一覧に出ます。Windows はインストールを表示名で記録し、サービス名では記録しないためです。アカウントは、このマシンが自分で名前を解決できる場合はその名前で、できない場合は SID で表示されます。スタートアップの種類は、Windows が書いた言葉のまま表示されます。
tool:よくある問題への既製の答え
ウィンドウの Tools タブに表示されるのと同じツールです。bws tool はそれらを一覧表示し、bws tool fix はクイック修正を一覧表示します。printer、sound、indexing、search で、それぞれ 1 つの Windows サービスとそれに依存するものの再起動です。Microsoft 自身のトラブルシューティングのページが提案しているため選ばれました。bws tool fix printer は、まさに bws restart Spooler --dependents と同じです。同じプラン、同じ出力、同じ終了コードです。そして、ここにある何かを変更するすべてのコマンドと同じく、事前には確認しないため、実行前に確認するには --dry-run を使います。
license:ダウンロードしたファイルの中身
何も読み取りません。サービス マネージャーも、ディスクも、ネットワークも使わず、実行ファイルにコンパイルされた台帳から答えます。--components を付けると、通知がすべてのコンポーネントとそのバージョン、ライセンス、出所の一覧になります。ダウンロードの横で公開されている部品表と同じ内容です。どちらも 1 つの台帳から生成されるためで、これが価値のある理由です。プログラムは自己完結型の 1 つのファイルであり、スキャナーが読むものが隣にありません。
例
以下のプランは、このページが説明するプログラムに対して --dry-run で確認したものです。何かを変更するコマンドは事前に確認しないため、実行前に確認するには --dry-run を使います。Spooler は任意のサービスを表します。ご自身のサービスの名前に置き換えてください。
探して読む
bws list このマシン上のすべてのサービスとドライバー
bws list --query "start:auto !status:running" 起動しているはずなのに起動していないもの
bws list --query "status:running" --memory 実行中の各エントリのプロセスが使っているもの
bws show Spooler 1 つのエントリについてわかっているすべて
bws show Spooler --full 本当に空のフィールドも含める
まず見て、それから変更する
bws restart Spooler --dry-run プランだけで、ほかには何もしない
bws restart Spooler --dependents 依存するものとともに再起動する
bws stop Spooler --dependents --timeout 120 進捗なしで 1 ステップあたり 2 分まで許可する
bws start-type WSearch delayed --dry-run ほかの自動のエントリより少しあとに開始する
bws start-type Spooler disabled --stop 無効にして、同じプランで停止する
止まらないサービス
bws kill Spooler --dry-run プロセスと、そこで動いているすべてのサービス
bws kill Spooler --restart 停止に失敗した場合のみプロセスを終了し、そのあとすべてを元に戻す
bws kill Spooler --force --dry-run 2 ステップではなく 1 ステップ。プロセスはすぐに終了される
スナップショットとドリフト
bws snapshot create before.json --note "before the patch" メモを中に入れて、マシンを固定する
bws snapshot diff before.json after.json 2 つのファイル。2 日間、または 2 台のマシン
bws snapshot diff before.json --live ファイルを、現在のこのマシンと比較する
bws snapshot diff before.json --live --exit-code 同じ比較で、構成がドリフトしていれば 5 で終了する
誰が変更したか
bws history System ログにあるスタートアップの種類の変更とインストールのすべて
bws history Spooler 1 つのサービスのスタートアップの種類の変更
bws history --json 同じ内容をドキュメントとして。ログと変更を含む
クイック修正
bws tool あるツールの一覧
bws tool fix クイック修正と、それぞれの背後にあるサービス
bws tool fix sound --dry-run 2 つのオーディオ サービスを再起動するプラン
bws tool fix printer Print Spooler を、依存するものとともに再起動する
ファイルの中身
bws license --components すべてのコンポーネント、バージョン、ライセンス、出所
bws --version この実行ファイルのバージョン
PowerShell スクリプトで
# 起動しているはずなのに起動していないエントリを、オブジェクトとして
bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status
# 署名のないファイルを、スプレッドシートへ
bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation
# 1 つのサービスが必要とするもの
(bws show Spooler --json | ConvertFrom-Json).dependsOn
# 終了コードで分岐する夜間チェック
bws snapshot diff C:\baselines\web01.json --live --exit-code > $null
switch ($LASTEXITCODE) {
0 { 'no configuration drift' }
5 { 'the configuration drifted' }
default { "no clean answer, exit code $LASTEXITCODE" }
}
cmd とバッチファイルで
rem 最初のコマンドが正常に終了しなかった場合のみ、2 番目のコマンドを実行する
bws restart Spooler || echo the restart did not end cleanly
rem 遅延展開を有効にしたバッチファイルでは、! の前にキャレット(^)が必要
bws list --query "start:auto ^!status:running"
オプション
全部で 18 個あります。3 列目は、各オプションが属するコマンドです。使い道のないコマンドにオプションを渡すとエラーになり、その一覧が示されます。黙って無視されるフラグではありません。
| オプション | 動作 | 使える場所 |
|---|---|---|
--query | クエリ言語で一覧を絞り込みます。 | list |
--signatures | 各実行ファイルを誰が署名したか、Windows がそれを信頼しているかを読み取ります。マシン全体では数秒かかるため、頼まれない限りオフです。署名についてのクエリは、これを自動的にオンにします。 | list |
--memory | 実行中の各エントリのプロセスが使用しているものを読み取ります。設定ではなく計測値であり、1 秒後には異なるため、既定ではオフです。 | list |
--required-by | 1 つを停止すると壊れるエントリを読み取ります。各エントリが宣言している内容から推測するのではなく、Windows に直接尋ねます。エントリごとに 1 回の呼び出しが必要なので、頼まれない限りオフです。show と snapshot create は毎回これを読み取ります。 | list |
--follow-network | ツールがこのマシンの外に出ることを許可します。ほかの人の共有上にある起動パスと、このマシンにまだない証明書です。安全のため既定ではオフです。到達できない共有が 1 つあると 21 秒かかり、実行した人として認証されます。また、証明書の取得は、通常の一覧の途中で第三者に接続することです。これがない場合、署名はここにあるものに対して確認され、見なかったことが原因かもしれない結果は、判定ではなく読み取れなかったものとして報告されます。 | list, show, snapshot create |
--force | kill では、丁寧に尋ねずにすぐにプロセスを終了します。そのため、プレビューには 2 つではなく 1 つのステップが表示されます。snapshot create では、すでにあるスナップショットを置き換えます。スナップショットではないファイルが置き換えられることはありません。 | snapshot create, kill |
--restart | kill では、プロセスが消えたあとに、そのプロセスを共有していたすべてのものとともに、エントリを元に戻します。 | kill |
--stop | start-type で、かつ disabled と組み合わせたときのみ、設定を書き込んだあとに同じプランの中でエントリを停止します。スタートアップの種類は次回の起動を変えるだけで今は何も変えないので、これがないと、disabled に設定された実行中のエントリは実行され続けます。 | start-type |
--full | show では、本当に空のフィールドも表示します。誰も読み取れなかったフィールドは、どちらの場合も表示されます。 | show |
--json | 同じドキュメントを、機械可読な形で標準出力に出します。 | list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME |
--note | スナップショットを何のために取ったかを、ファイルの中に保持します。 | snapshot create |
--exit-code | 構成が異なる場合に、コード 5 で終了します。エントリが追加または削除された、または設定が異なるものがある場合です。実行状態だけでは数えません。既定ではオフです。差分の表示だけが目的のスクリプトが、差分を見つけたことでつまずかないようにするためです。 | snapshot diff |
--live | ファイルを、2 つ目のファイルではなく、現在のこのマシンと比較します。 | snapshot diff |
--timing | 読み取りの各部分にかかった時間を、標準エラーに出力します。 | list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME |
--dry-run | プランを表示するだけで、何も変更しません。実際の実行が行うのと同じプランです。実際の処理のための別のコード経路はありません。 | stop, start, restart, start-type, kill, tool fix NAME |
--dependents | 壊れるサービスを、独立したステップとしてプランに含めます。 | stop, restart, kill |
--timeout | 1 つのステップが、進捗なしで断念されるまでに続けられる時間です。サービスが進捗を報告するたびに数え直されます。指定しない場合は 60 秒です。進捗を報告し続けるサービスは、必要なだけ監視されます。時間切れは監視の終了であり、失敗ではなく、レポートはエントリがどこで止まったかを伝えます。 | stop, start, restart, kill, tool fix NAME |
--components | license では、通知を、この実行ファイルの中にあるすべてのコンポーネントとそのバージョン、ライセンス、出所に変えます。ダウンロードの横で公開されている部品表と同じ内容です。どちらも 1 つの台帳から生成されるためです。 | license |
終了コード
終わり方は 6 通りあり、それぞれがスクリプトにとって異なる意味を持ちます。データは標準出力に、それ以外はすべて標準エラーに出力されるので、bws list --json | jq が動作し、警告が JSON に混ざることはありません。
すべての JSON ドキュメントは純粋な ASCII です。ASCII 外の文字は 6 文字のエスケープとして書かれ、すべての JSON リーダーが元の文字に戻します。そのため、bws list --json > file.json は有効な UTF-8 になり、| ConvertFrom-Json は、コンソールがどのコードページに設定されていても正しく読み取ります。人が読むテキストでは、印字されずにターミナルを動かしてしまう文字(タブ、改行、エスケープシーケンス、方向の上書き)は、そのコードポイント <U+001B> として表示されます。
-- はオプションの終わりを示すので、ダッシュで始まる名前のサービスも指定できます。bws show -- -odd のようにします。ツールが提示するコマンドラインは PowerShell 向けに書かれています。スペースを含む名前は二重引用符で囲みます。cmd も同じように読みます。MSSQL$SQLEXPRESS のように、PowerShell が二重引用符の中で展開してしまう名前は、一重引用符で囲みます。
| コード | 意味 |
|---|---|
0 | 完了し、すべてが行き先に届きました。 |
1 | ツールが失敗しました。プランではなく、ツール自体に原因がある理由で、依頼されたことを実行できませんでした。 |
2 | コマンドラインが正しくありませんでした。入力ミスのあるコマンドには、おそらく意図したものが提示されます。 |
3 | プランは問題なく実行されましたが、その中の何かが行き先に届きませんでした。マネージャーが拒否したか、セッションに権限がありませんでした。 |
4 | 誰かが手動で実行を止めました。すべてのステップが届いていても 0 以外になるので、ラッパーが中断された実行を正常なものとして扱いません。 |
5 | 比較が実行され、構成がドリフトしていることがわかりました。エントリが追加または削除された、または設定が異なるものがあります。実行状態だけではドリフトではありません。--exit-code を付けたときのみです。ドリフトはこのツールが見つけるために存在するものであり、見つけることは失敗ではないからです。 |
Ctrl+C には 3 つのレベルがあり、それぞれが次のレベルの代償を示します。最初のものは先に進むのをやめ、取り外したものを元に戻します。2 番目は、そのままの状態にして、レポートを表示します。3 番目はプロセスを終了します。手動で止めた実行は、すべてのステップが到達していても 4 で終了します。
コンソール ウィンドウを閉じることは、最初の Ctrl+C として扱われます。その後、Windows はプログラムに 5 秒を与え、その間にこのプログラムは先に進むのをやめ、停止したものを元に戻します。サインアウトとシャットダウンは、対応できる予告なしに終了させ、切断されたリモートセッションもそうなることがあります。
スケジュールされたタスクで
このツールが想定している形です。マシンが正常だとわかっているときに固定し、そのあと毎晩、まだ正常かどうかを尋ねます。
# マシンが稼働を開始する日
bws snapshot create C:\baselines\web01.json --note "after the build"
# 毎晩、スケジュールされたタスクから
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
# 0 - 構成のドリフトなし
# 5 - 構成がドリフトした。drift.json に内容が書かれる
# 3 - 実行されたが、すべてを読み取れなかった。そのため答えは部分的
ウィンドウは、同じエンジンのもう半分です。BetterWindowsServices-win-x64.zip に入っていて、各アーカイブが何であるかはダウンロードのページに書かれています。
ウィンドウの引数
BetterWindowsServices.exe は、人が使うための引数を 1 つ受け付けます。--catalogue は、ウィンドウのすべてのコンポーネントをすべての状態で表示する開発者向けのシートを開き、マシンからは何も読み取りません。もう 1 つの --carry は、ウィンドウが表示していた内容を、管理者として再起動する自分自身のコピーに引き渡す方法です。誰も手で入力するものではなく、そのウィンドウが書けるはずのないものが含まれていれば拒否されます。