Zagon skripta PowerShell kot storitev Windows

Iz katerega koli skripta PowerShell lahko naredite storitev Windows, ki deluje v ozadju in se samodejno zažene, ko se strežnik zažene. Storitev Windows lahko ustvarite s pomočjo pripomočkov srvany.exe in instsrv.exe (vključenih v komplet Windows Server Resource 2003 Kit), ki vam omogoča, da začnete postopek powershell.exe s parametrom v obliki poti do datoteke skripta ps1. Glavna pomanjkljivost tega načina ustvarjanja storitve je, da srvany.exe ne nadzoruje izvedbe aplikacije (skript PowerShell v našem primeru), in če se aplikacija zruši (zamrzne), storitev tega ne vidi in še naprej deluje. V tem članku bomo s pripomočkom ustvarili storitev Windows iz datoteke s skriptom PowerShell Nssm (Upravitelj ne-sesalnih storitev - pustite brez prevoda ... :)), ki je brez teh pomanjkljivosti.

NSSM lahko prenesete in namestite ročno ali prek Chocolately. Najprej morate sami namestiti Choco:

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

Nato namestite paket NSSM:

choco namestite nssm

V tem primeru bomo v realnem času spremljali spremembe v določeni skupini AD (skript iz tega članka) in ob spremembi obvestili varnostnega skrbnika s pojavnim obvestilom in pismom..

Torej, imamo kodo, ki jo je treba shraniti v datoteko PS1. Dodajte neskončno zanko, ki opravi preverjanje enkrat na minuto:

medtem ko ($ true)
# Vaša PS koda
Start-Sleep-Sends 60

Seveda lahko za izvajanje takšnega scenarija v planerju (Task Scheduler) ustvarite nalogo, če pa se morate v realnem času odzvati na kakršne koli spremembe, je metoda z ločeno storitvijo veliko bolj pravilna.

Storitev lahko ustvarite iz skripta PowerShell s pomočjo NSSM neposredno iz PowerShell :):

$ NSSMPath = (Get-Command "C: \ orodja \ nssm \ win64 \ nssm.exe"). Vir
$ NewServiceName = "CheckADGroupSrv"
$ PoShPath = (Get-Command pooblastilo). Vir
$ PoShScriptPath = "C: \ orodja \ CheckADGroup \ checkad.ps1"
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath namestite $ NewServiceName $ PoShPath $ arg
& $ NSSMPath status $ NewServiceName

Zaženite novo storitev:

Start-Service $ NewServiceName

Preverite stanje storitve s programom PowerShell:

Get-Service $ NewServiceName

Torej ste ustvarili in zagnali novo storitev Windows. Preverite, ali je prikazano v konzoli za upravljanje storitev services.msc

Resnično se je pojavila storitev CheckADGroupSrv, konfigurirana je za samodejni zagon in trenutno deluje (teče). Kot lahko vidite, se vaš skript PowerShell izvaja v procesu nssm.exe.

Upoštevajte, da storitev deluje pod sistemskim računom. Če v svojih skriptih za PS uporabljate druge module (v mojem primeru se za pridobitev sestave varnostne skupine domen uporablja ukazni list Get-ADGroupMember iz modula Active Directory za Windows PowerShell), mora imeti ta račun dostop do datotek modula in pravice do povezave z AD (v mojem primer). To storitev lahko zaženete tudi v drugem računu (ali gMSA računu) in uporabnikom omogočite pravico, da ustavijo / ponovno zaženejo storitev, če nimajo lokalnih skrbniških pravic.

Če želite storitvi prikazovati obvestila v uporabniški seji (v interakciji z namizjem), morate v meniju »Prijava"(Prijava) omogočite"Dovoli interakcijo na namizju”(Dovoli, da storitev deluje v namizju).

Če želite to delovati v sistemu Windows 10 / Windows Server 2012 R2 / 2016, morate spremeniti vrednost DWORD parametra registra NoInteractiveServices v veji HKLM \ System \ CurrentControlSet \ Control \ Windows na 0 in omogočite storitev brskalnika interaktivnih storitev (Storitev zaznavanja interaktivnih storitev):

Start-Service -Name ui0detect

Vendar je bila v sistemu Windows 10 1803 storitev zaznavanja interaktivnih storitev v celoti odstranjena iz sistema in ne morete več preiti na nič seje (seja 0), tako da preprosto ne boste videli oken, ki so prikazana pod sistemskim računom.

Opis storitve lahko spremenite z ukazom:

& $ NSSMPath set $ NewServiceName opis "Spremljanje sprememb skupine AD"

Če želite izbrisati ustvarjeno storitev, lahko uporabite ukaz sc delete ali

nssm odstrani CheckADGroupSrv