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
}
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](/f/9506ce3ab38cb6ec4566a3a1cb2bb21c.png)
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](/f/cc855a40f7ac86c5809842dc16588c83.png)
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.
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](/f/3728300e620796b99ed4c8c7fabb7527.png)