Wie extrahiere ich eine Liste von Diensten UND unter welchem ​​Konto werden sie ausgeführt?

13

Der Schwerpunkt dieser Frage liegt auf der zweiten Hälfte.

Ich weiß, wie man eine Liste aller Dienste extrahiert und nach ihrem Status filtert. Ich bin mir jedoch nicht sicher, wie ich das Benutzerkonto extrahieren soll, für das der Dienst auf "Ausführen als" eingestellt ist.

Ich habe (leider) keine Möglichkeit, PowerShell zu verwenden, daher suche ich nach einem nativen CMD-Weg. Ich nahm an, dass es eine Möglichkeit geben würde, den Befehl sc query zu verwenden, aber alles, was aufgelistet wird, ist:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

Zu Ihrer Information - Das Betriebssystem ist Windows 2003 SP2, und ich benötige diese Informationen für alle Dienste. Dies ist ein langwieriger Prozess, wenn ich ihn für jeden von ihnen manuell ausführen muss.

Petay87
quelle

Antworten:

20

wmic:
Name und Konto für alle Dienste:
wmic service get name,startname

Nur Dienste gestartet:
wmic service where started=true get name, startname

Dienstleistungen mit einem bestimmten Muster im Namen:
wmic service where 'name like "%sql%"' get name, startname

schön als HTML-Tabelle formatiert (und dann in Ihrem Browser geöffnet):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

Vollständige Syntax hier: https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

wmz
quelle
Was ist der Unterschied zwischen sc queryund wmic?
Pacerier
1
@ Pacerier Unterschied in Bezug auf was? Es handelt sich lediglich um verschiedene Tools (cmd-Zeile), mit denen Sie Dienste abfragen / mit ihnen interagieren können. sc ist nur für diesen Zweck gedacht, während wmic allgemeiner ist (da es ermöglicht, verschiedene Teile des Systems abzufragen). wmic ist auch einfacher für dieses spezielle Problem zu verwenden (nur eine Abfrage)
wmz
5

Sie können dies in zwei Schritten erreichen:

  1. Holen Sie sich die Liste der Dienste:sc \\localhost query | findstr SERVICE_NAME
  2. Dein fehlendes Stück: sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

Ich würde ein Batch-Skript wie dieses empfehlen:

@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

Das gibt Ihnen eine Ausgabe wie folgt: Geben Sie hier die Bildbeschreibung ein

Natürlich können Sie diese Ausgabe weiter bereinigen oder in eine CSV-Datei schreiben, wie Sie möchten.

Armani
quelle
1

CMD hat keine native Möglichkeit, dies zu tun. SC und NET sind integrierte Anwendungen, die mit Windows geliefert werden. Dies bedeutet jedoch nicht, dass sie nativ sind. Ein Administrator kann sie jederzeit entfernen und selbst CMD bleibt im Dunkeln.

Mit sc sdshow erhalten Sie Sicherheitsbeschreibungen. Dies erschwert jedoch die Arbeit, wenn Sie nicht wissen, wie SDDL-Zeichenfolgen gelesen werden.

Am einfachsten ist es, Sysinternals PsService.exe aus dem Tools-Paket abzurufen und als psservice security [service] zu verwenden. Die SDDL wird in lesbarem Format einschließlich der Kontonamen aufgelistet.

JasonXA
quelle
Was meinst du mit "keine native Art, es zu tun"? Ist es nicht C:\Windows\System32\sc.exefür alle Windows-Versionen geeignet?
Pacerier
Lies erneut. Eingebaut bedeutet nicht entfernbar wie CMD. Wenn ein Administrator PowerShell deaktiviert, kann er auch sc und net deaktivieren. Am einfachsten ist es, eine tragbare App zu verwenden, die standardmäßig alles erledigt und nicht an das Betriebssystem gebunden ist.
JasonXA
1

Obwohl Sie PowerShell nicht verwenden können, sollten Sie dennoch VBScript verwenden können, um die Informationen aus WMI abzurufen:

Hier ist ein VBS-Skript, das alle Dienste und das Konto auflistet, als das sie beginnen:

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

Speichern Sie es und führen Sie es dann mit aus cscript ScriptName.vbs.

objService.State würde Ihnen den aktuellen Status des Dienstes geben (da Sie erwähnt haben, dass Sie danach filtern möchten).

Weitere Informationen zur Win32_Service-Klasse .

Ƭᴇcʜιᴇ007
quelle