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
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