如何提取服務清單以及它們以什麼帳戶運行?

如何提取服務清單以及它們以什麼帳戶運行?

這題的重點在後半部。

我知道如何提取所有服務的清單以及如何過濾它們的狀態。但是,我不確定如何提取服務設定為「運作方式」的使用者帳戶。

我無法選擇使用 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

您可以透過兩個步驟完成此操作:

  1. 取得服務清單:sc \\localhost query | findstr SERVICE_NAME
  2. 您缺少的部分: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 類別

相關內容