Windows-Dienste durchsuchen, jede Änderung vorab ansehen und sehen, was seit gestern abgedriftet ist

Better Windows Services ist services.msc, neu gebaut für alle, die Windows-Rechner administrieren - ein Fenster und eine Befehlszeile über einer gemeinsamen Engine. Stellen Sie dem Rechner eine Frage, statt achthundert Zeilen zu durchblättern. Sehen Sie, was eine Änderung bewirkt, bevor Sie irgendetwas bestätigen. Und das, was services.msc nie hatte: jeden Dienst in eine Datei einfrieren und eine Woche später fragen, was sich geändert hat.

  • Kostenlos und quelloffen, GPL-3.0
  • Eine Datei oder ein Installer
  • Zum Ansehen keine Administratorrechte
  • Kein Kontakt zum Internet
Das Fenster mit fünf ausgewählten Einträgen und dem Plan zu ihrem Start über der Liste: fünf Schritte, ein Hinweis, dass zwei davon bereits in diesem Zustand sind, eine bws-start-Zeile für jeden Eintrag und die Schaltfläche Start 5 entries.
Ausgewählte Einträge, ein Plan, der vor jeder Änderung angezeigt wird, und die bws-Zeile, die genau dasselbe verlangt. Das Programm spricht Englisch - das Fenster liest eine Sprachdatei, die daneben liegt, sodass eine Übersetzung ohne Neubau möglich ist.
Eine halbe Minute damit

So sieht es im Einsatz aus

Eine echte Sitzung auf einem auf Polnisch installierten Windows - die Anzeigenamen kommen von Windows, deshalb stehen sie in dessen Sprache. Das Fenster selbst spricht Englisch.

Vier ausgewählte Einträge und der Plan zu ihrem Start, ein erzwungener Neustart des Local Session Manager, dessen Plan warnt, dass der Rechner ohne ihn nicht funktioniert, und vor dem die Schaltfläche erst nach Eingabe seines Namens arbeitet, die Fragen zum Einstieg unter dem leeren Suchfeld sowie der Druckerspooler, der durch Eintippen eines Teils seines Namens gefunden und gestartet wird.
Vier ausgewählte Einträge und der Plan zu ihrem Start, ein erzwungener Neustart, der den Namen eines Dienstes verlangt, den der Rechner braucht, die Fragen unter einem leeren Suchfeld und der Druckerspooler, der durch Eintippen gefunden und gestartet wird.
Der Startbildschirm: drei Karten mit Zahlen zu diesem Rechner - laufende Dienste, automatisch startende Dienste, die nicht hochgekommen sind, und automatisch startende Dienste, deren Datei fehlt - sowie eine Schaltfläche Show the list.
Es öffnet sich mit einigen Zahlen zu diesem Rechner. Jede ist eine Frage - ein Klick, und die Frage landet im Suchfeld.
Die Liste der Dienste mit den drei Listen über dem Suchfeld, einem leeren Suchfeld, den in Reihen geöffneten Filterschaltflächen für Zustand, Starttyp, Signatur, Abweichungen und Trigger und der Liste darunter.
Die Filterschaltflächen schreiben in das Suchfeld, sodass das, worauf Sie geklickt haben, eine Abfrage ist, die Sie lesen und bearbeiten können.
Warum es das gibt

services.msc hat sich seit Windows 2000 kaum verändert

Administratoren verbringen damit pro Woche Stunden und stoßen immer wieder an dieselben Wände.

  • Keine Suche. Navigiert wird nur durch den Sprung zum ersten Buchstaben eines Anzeigenamens.
  • Kein Filtern. Es gibt keine Möglichkeit zu fragen: Zeige mir, was automatisch starten soll und nicht läuft.
  • Eine Zeile nach der anderen. Zwölf Dienste neu zu starten heißt zwölf Rechtsklicks und zwölf Wartezeiten.
  • "Wird beendet..." für immer, und der einzige Ausweg ist der Task-Manager samt Raten, welcher Prozess es ist.
  • Kein Verlauf. Niemand weiß, wer diesen Starttyp auf Deaktiviert gesetzt hat und wann.
  • Verborgene Daten. Prozess, Trigger, Privilegien, Sicherheitsdeskriptor, wer die Programmdatei signiert hat - für alles braucht man sc.exe aus dem Kopf oder die Registrierung.
  • Keine Gleichwertigkeit auf der Befehlszeile. sc.exe hat eine Syntax aus den Neunzigern, und das Get-Service, das mit Windows in Windows PowerShell 5.1 kommt, zeigt weder das Konto, unter dem ein Dienst läuft, noch gar seine Beschreibung. PowerShell 7 zeigt beides und wird separat installiert.

Die anderen Werkzeuge lösen jeweils nur einen Teil

Process Hacker und System Informer zeigen eine reichhaltige Liste und können einen Prozess hart beenden, haben aber weder Audit noch Befehlszeile. sc.exe und PsService können alles und sagen nichts. Die *-Service-Cmdlets von PowerShell sind skriptfähig und oberflächlich.

Niemand verbindet eine durchsuchbare Liste, eine Vorschau vor jeder Änderung und ein Protokoll dessen, was sich im Lauf der Zeit geändert hat - und das Protokoll ist der Grund, dieses Werkzeug nach dem ersten Nachmittag auf einem Rechner zu behalten.

Der vollständige Vergleich
Was es kann

Ein Fenster und eine Befehlszeile über einer gemeinsamen Engine

Fragen, statt scrollen

start:auto !status:running heißt was laufen sollte und nicht läuft. Eine Sprache, im Suchfeld und in bws list --query, mit den Feldern als Vorschlag während der Eingabe.

Den Plan zeigen, bevor etwas passiert

Jedes Beenden, Starten, Neustarten und jede Änderung des Starttyps wird samt den Diensten, die dabei mit heruntergehen, vorab angezeigt, und die Vorschau ist das, was ausgeführt wird.

Sagen, was abgedriftet ist und wer es geändert hat

bws snapshot create friert den Rechner in eine Datei ein, und bws snapshot diff sagt, was sich seither geändert hat, die Konfiguration getrennt von dem, was nur gestartet oder beendet wurde. bws history sagt anhand des Systemprotokolls, wer einen Starttyp geändert und wer einen Dienst installiert hat. Das Fenster erledigt alle drei unter Audit....

Ein häufiges Problem mit einem Klick beheben

Der Reiter Tools und bws tool fix starten den Dienst hinter einem Drucker, der nicht druckt, einem verschwundenen Ton oder einer hängenden Suche samt allem, was davon abhängt, über denselben Plan wie alles andere neu.

Einen Dienst beenden, der sich nicht beenden lässt

Es fragt zuerst höflich und beendet den Prozess nur, wenn das fehlschlägt, und nennt dabei jeden anderen Dienst, der in ihm lebt.

Zeigen, was services.msc verbirgt

Wer die Programmdatei signiert hat und ob Windows ihr vertraut, Trigger, Privilegien, den Sicherheitsdeskriptor, den Prozess und seinen Speicher. Als Spalten und als Kriterien für die Suche.

Sagen, wenn es etwas nicht lesen konnte

Ein Feld, das es nicht lesen konnte, wird als nicht gelesen gemeldet und nie als leer angezeigt. Ein Snapshot ohne Administratorrechte sagt das in der Datei selbst.

In Skripte passen

--json bei jedem Befehl, ein Exit-Code für jedes Ende und 5, wenn ein Vergleich Drift findet.

Aus einer Datei laufen, offline

Entpacken und starten oder für den ganzen Rechner installieren. Kein .NET zu installieren, und es nimmt nie Kontakt zum Internet auf. Zum Lesen sind keine Administratorrechte nötig. GPL-3.0.

Das, was services.msc nie konnte

Was sich seit gestern geändert hat

Ein Snapshot ist der ganze Rechner in einem Augenblick - jeder Dienst und jeder Treiber mit Starttyp, Konto, Startpfad, Hash und Signierer seiner Datei, Abhängigkeiten, Triggern, Privilegien und Sicherheitsdeskriptor. Er ist JSON mit einem Feld pro Zeile, sodass er in ein Repository passt und git diff ihn lesen kann.

$ bws snapshot diff before.json --live --exit-code
Changed (2):
  Spooler  Print Spooler
    startType: Manual -> Automatic
    status: Stopped -> Running  (running state, not configuration)
  wlidsvc  Microsoft Account Sign-in Assistant
    status: Stopped -> Running  (running state, not configuration)

Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
  • Konfiguration und Laufzustand werden getrennt gemeldet. Zwei Snapshots im Abstand eines Tages unterscheiden sich darin, was gerade läuft, und fast nichts davon ist Drift - die Zeile mit dem geänderten Starttyp ist die, die man lesen muss.
  • Was sich nicht vergleichen ließ, wird aufgelistet und nicht versteckt. Ein Feld, das ein Snapshot nie gelesen hat, erscheint als not compared, sodass ein Vergleich, der nichts hat sich geändert sagt, bedeutet: nichts hat sich in dem geändert, was beide Seiten sehen konnten.
  • --exit-code endet mit 5, wenn sich die Konfiguration unterscheidet, sodass eine geplante Aufgabe bei der Bereitstellung einen Snapshot machen und in der ersten Nacht, in der der Rechner abdriftet, jemanden alarmieren kann.
  • Zwei Rechner, zwei Dateien. Machen Sie einen Snapshot auf dem Staging- und einen auf dem Produktivsystem und vergleichen Sie sie irgendwo.
Wie Snapshots und Drift funktionieren
Ohne Plan geschieht nichts

Die Vorschau ist die Ausführung

Jede schreibende Operation baut zuerst einen Plan, und derselbe Plan ist die Vorschau, die Kaskade der abhängigen Dienste, die Ablehnung, bevor Sie etwas bestätigen, die Befehlszeile, die dasselbe verlangt, und der Weg zurück danach.

$ bws stop Winmgmt --dry-run --dependents
Plan: stop Winmgmt  (2 steps)
  1. stop  vmms      (would break otherwise)
  2. stop  Winmgmt   (asked for)

Warnings:
  - Stopping Winmgmt also stops one other entry: vmms
  - Winmgmt starts automatically, so it will be back after the next restart.
  • Führen Sie es ohne --dry-run aus, und das sind die Schritte, in dieser Reihenfolge, mit denselben Gründen daneben. Es gibt keinen zweiten Codepfad für den Ernstfall.
  • Was mit heruntergeht, steht im Plan. Die Dienste, die ausfallen würden, sind eigene Schritte, und ein Plan, der etwas stilllegen würde, das der Rechner braucht, sagt das in seinen Warnungen.
  • Eine Ablehnung kommt vor der Schaltfläche. Ein Treiber, ein Dienst, für den der Manager kein Beenden annimmt, ein Prozess, den das System schützt - abgelehnt, wenn der Plan gebaut wird, mit Begründung. Das Fenster graut die Schaltfläche aus und nennt daneben den Grund.
  • Erzwungenes Beenden hat zwei Schritte, und der zweite ist bedingt. bws kill bittet den Dienst, sich zu beenden, und beendet seinen Prozess nur, wenn das nicht klappt, und nennt dabei jeden anderen Dienst, der in ihm lebt.
Wenn sich ein Dienst nicht beenden lässt
Zwei Minuten damit

Von der Befehlszeile

Dieselbe Engine wie das Fenster, für Skripte, geplante Aufgaben und CI. Daten gehen auf die Standardausgabe und alles andere auf die Standardfehlerausgabe, sodass bws list --json | jq funktioniert und eine Warnung nie in Ihrem JSON landet.

bws list --query "start:auto !status:running"     was laufen sollte und nicht läuft
bws list --query "file:missing"                   Dienste, deren Programmdatei fehlt
bws list --query "signed:no peruser:no"           unsigniert, ohne die Kopien pro Sitzung
bws show Spooler                                  alles, was über einen Eintrag bekannt ist
bws stop Winmgmt --dry-run --dependents           was das Beenden mit herunterreißen würde
bws kill Spooler --dry-run                        was das Beenden seines Prozesses mitnehmen würde
bws start-type Spooler manual --dry-run           was es bewirken würde, ihn von automatisch zu nehmen
bws snapshot create before.json                   den Rechner vor einer Änderung einfrieren
bws snapshot diff before.json --live --exit-code  was sich seither geändert hat, 5 bei geänderter Konfiguration
bws history Spooler                               wer seinen Starttyp geändert hat und wann
bws tool fix printer --dry-run                    was die Schnellreparatur für einen hängenden Drucker täte
Jeder Befehl, jeder Schalter, jeder Exit-Code
Beschaffen

Entpacken und starten oder installieren

Windows 10 1809 oder Windows Server 2019 und neuer, 64 Bit. Die Archive brauchen keinen Installer und schreiben nichts in die Registrierung, und zum Ansehen sind keine Administratorrechte nötig. Zum Ändern braucht es eine Sitzung mit erhöhten Rechten, und beide Hälften sagen das, statt still zu scheitern - das Fenster bietet Restart as admin an.

DateiWas es ist
BetterWindowsServices-win-x64.zipDas Fenster, eine eigenständige ausführbare Datei - kein .NET zu installieren
bws-cli-win-x64.zipDie Befehlszeile, eine eigenständige ausführbare Datei, für Skripte und CI
BetterWindowsServices-win-x64.msiDer Installer: beide Programme für jedes Konto auf dem Rechner, das Fenster im Startmenü und bws im PATH

Die ausführbaren Dateien tragen eine Authenticode-Signatur, sodass Windows den Herausgeber nennt, statt vor einem unbekannten zu warnen.