Uruchamianie skryptu PowerShell jako usługi systemu Windows

Z dowolnego skryptu PowerShell można utworzyć usługę systemu Windows, która działa w tle i uruchamia się automatycznie po uruchomieniu serwera. Możesz utworzyć usługę Windows za pomocą narzędzi srvany.exe i instsrv.exe (zawartych w zestawie Windows Server Resource 2003 Kit), umożliwiając uruchomienie procesu powershell.exe z parametrem w postaci ścieżki do pliku skryptu ps1. Główną wadą tej metody tworzenia usługi jest to, że srvany.exe nie kontroluje wykonywania aplikacji (w naszym przypadku skrypt PowerShell), a jeśli aplikacja ulegnie awarii (zawiesi się), usługa tego nie widzi i nadal działa. W tym artykule użyjemy tego narzędzia do utworzenia usługi Windows z pliku ze skryptem PowerShell Nssm (Menedżer usług bez ssania - pozostaw bez tłumaczenia ... :)), który jest pozbawiony tych niedociągnięć.

Możesz pobrać i zainstalować NSSM ręcznie lub przez Chocolately. Najpierw musisz zainstalować Choco:

Bypass Set-ExecutionPolicy -Scope Process -Force; ''
iex ((New-Object System.Net.WebClient) .DownloadString ('https://chocolatey.org/install.ps1'))

Następnie zainstaluj pakiet NSSM:

choco zainstaluj nssm

W tym przykładzie będziemy monitorować zmiany w określonej grupie AD w czasie rzeczywistym (skrypt z tego artykułu) i powiadomić administratora bezpieczeństwa o wyskakującym powiadomieniu i liście przy zmianie.

Mamy więc kod, który należy zapisać w pliku PS1. Dodaj nieskończoną pętlę, która wykonuje sprawdzenie raz na minutę:

podczas gdy ($ true)
# Twój kod PS
Start-Sleep-Seconds 60

Oczywiście, aby wdrożyć taki scenariusz, możesz utworzyć zadanie w harmonogramie (Harmonogram zadań), ale jeśli musisz reagować na wszelkie zmiany w czasie rzeczywistym, metoda z oddzielną usługą jest znacznie bardziej poprawna.

Możesz utworzyć usługę ze skryptu PowerShell przy użyciu NSSM bezpośrednio z PowerShell :):

$ NSSMPath = (Get-Command "C: \ tools \ nssm \ win64 \ nssm.exe"). Źródło
$ NewServiceName = „CheckADGroupSrv”
$ PoShPath = (Get-Command powershell). Źródło
$ PoShScriptPath = „C: \ tools \ CheckADGroup \ checkad.ps1”
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath zainstaluj $ NewServiceName $ PoShPath $ args
& $ NSSMPath status $ NewServiceName

Uruchom nową usługę:

Start-Service $ NewServiceName

Sprawdź status usługi za pomocą PowerShell:

Get-Service $ NewServiceName

Utworzyłeś i uruchomiłeś nową usługę Windows. Sprawdź, czy pojawia się w konsoli zarządzania usługami services.msc

Usługa CheckADGroupSrv naprawdę się pojawiła, jest skonfigurowana do automatycznego uruchamiania i obecnie działa (działa). Jak widać, skrypt PowerShell działa w procesie nssm.exe.

Pamiętaj, że usługa działa na koncie systemowym. Jeśli używasz innych modułów w swoich skryptach PS (w moim przypadku polecenie cmdlet Get-ADGroupMember z modułu Active Directory dla Windows PowerShell służy do uzyskania składu grupy zabezpieczeń domeny), to konto musi mieć dostęp do plików modułu i praw do łączenia się z AD (w moim skrzynka). Możesz także uruchomić tę usługę na innym koncie (lub koncie gMSA) i dać użytkownikom prawo do zatrzymania / ponownego uruchomienia usługi, jeśli nie mają uprawnień lokalnego administratora.

Aby usługa wyświetlała powiadomienia w sesji użytkownika (interakcja z pulpitem), musisz:Zaloguj się”(Zaloguj się) włącz„Zezwalaj na interakcję z komputerem”(Zezwól usłudze na interakcję z komputerem).

Aby działało to w systemie Windows 10 / Windows Server 2012 R2 / 2016, musisz zmienić wartość DWORD parametru rejestru NoInteractiveServices w gałęzi HKLM \ System \ CurrentControlSet \ Control \ Windows na 0 i włącz usługę przeglądarki usług interaktywnych (Usługa wykrywania usług interaktywnych):

Start-Service -Name ui0detect

Jednak w systemie Windows 10 1803 usługa wykrywania usług interaktywnych została całkowicie usunięta z systemu i nie można już przejść do sesji zerowej (sesja 0), więc po prostu nie zobaczysz okien wyświetlanych na koncie systemowym.

Możesz zmienić opis usługi za pomocą polecenia:

& $ NSSMPath ustaw $ NewServiceName opis „Monitorowanie zmian w grupie AD”

Aby usunąć utworzoną usługę, możesz użyć polecenia sc delete lub

nssm usuń CheckADGroupSrv