Ausführen von PowerShell-Skript (*.PS1) als Windows-Dienst

Admin

Jedes PowerShell-Skript kann in einen echten Windows-Dienst umgewandelt werden, der im Hintergrund läuft und beim Booten Ihres Servers automatisch startet. Sie können einen Windows-Dienst mit erstellen srvany.exe oder instsrv.exe Tools (aus dem Windows Server Resource 2003 Kit), mit denen Sie das ausführen können powershell.exe Prozess mit einem Parameter, der den Pfad zu Ihrer PS1-Skriptdatei enthält.

Der Hauptnachteil beim Erstellen eines Dienstes mit dieser Methode besteht darin, dass srvany.exe einen nicht steuert Ausführungsstatus des PowerShell-Skripts, und wenn die App abstürzt (hängt), erkennt der Dienst dies nicht und fährt fort Arbeiten. Um einen Windows-Dienst aus einer Datei zu erstellen, die ein PowerShell-Skript enthält, verwenden wir in diesem Artikel das NSSM (Non-Sucking Service Manager) Toolkit, das die oben genannten Nachteile nicht aufweist.

Sie können NSSM manuell oder mit Chocolatey herunterladen und installieren. Installieren Sie zunächst Choco selbst:

Set-ExecutionPolicy Bypass -Scope Process -Force; `


iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

Installieren Sie dann das NSSM-Paket:

choco install nssm

In diesem Beispiel verfolgen wir die Änderungen in einer bestimmten Active Directory-Gruppe in Echtzeit und informieren einen Sicherheitsadministrator mithilfe von a Popup-Benachrichtigung und E-Mail (das Skript ist angegeben in Dieser Artikel) .

Wir haben also einen PowerShell-Code, der als PS1-Datei gespeichert werden muss. Fügen wir eine Endlosschleife hinzu, die jede Minute eine Prüfung durchführt:

while($true) {
#Your PS code
Start-Sleep –Seconds 60
}

Natürlich können Sie ein solches Szenario umsetzen Erstellen Sie eine separate Aufgabe im Taskplaner. Wenn Sie jedoch in Echtzeit auf Änderungen reagieren müssen, ist die separate Servicemethode besser.

Sie können einen Dienst aus einem PowerShell-Skript mit NSSM direkt aus PowerShell erstellen:

$NSSMPath = (Get-Command "C:\ps\nssm\win64\nssm.exe").Source
$NewServiceName = “CheckADGroup”
$PoShPath= (Get-Command powershell).Source
$PoShScriptPath = “C:\ps\CheckADGroup\checkad.ps1”
$args = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $PoShScriptPath
& $NSSMPath install $NewServiceName $PoShPath $args
& $NSSMPath status $NewServiceName

Starten Sie Ihren neuen Dienst:

Start-Service $NewServiceName

Überprüfen Sie den Dienststatus in PowerShell:

Get-Service $NewServiceName

Ausführen eines Powershell-Skripts als Windows-Dienst

Damit haben Sie Ihren neuen Windows-Dienst erstellt und gestartet. Stellen Sie sicher, dass es in der Diensteverwaltungskonsole (services.msc) angezeigt wird.

CheckADGroup ist erschienen, für den automatischen Start konfiguriert und wird derzeit ausgeführt. Wie Sie sehen, wird Ihr PowerShell-Skript im Prozess nssm.exe ausgeführt.

Windows-Dienst aus einem Powershell-Skript mit nnm
Bitte beachten Sie, dass der Dienst unter dem Systemkonto ausgeführt wird. Wenn Sie andere Module in Ihren PowerShell-Skripten verwenden (in meinem Fall Get-ADGroupMember Von Active Directory für Windows PowerShell wird verwendet, um die Liste der Mitglieder in der Domänensicherheit abzurufen Gruppe) muss dieses Konto Zugriff auf die PS-Moduldateien und AD-Verbindungsberechtigungen haben (in meinem Fall). Sie können diesen Dienst auch unter einem anderen Domänenkonto (oder einem gMSA Konto) und Benutzern erlauben, den Dienst zu stoppen/neu zu starten wenn sie keine lokalen Administratorrechte haben.

Damit der Dienst Benachrichtigungen in einer Benutzersitzung anzeigen kann, aktivieren Sie die Erlauben Sie dem Dienst, mit dem Desktop zu interagieren Option auf der Einloggen Tab.

Damit es unter Windows 10 und Windows Server 2012 R2/2016 funktioniert, ändern Sie das DWORD Keine interaktiven Dienste Parameterwert im Registrierungsschlüssel HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows zu 0 und führen Sie das aus Erkennungsdienst für interaktive Dienste:

Start-Service -Name ui0detect

Allerdings wurde der Interactive Services Detection Service vollständig aus Windows 10 Build 1803 entfernt und Sie können nicht zu Sitzung 0 wechseln. Daher werden die unter „Systemkonto“ angezeigten Benachrichtigungsfenster nicht angezeigt.

Sie können die Dienstbeschreibung mit diesem Befehl ändern:

& $NSSMPath set $NewServiceName description “Monitoring of AD group changes”

Um den von Ihnen erstellten Dienst zu entfernen, verwenden Sie die sc delete Befehl oder:

nssm remove CheckADGroup

nssm entfernt den Powershell-Dienst

PowerShell: Paketquelle kann nicht aufgelöst werden
PowerShell: Paketquelle kann nicht aufgelöst werden

Wenn Sie versuchen, PowerShell-Module aus der Online-PSGallery zu installieren, wird möglicherwei...

PowerShell-Module im Offline-Modus installieren (ohne Internetzugang)
PowerShell-Module im Offline-Modus installieren (ohne Internetzugang)

Die beliebtesten PowerShell-Module werden online über die offizielle PowerShell-Galerie installie...

PowerShell SecretManagement-Modul: Anmeldeinformationen und Geheimnisse sicher verwalten
PowerShell SecretManagement-Modul: Anmeldeinformationen und Geheimnisse sicher verwalten

Microsoft hat kürzlich ein sehr nützliches veröffentlicht SecretManagement PowerShell-Modul. Sie ...