向電腦提問
一種語言,既用於視窗的搜尋框,也用於 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, | 卡在停止或啟動中:管理單元顯示、永遠不會結束的等待。 |
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 不信任其簽章的驅動程式。在健康的電腦上應為零。 |
!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: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 為每個已登入工作階段複製的依使用者範本。 |
每個欄位
由程式本身產生,因此這張表不會與工具接受的內容脫節。沒有值清單的欄位接受文字、數字或大小:第三欄會說明是哪一種。
| 欄位 | 詢問的內容 | 值 |
|---|---|---|
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 |
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 |
兩件值得知道的事
有些欄位開銷很大,查詢它們會自動開啟讀取
在整台電腦上讀取簽章需要幾秒鐘,而記憶體是一項測量而不是一項設定,所以除非被要求,否則都不會為清單讀取它們。提到其中任何一項的查詢會自動開啟這項讀取:你不必在 signed:no 之外再記著加 --signatures。在視窗中,關於簽章的查詢會說明在簽章到達之前答案並不完整,而不是展示一份較短的清單、彷彿那就是答案。
基於無法讀取內容得出的結果會明說
如果項目是依據此工作階段無法讀取的欄位來判斷的,結果會帶有一行說明有多少個,因為這樣的結果可能缺少項目,或者包含了不該有的項目。這與整個工具遵守的規則相同:讀取失敗會在答案中可見,絕不會被吞掉。如果發行者僅由憑證宣稱,也會得到同樣的處理:在任何非 trusted 的判定旁邊,名稱會顯示為 not verified,而 publisher: 會在單獨一行中把該項目計為不確定,所以 !publisher:microsoft 會保留某個在簽章後被人變更過的 Microsoft 檔案。