查詢語言

向電腦提問

一種語言,既用於視窗的搜尋框,也用於 bws list --query。單獨一個詞會在名稱、顯示名稱、帳戶和啟動路徑中搜尋。加上欄位則縮小範圍。共有 21 個欄位,相同的文字在工具的兩部分中含義相同。

六個能回答實際問題的查詢

應該執行卻沒有執行的內容

start:auto !status:running

大多數人寫的第一個查詢,也是 services.msc 完全無法回答的查詢。

檔案已遺失的服務

file:missing

指向磁碟上不存在的可執行檔的項目。通常是解除安裝後遺留了登錄資訊。

未簽章,去掉工作階段雜訊

signed:no peruser:no

依使用者的服務族會為每個工作階段產生一個副本,讓清單裡充滿近似重複的項目。這個查詢詢問的是其餘的部分。

已停用卻仍在執行

mismatch:running

組態與狀態不一致:一個被服務管理員設為永不啟動的項目,卻仍在執行。

任何要求偵錯權限的內容

privilege:SeDebugPrivilege

一種讓處理程序能夠開啟任何其他處理程序的特殊權限。值得知道哪些服務要求了它。

工具無法讀取的內容

account:?

此工作階段無法讀取其帳戶的項目。這是 services.msc 連問都問不出的問題。

如何撰寫查詢

搜尋詞

  • 搜尋詞以空格分隔,並且必須全部符合:沒有 and 關鍵字,因為它不可能有別的含義。
  • 同一個欄位寫兩次是唯一的例外:status:running status:stopped 表示二者之一,因為勾選兩個篩選項目時寫出的就是這個。對數字的兩個邊界仍然會縮小範圍: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 之外的字元:波蘭語或希臘語的顯示名稱,無論怎麼輸入都能比對。

每個欄位都接受的三個詞

  • 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:microsoft以最強的帳戶 LocalSystem 執行,且來自 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:trusted在 Windows 啟動時載入、而 Windows 不信任其簽章的驅動程式。在健康的電腦上應為零。
!path:C:\Windows type:ownProcess有獨立處理程序、其檔案位於 Windows 資料夾之外的服務。
path:\AppData\從某人的使用者設定檔內部啟動:最不應該出現服務的地方。
path:\System32\\ type:ownProcess空格前的反斜線會讓空格成為詞的一部分,所以當後面還有其他搜尋詞時,以反斜線結尾的路徑要寫兩個反斜線。在查詢末尾,一個就夠了。

觸發程序與相依性

查詢找到的內容
trigger:device status:stopped等待裝置到達,因此是有原因的已停止。
trigger:network當要求到達某個網路端點(連接埠、具名管道或 RPC 介面)時啟動。
trigger:stop觸發程序不僅可以啟動、也可以停止的項目。
dependson:Winmgmt需要 WMI 才能執行的項目。
requiredby:SpoolerPrint 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:templateWindows 為每個已登入工作階段複製的依使用者範本。

每個欄位

由程式本身產生,因此這張表不會與工具接受的內容脫節。沒有值清單的欄位接受文字、數字或大小:第三欄會說明是哪一種。

欄位詢問的內容值
name服務名稱,即 Windows 用來識別它的那個名稱文字
display顯示名稱,依這台 Windows 的寫法文字
description項目對自身的描述文字
type這是哪一類項目driver, kernelDriver, fileSystemDriver, ownProcess, sharedProcess, unknown
peruser它是否屬於 Windows 為每個工作階段產生副本的依使用者服務族之一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
signedWindows 對檔案簽章的判斷,不檢查撤銷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

兩件值得知道的事

有些欄位開銷很大,查詢它們會自動開啟讀取

在整台電腦上讀取簽章需要幾秒鐘,而記憶體是一項測量而不是一項設定,所以除非被要求,否則都不會為清單讀取它們。提到其中任何一項的查詢會自動開啟這項讀取:你不必在 signed:no 之外再記著加 --signatures。在視窗中,關於簽章的查詢會說明在簽章到達之前答案並不完整,而不是展示一份較短的清單、彷彿那就是答案。

基於無法讀取內容得出的結果會明說

如果項目是依據此工作階段無法讀取的欄位來判斷的,結果會帶有一行說明有多少個,因為這樣的結果可能缺少項目,或者包含了不該有的項目。這與整個工具遵守的規則相同:讀取失敗會在答案中可見,絕不會被吞掉。如果發行者僅由憑證宣稱,也會得到同樣的處理:在任何非 trusted 的判定旁邊,名稱會顯示為 not verified,而 publisher: 會在單獨一行中把該項目計為不確定,所以 !publisher:microsoft 會保留某個在簽章後被人變更過的 Microsoft 檔案。

命令列參考