Jak wyodrębnić listę usług ORAZ z jakiego konta korzystają?

13

To pytanie kładzie nacisk na drugą połowę.

Wiem, jak wyodrębnić listę wszystkich usług i jak filtrować według ich stanu. Jednak nie jestem pewien, jak to zrobić, aby wyodrębnić konto użytkownika, usługa jest ustawiona jako „uruchom jako”.

Nie mam opcji korzystania z PowerShell (niestety), więc szukam natywnego sposobu CMD. Zakładałem, że będzie sposób na użycie polecenia sc query, ale wszystkie te listy to:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

Do Twojej wiadomości - OS to Windows 2003 SP2 i potrzebuję tych informacji dla wszystkich usług, więc jest to długi proces, jeśli muszę to zrobić ręcznie dla każdej z nich.

Petay87
źródło

Odpowiedzi:

20

wmic:
nazwa i konto dla wszystkich usług:
wmic service get name,startname

uruchomione tylko usługi:
wmic service where started=true get name, startname

usługi o określonym wzorze w nazwie:
wmic service where 'name like "%sql%"' get name, startname

ładnie sformatowane jako tabela HTML (a następnie otwarte w przeglądarce):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

Pełna składnia tutaj: https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

wmz
źródło
Jaka jest różnica między sc queryi wmic?
Pacerier
1
@Pacerier Różnica w odniesieniu do czego? Są to po prostu różne (linia cmd) narzędzia pozwalające na zapytania / interakcję z usługami; sc służy tylko do tego celu, podczas gdy wmic jest bardziej ogólny (ponieważ umożliwia odpytywanie różnych części systemu). Wmic jest również łatwiejszy w użyciu dla tego konkretnego problemu (tylko jedno zapytanie)
wmz
5

Możesz to zrobić w dwóch krokach:

  1. Uzyskaj listę usług:sc \\localhost query | findstr SERVICE_NAME
  2. Twój brakujący element: sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

Poleciłbym taki skrypt wsadowy:

@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

To daje takie wyjście: wprowadź opis zdjęcia tutaj

Oczywiście możesz dalej wyczyścić to wyjście lub zapisać do pliku CSV w dowolny sposób.

Armani
źródło
1

CMD nie ma na to własnego sposobu. SC i NET to wbudowane aplikacje, które są dostarczane z systemem Windows, ale to nie znaczy, że są natywne. W każdej chwili administrator może je usunąć, a nawet nawet CMD pozostaje w ciemności.

sc sdshow dostarczy ci deskryptorów bezpieczeństwa, ale skomplikuje to wszystko, jeśli nie wiesz, jak czytać ciągi SDDL.

Najprostszym sposobem jest pobranie Sysinternals PsService.exe z pakietu Narzędzia i użycie go jako zabezpieczenia usługi [usługa]. Wyświetli listę SDDL w czytelnym formacie, w tym nazwy kont.

JasonXA
źródło
Co rozumiesz przez „brak rodzimego sposobu na to”? Czy to nie C:\Windows\System32\sc.exedotyczy wszystkich wersji systemu Windows?
Pacerier
Przeczytaj ponownie. Wbudowany oznacza nieusuwalny jak CMD. Jeśli administrator wyłączy PowerShell, może również wyłączyć sc i net. Najprostszym sposobem jest użycie przenośnej aplikacji, która domyślnie wykonuje wszystkie czynności i nie jest powiązana z systemem operacyjnym.
JasonXA
1

Chociaż nie możesz używać programu PowerShell, nadal powinieneś być w stanie używać VBScript do pobierania informacji z WMI:

Oto skrypt VBS, który wyświetli listę wszystkich usług i konta, które uruchamiają jako:

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

Zapisz, a następnie uruchom cscript ScriptName.vbs.

objService.State poda ci aktualny stan usługi (ponieważ wspomniałeś, że chcesz go filtrować).

Więcej informacji na temat klasy Win32_Service .

Ƭᴇcʜιᴇ007
źródło