指南
sc.exe 與 Get-Service,以及這個工具
兩者都已經在電腦上,而且都會繼續有用。這個頁面講的是它們在哪裡到頭了,並且坦率地說明它們在哪些地方仍然是更好的答案。
各自在哪裡到頭
sc.exe
它幾乎可以觸及服務控制管理員所知的一切,卻完全不告訴你該如何提問。語法來自九〇年代:sc config X start= auto,等號後面的空格是必需的,缺少它會悄無聲息地做不成你想做的事。
它一次只回答一個項目。沒有篩選,沒有無需自己寫剖析器就能讓指令碼剖析的輸出,也沒有預覽:sc stop 要麼成功,要麼傳回一個數字。
Get-Service 和 *-Service cmdlet
真正的物件、管線,以及淺層的視角。在 Windows 內建的 Windows PowerShell 5.1 中,Get-Service 不顯示服務執行所用的帳戶,也不顯示它的描述。PowerShell 7 兩者都顯示,還顯示啟動路徑,並且需要另外安裝。
Stop-Service -Force 的意思是「即使有東西依賴它」:它會停止相依項目,並且是在事後而不是事前告訴你。
同樣的問題,三種方式
| 問題 | 用電腦上現有的工具 | 在這裡 |
|---|---|---|
| 應該執行卻沒有執行的內容 | 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 不一致時,那在這裡就是一個缺陷。測試套件的一部分會針對所在的電腦同時執行兩者,並逐項目地比較,而兩者之間的差異,是你能放進問題回報裡最有用的東西。
何時繼續使用你已有的工具
- 你在一台只會碰一次的電腦上。兩者都已經在那裡了,也不必通過任何原則。
- 你需要變更帳戶、啟動路徑或復原動作。
sc.exe三者都能做。這個工具會顯示帳戶和啟動路徑,但不會變更其中任何一個,而讀取復原動作只是為了在結束處理程序之前發出警告。 - 你需要建立或刪除服務。
sc create和sc delete。這裡沒有,這是有意為之。 - 你已經深入 PowerShell 管線。
bws list --json透過ConvertFrom-Json以物件的形式回來,所以它是加入管線,而不是取代管線。
是配合,而不是取代
回答這台電腦出了什麼問題的工具,與變更某一項設定的工具,不是同一個工具。在這裡提問,在這裡閱讀計畫,然後用你喜歡的任何方式去執行它:計畫會列印出要求同一件事的命令列,而這一行就是用來複製的。