這題的重點在後半部。
我知道如何提取所有服務的清單以及如何過濾它們的狀態。但是,我不確定如何提取服務設定為「運作方式」的使用者帳戶。
我無法選擇使用 PowerShell(不幸的是),所以我正在尋找一種本機 CMD 方式。我假設有一種方法可以使用 sc 查詢命令,但列出的只是:
SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT
僅供參考 - 作業系統是 WIndows 2003 SP2,我需要所有服務的這些信息,因此如果我必須為每個服務手動執行此操作,那麼這是一個冗長的過程。
答案1
wmic:
所有服務的名稱和帳戶:
wmic service get name,startname
僅啟動服務:
wmic service where started=true get name, startname
名稱中具有特定模式的服務:
wmic service where 'name like "%sql%"' get name, startname
很好地格式化為 html 表(然後在瀏覽器中開啟):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html
完整語法在這裡:https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx
答案2
您可以透過兩個步驟完成此操作:
- 取得服務清單:
sc \\localhost query | findstr SERVICE_NAME
- 您缺少的部分:
sc \\localhost qc
+ SERVICE_NAME +| findstr SERVICE_START_NAME
我會推薦這樣的批次腳本:
@echo off
setlocal EnableDelayedExpansion
sc \\localhost query | findstr SERVICE_NAME > services.lst
for /f "tokens=1,2" %%A in (services.lst) do (
echo %%B
sc \\localhost qc %%B | findstr SERVICE_START_NAME
)
del services.lst
這會給你這樣的輸出:
當然,您可以進一步清理該輸出或以您想要的任何方式寫入 CSV 檔案。
答案3
CMD 沒有本地方法可以做到這一點。 SC 和 NET 是 Windows 隨附的內建應用程序,但這並不意味著它們是本機的。管理員可以隨時刪除它們,然後甚至 CMD 也被蒙在鼓裡。
sc sdshow 將為您提供安全描述符,但如果您不知道如何讀取 SDDL 字串,這將使事情變得複雜。
最簡單的方法是從 Tools 套件中取得 Sysinternals PsService.exe 並將其用作 psservice 安全性 [服務]。它將以可讀格式列出 SDDL,包括帳戶名稱。
答案4
雖然您無法使用 PowerShell,但您仍然應該能夠使用 VBScript 從 WMI 中提取資訊:
下面是一個 VBS 腳本,它將列出所有服務以及它們啟動的帳戶:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service")
For Each objService in colServices
wscript.echo objService.Name & ": " & objService.StartName
Next
儲存它,然後使用 運行它cscript ScriptName.vbs
。
objService.State
將為您提供服務的當前狀態(因為您提到您希望透過它進行過濾)。
更多資訊關於Win32_Service 類別。