指南

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 以物件的形式回來,所以它是加入管線,而不是取代管線。

是配合,而不是取代

回答這台電腦出了什麼問題的工具,與變更某一項設定的工具,不是同一個工具。在這裡提問,在這裡閱讀計畫,然後用你喜歡的任何方式去執行它:計畫會列印出要求同一件事的命令列,而這一行就是用來複製的。