クエリ言語

マシンに質問する

ウィンドウの検索ボックスでも 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,startPending停止中または開始中のまま止まっているもの。スナップインが表示し、終わることのない待機です。
start:auto status:stopped trigger:none自動開始に設定され、停止していて、トリガーを待っていないもの。再起動のあとに読む価値のある短い一覧です。
start:delayed自動ですが、ほかの自動のエントリより少しあとに開始されます。
start:manual,disabled status:running起動時に何も開始しないのに実行中のもの。何かが要求した、トリガーが開始した、または誰かが開始しました。

アカウント

クエリ見つかるもの
account:localsystem !publisher:microsoftLocalSystem、最も強力なアカウントで実行されていて、Microsoft が署名していないファイルのもの。発行元についてのクエリは署名を自動的に読み取るため、数秒かかります。
!account:localsystem,localservice,networkservice type:ownProcess,sharedProcessそれ以外のアカウントで実行されているサービス。仮想アカウント、管理されたアカウント、または個人のアカウントです。
account:"NT SERVICE"サービス独自の仮想アカウントです。スペースがあるため、引用符で単語をまとめています。

ファイルと署名

クエリ見つかるもの
signed:notSigned,untrustedRoot,tampered署名なし、Windows が信頼しないチェーン、または署名後に変更されたファイル。
signed:trusted !publisher:microsoft署名済みで、信頼されていて、Microsoft のものではない。他社がこのマシンに入れたソフトウェアです。
type:driver start:boot,system !signed:trustedWindows の起動時に読み込まれるドライバーで、署名を 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:SpoolerPrint Spooler の実行に必要なすべてのものと、それらが順に必要とするものです。

特権とプロセス

クエリ見つかるもの
privilege:SeTcbPrivilegeオペレーティング システムの一部として動作することを要求します。
privilege:SeImpersonatePrivilege !account:localsystemLocalSystem 以外のアカウントで実行されながら、クライアントの代わりに動作できます。
sidtype:unrestrictedプロセスに独自のサービス SID を持つため、アクセス許可でそのサービスだけを名前で指定できます。sidtype:restricted は、さらにプロセスが書き込み制限されているものについて尋ねます。
type:sharedProcess status:running共有 svchost の中で、ほかのサービスとともに実行されています。
memory:>200MB200 MB を超えて使用しているプロセスです。クエリが尋ねると、メモリは自動的に読み取られます。
pid:1000-2000ID が 1000 から 2000 の間のプロセスで動いています。

名前とテキスト

クエリ見つかるもの
spool単語だけのクエリで、名前、表示名、アカウント、起動パスの中から検索されます。
name:=wuauservこの名前だけで、単に含むだけのものは含みません。
name:win*win で始まる名前で、ワイルドカードで書いています。
name:/svc$/svc で終わる名前で、正規表現で書いています。
description:none説明が全くないもの。ほとんどのドライバーがこれです。
description:?Windows が渡せなかった説明。たいていは、存在しない言語ファイルを指しているためです。
peruser:templateWindows が、サインインしているセッションごとにコピーするユーザーごとのテンプレートです。

すべてのフィールド

プログラム自体から生成しているため、この表がツールの受け付ける内容からずれることはありません。値の一覧がないフィールドは、テキスト、数値、またはサイズを受け付けます。どれかは 3 列目に書かれています。

フィールド尋ねる内容値
nameサービス名。Windows が識別に使うものテキスト
display表示名。この Windows での表記テキスト
descriptionエントリが自分自身について述べていることテキスト
typeエントリの種類driver, kernelDriver, fileSystemDriver, ownProcess, sharedProcess, unknown
peruserWindows がセッションごとにコピーを作る、ユーザーごとのファミリーの 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 のファイルを残します。

コマンドライン リファレンス