Trčanje PowerShell skripte kao Windows usluge

Iz bilo koje PowerShell skripte možete napraviti Windows uslugu koja se pokreće u pozadini i pokreće se automatski kada se poslužitelj pokrene. Windows uslugu možete kreirati pomoću uslužnih programa srvany.exe i instsrv.exe (uključenih u komplet Windows Server Resource 2003 Kit) koji omogućuju pokretanje postupka powershell.exe s parametrom u obliku putanje do datoteke skripte ps1. Glavni nedostatak ove metode stvaranja usluge je da srvany.exe ne kontrolira izvršenje aplikacije (skripta PowerShell u našem slučaju), a ako se aplikacija sruši (zamrzne), usluga to ne vidi i nastavlja s radom. U ovom ćemo članku ovaj uslužni program stvoriti Windows uslugu iz datoteke s PowerShell skriptu NSSM (Voditelj nepodržavajućeg servisa - ostavite bez prijevoda ... :)), što je lišeno ovih nedostataka.

NSSM možete preuzeti i instalirati ručno ili preko Chocolately. Prvo morate sami instalirati Choco:

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

Zatim instalirajte NSSM paket:

choco instalirati nssm

U ovom ćemo primjeru pratiti promjene u određenoj grupi AD u stvarnom vremenu (skripta iz ovog članka) i obavijestiti administratora sigurnosti pop-up obavijesti i pismom prilikom promjene.

Dakle, imamo kôd koji treba spremiti u PS1 datoteku. Dodajte beskonačnu petlju koja vrši provjeru jednom minutu:

dok je ($ true)
# Vaš PS kod
Početak-spavanje-sekunde 60

Naravno, za implementaciju takvog scenarija možete stvoriti zadatak u programu za planiranje (Planer zadataka), ali ako trebate odgovoriti na bilo kakve promjene u stvarnom vremenu, metoda s odvojenom uslugom mnogo je ispravnija.

Uslugu možete stvoriti iz skripte PowerShell koristeći NSSM izravno iz PowerShell-a :):

$ NSSMPath = (Get-Command "C: \ alati \ nssm \ win64 \ nssm.exe"). Izvor
$ NewServiceName = "CheckADGroupSrv"
$ PoShPath = (Get-Command ovlaštenje). Izvor
$ PoShScriptPath = "C: \ tools \ CheckADGroup \ checkad.ps1"
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath instalira $ NewServiceName $ PoShPath $ args
& $ NSSMPath status $ NewServiceName

Pokrenite novu uslugu:

Start-Service $ NewServiceName

Provjerite status usluge pomoću PowerShell-a:

Dobivanje usluge $ NewServiceName

Dakle, stvorili ste i pokrenuli novu Windows uslugu. Provjerite da li se pojavljuje na konzoli za upravljanje uslugama services.msc

Pojavila se zaista usluga CheckADGroupSrv, konfigurirana je za automatsko pokretanje i trenutno se pokreće (Pokreće). Kao što vidite, vaš PowerShell skripta pokreće se unutar nssm.exe procesa.

Napominjemo da se usluga izvodi pod sistemskim računom. Ako koristite druge module u PS skriptama (u mom slučaju, cmdlet Get-ADGroupMember iz modula Active Directory za Windows PowerShell koristi se za dobivanje sastava grupe sigurnosti domene), ovaj račun mora imati pristup datotekama modula i prava za povezivanje s AD-om (u mom slučaj). Ovu uslugu možete pokrenuti i pod drugim računom (ili gMSA računom) i korisnicima dati pravo da zaustave / ponovno pokrenu uslugu ako nemaju lokalna administrativna prava.

Da bi usluga prikazala obavijesti u korisničkoj sesiji (interakcija s radnom površinom), morate na "Logiranje članova"(Prijava) omogućuju"Dopusti interakciju na radnoj površini"(Dopustite usluzi da komunicira sa radnom površinom).

Da bi ovo radilo u sustavu Windows 10 / Windows Server 2012 R2 / 2016, morate promijeniti DWORD vrijednost parametra registra NoInteractiveServices u podružnici HKLM \ System \ CurrentControlSet \ Control \ Windows 0 i omogućiti uslugu preglednika interaktivnih usluga (Služba za otkrivanje interaktivnih usluga):

Start-Service -Name ui0detect

No, u sustavu Windows 10 1803 usluga Interaktivne usluge otkrivanja potpuno je uklonjena iz sustava i više se ne možete prebaciti na nulu sesije (sesija 0), tako da jednostavno nećete vidjeti prozore koji su prikazani pod sistemskim računom.

Opis usluge možete promijeniti naredbom:

& $ NSSMPath set $ NewServiceName opis "Nadgledanje promjena AD grupe"

Za brisanje stvorene usluge možete upotrijebiti naredbu sc delete ili

nssm ukloni CheckADGroupSrv