マシンに質問する
ウィンドウの検索ボックスでも bws list --query でも、同じ 1 つの言語を使います。単語だけを書くと、名前、表示名、アカウント、起動パスを検索します。フィールドを付けると絞り込めます。フィールドは 21 個あり、同じテキストはツールのどちらの側でも同じ意味になります。
実際の質問に答える 6 つ
起動しているはずなのに起動していないもの
start:auto !status:running
ほとんどの人が最初に書くクエリで、services.msc では全く答えられないものです。
ファイルがなくなったサービス
file:missing
ディスク上にない実行ファイルを指しているエントリです。たいていは、登録が残ったままアンインストールされたものです。
署名なし。セッションごとのノイズを除く
signed:no peruser:no
ユーザーごとのファミリーはセッションごとにコピーを作り、似たエントリで一覧が埋まります。このクエリは、それ以外について尋ねます。
無効なのに実行中
mismatch:running
構成と状態が食い違っている場合です。マネージャーが決して開始しないように設定されたエントリが、それでも実行されています。
デバッグ権限を要求するもの
privilege:SeDebugPrivilege
プロセスがほかのあらゆるプロセスを開けるようになる特権です。どのサービスが要求しているかを知っておく価値があります。
ツールが読み取れなかったもの
account:?
このセッションがアカウントを読み取れなかったエントリです。services.msc には尋ねることすらできない質問です。
クエリの書き方
用語
- 用語はスペースで区切り、すべてが一致する必要があります。
andというキーワードはありません。ほかの意味になりようがないからです。 - 同じフィールドを 2 回書く場合だけが例外です。
status:running status:stoppedはどちらか一方を意味します。2 つのフィルターにチェックを入れたときに書かれるのが、これだからです。数値の 2 つの境界は、引き続き絞り込みになります。pid:>1000 pid:<2000は、その間の範囲です。 - 用語の前の
!は否定です。!status:runningのように書きます。setlocal EnableDelayedExpansionを指定したバッチファイルでは、cmd がこの!を何の断りもなく消してしまい、クエリは静かに別の意味になります。その場合は引用符の中で^!と書いてください。 - フィールド内のカンマはまたはを意味します。
start:manual,disabledのように使います。 - スペースやコロンを含むものは、引用符で保護します。
account:"NT SERVICE\McmSvc"のようにします。 C:\Windows\System32\svchost.exeのようにそのまま貼り付けたパスは、C というフィールドとしては読まれず、検索されます。
テキストの照合方法
name:spoolは、それを含むものすべてに一致します。検索ボックスに人が期待する動作なので、これが既定です。name:=spoolerは完全一致です。name:spool*はワイルドカード*と?を使えます。name:/^Sql.*/は正規表現で、スラッシュの中は正規表現の書き方どおりに書きます。\?、\\、カンマは、そこでの意味になります。閉じられないスラッシュはエラーです。スラッシュ自体を検索するには、\/と書くか、引用符を使います。- 大文字と小文字は区別されず、ASCII 以外でも同様です。ポーランド語やギリシャ語の表示名も、どのように入力しても一致します。
すべてのフィールドが受け付ける 3 つの語
any- 値があること。その内容は問いませんnone- 本当に値がないこと。エントリに値がありません?- ツールがこのフィールドを読み取れなかったこと、または読み取っていないこと。services.mscには尋ねることすらできない質問です
入力ミスのある値は、空の結果ではなくエラーになります。status:runing には Did you mean running? と応答し、コード 2 で終了します。空の一覧は答えのように見えてしまいますが、「一致するものがない」と「入力が間違っている」の違いは、きれいなマシンと何も証明していない監査との違いです。何も絞り込まないクエリはコマンドラインでも拒否されるので、入力ミスのせいでスクリプトがマシン全体を操作することはありません。
さらに例
どれも、ウィンドウの検索ボックスでも bws list --query の後でも同じように動作し、ここに書く前に実際の Windows で実行しています。何が見つかるかはマシンによって異なります。そして、問題についての質問では、空の答えが最も望ましい答えです。
状態とスタートアップの種類
| クエリ | 見つかるもの |
|---|---|
status:stopPending, | 停止中または開始中のまま止まっているもの。スナップインが表示し、終わることのない待機です。 |
start:auto status:stopped trigger:none | 自動開始に設定され、停止していて、トリガーを待っていないもの。再起動のあとに読む価値のある短い一覧です。 |
start:delayed | 自動ですが、ほかの自動のエントリより少しあとに開始されます。 |
start:manual, | 起動時に何も開始しないのに実行中のもの。何かが要求した、トリガーが開始した、または誰かが開始しました。 |
アカウント
| クエリ | 見つかるもの |
|---|---|
account:localsystem !publisher:microsoft | LocalSystem、最も強力なアカウントで実行されていて、Microsoft が署名していないファイルのもの。発行元についてのクエリは署名を自動的に読み取るため、数秒かかります。 |
!account:localsystem, | それ以外のアカウントで実行されているサービス。仮想アカウント、管理されたアカウント、または個人のアカウントです。 |
account:"NT SERVICE" | サービス独自の仮想アカウントです。スペースがあるため、引用符で単語をまとめています。 |
ファイルと署名
| クエリ | 見つかるもの |
|---|---|
signed:notSigned, | 署名なし、Windows が信頼しないチェーン、または署名後に変更されたファイル。 |
signed:trusted !publisher:microsoft | 署名済みで、信頼されていて、Microsoft のものではない。他社がこのマシンに入れたソフトウェアです。 |
type:driver start:boot, | Windows の起動時に読み込まれるドライバーで、署名を Windows が信頼していないもの。健全なマシンでは 0 件です。 |
!path:C:\Windows type:ownProcess | 独自のプロセスを持つサービスで、ファイルが Windows フォルダーの外にあるもの。 |
path:\AppData\ | 誰かのプロファイルの中から起動されているもの。サービスがあるとは最も予想されない場所です。 |
path:\System32\\ type:ownProcess | スペースの前のバックスラッシュは、そのスペースを単語の一部にします。そのため、バックスラッシュで終わるパスの後に別の用語が続く場合は、バックスラッシュを 2 つ書きます。クエリの末尾では 1 つで足ります。 |
トリガーと依存関係
| クエリ | 見つかるもの |
|---|---|
trigger:device status:stopped | デバイスの接続を待っているため、理由があって停止しています。 |
trigger:network | ネットワークのエンドポイント(ポート、名前付きパイプ、RPC インターフェイス)に要求が届くと開始されます。 |
trigger:stop | トリガーが開始するだけでなく、停止もできるエントリです。 |
dependson:Winmgmt | 実行に WMI を必要とするエントリです。 |
requiredby:Spooler | Print Spooler の実行に必要なすべてのものと、それらが順に必要とするものです。 |
特権とプロセス
| クエリ | 見つかるもの |
|---|---|
privilege:SeTcbPrivilege | オペレーティング システムの一部として動作することを要求します。 |
privilege:SeImpersonatePrivilege !account:localsystem | LocalSystem 以外のアカウントで実行されながら、クライアントの代わりに動作できます。 |
sidtype:unrestricted | プロセスに独自のサービス SID を持つため、アクセス許可でそのサービスだけを名前で指定できます。sidtype:restricted は、さらにプロセスが書き込み制限されているものについて尋ねます。 |
type:sharedProcess status:running | 共有 svchost の中で、ほかのサービスとともに実行されています。 |
memory:>200MB | 200 MB を超えて使用しているプロセスです。クエリが尋ねると、メモリは自動的に読み取られます。 |
pid:1000-2000 | ID が 1000 から 2000 の間のプロセスで動いています。 |
名前とテキスト
| クエリ | 見つかるもの |
|---|---|
spool | 単語だけのクエリで、名前、表示名、アカウント、起動パスの中から検索されます。 |
name:=wuauserv | この名前だけで、単に含むだけのものは含みません。 |
name:win* | win で始まる名前で、ワイルドカードで書いています。 |
name:/svc$/ | svc で終わる名前で、正規表現で書いています。 |
description:none | 説明が全くないもの。ほとんどのドライバーがこれです。 |
description:? | Windows が渡せなかった説明。たいていは、存在しない言語ファイルを指しているためです。 |
peruser:template | Windows が、サインインしているセッションごとにコピーするユーザーごとのテンプレートです。 |
すべてのフィールド
プログラム自体から生成しているため、この表がツールの受け付ける内容からずれることはありません。値の一覧がないフィールドは、テキスト、数値、またはサイズを受け付けます。どれかは 3 列目に書かれています。
| フィールド | 尋ねる内容 | 値 |
|---|---|---|
name | サービス名。Windows が識別に使うもの | テキスト |
display | 表示名。この Windows での表記 | テキスト |
description | エントリが自分自身について述べていること | テキスト |
type | エントリの種類 | driver, kernelDriver, fileSystemDriver, ownProcess, sharedProcess, unknown |
peruser | Windows がセッションごとにコピーを作る、ユーザーごとのファミリーの 1 つかどうか | yes, no, template, instance |
status | 今、何をしているか | running, stopped, paused, pending, startPending, stopPending, pausePending, continuePending, unknown |
start | 次回の起動時に、マネージャーがどう扱うか | automatic, auto, delayed, manual, disabled, boot, system, unknown |
account | 実行しているアカウント。マネージャーでの表記 | テキスト(例: localsystem) |
pid | 実行されているプロセス | 数値: 1234、>1000、100-200 |
trigger | 開始または停止する条件 | device, ip, domain, firewall, policy, network, custom, state, aggregate, unknown, start, stop |
path | マネージャーが起動するコマンドライン | テキスト |
file | 実行するファイルがディスク上にあるかどうか | present, missing |
signed | ファイルの署名について Windows が判断していること。失効の確認は行いません | yes, no, trusted, notSigned, untrustedRoot, expired, revoked, tampered, unknown |
publisher | ファイルに署名した人。信頼された署名によってのみ証明されます | テキスト |
privilege | エントリが要求する特権 | テキスト(例: SeDebugPrivilege) |
dependson | これが必要とするもの | サービス名 |
requiredby | これが停止すると壊れるもの | サービス名 |
sidtype | サービス SID の種類 | unrestricted, restricted, unknown |
sddl | セキュリティ記述子のテキスト表現 | テキスト |
memory | そのプロセスが使用しているもの | 単位付きのサイズ: 500MB、>1GB、100MB-1GB |
mismatch | 食い違っている構成と状態 | stopped, running |
知っておく価値のある 2 つのこと
高コストなフィールドがあり、尋ねると読み取りが有効になります
署名はマシン全体で数秒かかり、メモリは設定ではなく計測値であるため、頼まれない限り、一覧のためには読み取られません。そのどちらかに触れるクエリは、その読み取りを自動的に有効にします。signed:no に加えて --signatures を覚えておく必要はありません。ウィンドウでは、署名についてのクエリは、署名が届くまで答えが不完全であることを伝え、短い一覧をあたかも答えであるかのように見せることはしません。
読み取れなかったものに基づく結果は、そのことを伝えます
読み取れなかったフィールドに基づいてエントリを判定した場合、結果にはその数を示す行が付きます。そのような結果では、エントリが足りない、または含まれるべきでないものが入っている可能性があるからです。これはツール全体が守っている規則と同じです。読み取りの失敗は答えの中で見え、黙って捨てられることは決してありません。証明書だけが主張している発行元にも、同じ扱いをします。trusted 以外の判定の横では、名前は not verified と表示され、publisher: はそのエントリを不確かなものとして別の行で数えます。そのため !publisher:microsoft は、署名後に誰かが変更した Microsoft のファイルを残します。