ガイド

sc.exe、Get-Service、そしてこれ

どちらもすでにマシンにあり、どちらも引き続き役に立ちます。このページは、それらがどこで限界になるかについてです。そして、どこでそれらが今も優れた答えなのかを、率直に述べます。

それぞれの限界

sc.exe

サービス コントロール マネージャーが知っているほとんどすべてに手が届きますが、どう尋ねればいいかは何も教えてくれません。構文は 1990 年代のものです。sc config X start= auto のように、等号の後ろのスペースが必須で、それがないと、意図したことを行わずに黙って失敗します。

一度に 1 つのエントリについてしか答えません。絞り込みはなく、パーサーを書かずにスクリプトが解析できる出力もなく、プレビューもありません。sc stop は、成功するか、数字を返すかのどちらかです。

Get-Service と *-Service コマンドレット

きちんとしたオブジェクト、パイプライン、そして浅い視点です。Windows に付属する Windows PowerShell 5.1 の Get-Service は、サービスを実行しているアカウントも説明も表示しません。PowerShell 7 はどちらも表示し、起動パスも表示しますが、別途インストールが必要です。

Stop-Service -Force は「何かが依存していても」を意味します。依存するサービスを停止し、そのことを事前ではなく事後に伝えます。

同じ質問を、3 つの方法で

質問マシンにあるものでここでは
起動しているはずなのに起動していないもの Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } bws list --query "start:auto !status:running"
署名のない実行ファイルを持つサービスはどれか 各起動パスを読み取り、解決し、それぞれに Get-AuthenticodeSignature を呼び出す。コマンドではなくスクリプトです bws list --query "signed:no"
これを停止すると何が巻き込まれるか sc enumdepend X、そのあと一覧を読んで自分で判断する bws stop X --dry-run --dependents、つまり実行されるプランです
先週から何が変わったか 自分でコレクターを書かない限り、何もありません bws snapshot diff before.json --live
誰がいつスタートアップの種類を変更したか Get-WinEvent -FilterHashtable @{ LogName = 'System'; Id = 7040 }、そのあと各イベントのメッセージを読む bws history Spooler。最初の行に、ログがどこまでさかのぼるかが書かれます
機械可読な出力 PowerShell ではオブジェクト、sc.exe ではテキスト すべてのコマンドで --json。標準出力に出て、警告は標準エラーに出ます

サービスについてこのツールが sc.exe と食い違う場合、それはここのバグです。テストスイートの一部が、実行しているマシンに対して両方を実行し、エントリごとに比較しています。2 つの違いは、課題に貼り付けるものとして最も役に立ちます。

今あるものを使い続けたほうがよい場合

  • 1 回しか触らないマシンにいる。どちらもすでにそこにあり、ポリシーを通す必要がありません。
  • アカウント、起動パス、回復のアクションを変更する必要がある。sc.exe は 3 つとも行えます。このツールはアカウントと起動パスを表示しますが、どちらも変更しません。回復のアクションは、プロセスを終了する前に警告するためだけに読み取ります。
  • サービスを作成または削除する必要がある。sc create と sc delete。ここにはありません。意図的です。
  • すでに PowerShell のパイプラインの深いところにいる。bws list --json は ConvertFrom-Json を通してオブジェクトとして戻るため、パイプラインを置き換えるのではなく、そこに加わります。

置き換えではなく、併用

このマシンの何がおかしいのかに答えるツールと、1 つの設定を変更するツールは、同じツールではありません。質問はここで行い、プランはここで読み、実行にはお好きなものを使ってください。プランは同じことを要求するコマンドラインを表示します。その行はコピーするためのものです。