So führen Sie PowerShell-Skripte (*.PS1) als Windows-Dienst aus

Sie möchten also ein PowerShell-Skript als Windows-Hintergrunddienst ausführen, der beim Serverstart automatisch startet? Das ist etwas knifflig, da Windows dafür keine einfache Lösung bietet, insbesondere bei Skripten, die kontinuierlich laufen müssen. Die sicherste Methode ist die Verwendung von Tools wie NSSM (Non-Sucking Service Manager), die dies vereinfachen und zuverlässiger machen. Die Verwendung der Tools srvany.exeaus instsrv.exedem Windows Server 2003 Resource Kit ist zwar möglich, aber veraltet und unzuverlässig – sie verwalten den Skriptstatus nicht optimal, insbesondere bei Abstürzen oder Hängern. NSSM hingegen ist sehr zuverlässig und sorgt für einen reibungslosen Skriptablauf, selbst bei unerwarteten Abstürzen.

Zunächst müssen Sie NSSM installieren. Falls Sie es nicht manuell herunterladen und installieren möchten, können Sie dies über Chocolatey tun. Der Haken dabei: Zuerst müssen Sie Chocolatey installieren, das sich hervorragend zur Paketverwaltung unter Windows eignet. Führen Sie folgenden Befehl in PowerShell mit Administratorrechten aus:

Set-ExecutionPolicy Bypass -Scope Process -Force; iwr -UseBasicParsing -Uri "https://chocolatey.org/install.ps1" | iex

Sobald dies erledigt ist, installieren Sie NSSM mit:

choco install nssm

Nach der Installation von NSSM können Sie den Dienst erstellen. Angenommen, Sie haben ein PowerShell-Skript, das eine Active Directory-Gruppe in Echtzeit überprüft und Benachrichtigungen oder E-Mails versendet. Das Skript sollte beispielsweise unter einem bestimmten Ort gespeichert werden C:\ps\CheckADGroup\checkad.ps1. Nun benötigt dieses Skript eine kleine Schleife, um kontinuierlich ausgeführt zu werden – etwa so:

while($true) { # Your code here; e.g., Monitor-ADGroup; Start-Sleep -Seconds 60 }

Das ist zwar nicht narrensicher, aber für schnelle Einrichtungsvorgänge ausreichend. Alternativ könnte man den Aufgabenplaner verwenden, doch die Nutzung als Dienst ist eleganter, wenn Echtzeit-Reaktionsfähigkeit erforderlich ist – insbesondere, wenn manuelle Starts und Stopps vermieden werden sollen.

So richten Sie ein PowerShell-Skript als Dienst mit NSSM ein

Methode: Erstellen eines Dienstes direkt aus PowerShell

Das ist zwar etwas umständlich, funktioniert aber, sobald die Syntax stimmt. Im Prinzip weisen Sie NSSM an, powershell.exeIhr Skript als Argument auszuführen. Hier ist ein Beispiel:

$NSSMPath = (Get-Command "C:\Program Files\nssm\nssm.exe").Source $NewServiceName = "CheckADGroup" $PoShPath = (Get-Command powershell).Source $PoShScriptPath = "C:\ps\CheckADGroup\checkad.ps1" $args = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $PoShScriptPath # Install the service & $NSSMPath install $NewServiceName $PoShPath $args # Optional: set a description & $NSSMPath set $NewServiceName description "Monitoring of AD group changes" 

Ersetzen Sie die Pfade und den Dienstnamen entsprechend. Stellen Sie sicher, dass der Skriptpfad korrekt ist und Ihr Skript über die erforderlichen Berechtigungen verfügt.

Dienst starten und Status prüfen

Nach der Installation starten Sie Ihren Dienst mit:

Start-Service $NewServiceName

Und prüfen Sie, ob es läuft:

Get-Service $NewServiceName

Der Dienst sollte als „Wird ausgeführt“ angezeigt werden. Schauen Sie außerdem in services.msc nach Ihrem Dienst – er sollte dort aufgeführt sein und, falls gewünscht, automatisch starten. Wenn der Dienst ausgeführt wird, befindet sich Ihr Skript innerhalb von nssm.exe, das die gesamte Verwaltung übernimmt – quasi als Babysitter für Ihr Skript.

Es ist wichtig zu beachten, dass dieser Dienst standardmäßig unter dem SYSTEM-Konto ausgeführt wird. Benötigt Ihr Skript, wie beispielsweise meines mit Get-ADGroupMember, Zugriff auf Active Directory oder andere Module, stellen Sie sicher, dass das Konto über ausreichende Berechtigungen verfügt. Alternativ können Sie den Dienst auch unter einem Domänenbenutzer oder einem gMSA ausführen lassen, was die Sicherheit und Zugriffskontrolle verbessert.

Wenn Benachrichtigungen in der Benutzersitzung angezeigt werden sollen, aktivieren Sie die Option „ Dienst darf mit dem Desktop interagieren“ im Anmelde- Tab des Dienstes. Achtung: In neueren Windows-Versionen wie Windows 10 oder Serverversionen ab 1803 ist diese Funktion praktisch nicht mehr verfügbar – der Dienst „Interaktive Diensterkennung“ ist nicht mehr vorhanden, und Benachrichtigungen vom System werden nicht mehr angezeigt. Falls Benutzerbenachrichtigungen wichtig sind, müssen Sie möglicherweise auf andere Methoden zurückgreifen.

Um Ihren Dienst später aufzuräumen oder zu entfernen, verwenden Sie schließlich Folgendes:

nssm remove CheckADGroup

oder über PowerShell:

sc delete CheckADGroup

Das sollte die Grundlagen abdecken. Bei manchen Konfigurationen kann es etwas knifflig werden, daher wundern Sie sich nicht, wenn Sie Berechtigungen oder Pfade anpassen müssen. Es kann etwas dauern, bis der Dienst in Ihrer Umgebung korrekt läuft, aber sobald er eingerichtet ist, läuft er im Hintergrund und bewältigt zuverlässig alle anfallenden Aufgaben.

Zusammenfassung

  • Installieren Sie NSSM, entweder manuell oder über Chocolatey.
  • Erstellen Sie ein PowerShell-Skript mit einer Schleife zur kontinuierlichen Überwachung.
  • Verwenden Sie NSSM, um dieses Skript als Windows-Dienst zu installieren.
  • Konfigurieren Sie die Berechtigungen und das Konto, unter dem der Dienst ausgeführt werden soll.
  • Starten Sie den Dienst und überprüfen Sie in services.msc, ob er funktioniert.
  • Passen Sie die Optionen für die Desktop-Interaktion an, falls Benachrichtigungen benötigt werden.

Zusammenfassung

Diese Methode ist zwar etwas improvisiert, aber deutlich zuverlässiger als die altbewährte Vorgehensweise mit srvany.exe. Solange die Berechtigungen und Pfade stimmen, läuft sie recht stabil im Langzeitbetrieb. Natürlich ist sie nicht perfekt – Windows und PowerShell vertragen sich nicht immer reibungslos –, aber sie hat in verschiedenen Umgebungen ohne großen Aufwand funktioniert. Achten Sie lediglich auf Berechtigungsprobleme oder Tippfehler in den Pfaden. Hoffentlich spart dies jemandem, der Skripte rund um die Uhr ohne ständige Überwachung ausführen möchte, einige Stunden Zeit.