Spustenie skriptu PowerShell ako služby Windows

Z ľubovoľného skriptu PowerShell môžete vytvoriť službu systému Windows, ktorá sa spúšťa na pozadí a po spustení servera sa spustí automaticky. Službu Windows môžete vytvoriť pomocou pomocných programov srvany.exe a instsrv.exe (zahrnutých v súprave Windows Server Resource 2003 Kit), ktorá vám umožňuje spustiť proces powershell.exe s parametrom vo forme cesty k súboru skriptu ps1. Hlavnou nevýhodou tohto spôsobu vytvorenia služby je to, že srvany.exe nekontroluje vykonávanie aplikácie (skript PowerShell v našom prípade) a ak dôjde k zlyhaniu aplikácie (zamrzne), služba to neuvidí a bude naďalej fungovať. V tomto článku nástroj použijeme na vytvorenie služby Windows zo súboru so skriptom PowerShell NSSM (Non-Sucking Service Manager - odíďte bez prekladu ... :)), ktorý nemá tieto nedostatky.

NSSM si môžete stiahnuť a nainštalovať manuálne alebo pomocou Chocolately. Najprv musíte nainštalovať Choco sám:

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

Potom nainštalujte balík NSSM:

choco install nssm

V tomto príklade budeme sledovať zmeny v konkrétnej skupine AD v reálnom čase (skript z tohto článku) a upozorníme administrátora zabezpečenia pomocou kontextového oznámenia a listu pri zmene.

Máme teda kód, ktorý je potrebné uložiť do súboru PS1. Pridajte nekonečnú slučku, ktorá vykonáva kontrolu raz za minútu:

while ($ true)
# Váš PS kód
Štart-doba spánku 60

Ak chcete implementovať takýto scenár, môžete samozrejme vytvoriť úlohu v plánovači (Plánovač úloh), ale ak potrebujete reagovať na akékoľvek zmeny v reálnom čase, metóda so samostatnou službou je oveľa presnejšia..

Službu môžete vytvoriť zo skriptu PowerShell pomocou NSSM priamo z PowerShell :):

$ NSSMPath = (Get-Command "C: \ tools \ nssm \ win64 \ nssm.exe"). Zdroj
$ NewServiceName = “CheckADGroupSrv”
$ PoShPath = (Získať príkazové prostredie). Zdroj
$ PoShScriptPath = “C: \ tools \ CheckADGroup \ checkad.ps1”
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath nainštalujte $ NewServiceName $ PoShPath $ args
& $ NSSMPath status $ NewServiceName

Spustiť novú službu:

$ StartService $ NewServiceName

Skontrolujte stav služby pomocou PowerShell:

Získajte službu $ NewServiceName

Vytvorili ste a spustili ste novú službu systému Windows. Skontrolujte, či sa zobrazuje v konzole správy služieb services.msc

Služba CheckADGroupSrv sa skutočne objavila, je nakonfigurovaná na automatické spustenie a je momentálne spustená (beží). Ako vidíte, váš skript PowerShell beží vo vnútri procesu nssm.exe.

Upozorňujeme, že služba je spustená v rámci systémového účtu. Ak vo svojich skriptoch PS používate iné moduly (v mojom prípade sa na získanie zloženia skupiny zabezpečenia domény používa modul cmadlet Get-ADGroupMember z modulu Active Directory pre systém Windows PowerShell), tento účet musí mať prístup k súborom modulov a práva na pripojenie k službe AD (v mojom prípade prípad). Túto službu môžete tiež spustiť pod iným účtom (alebo účtom gMSA) a dať používateľom právo zastaviť / reštartovať službu, ak nemajú práva miestneho správcu..

Ak chcete, aby služba zobrazovala upozornenia v relácii používateľa (interagovala s pracovnou plochou), musíte zadať „Prihlásenie užívateľa“(Prihlásiť sa) povoliť“Povoliť interakciu na pracovnej ploche“(Povoliť službe interakciu s počítačom).

Aby to fungovalo v systéme Windows 10 / Windows Server 2012 R2 / 2016, musíte zmeniť hodnotu DWORD parametra registra NoInteractiveServices vo vetve HKLM \ System \ CurrentControlSet \ Control \ Windows 0 a povoliť službu prehľadávača interaktívnych služieb (Služba detekcie interaktívnych služieb):

Start-Service - meno ui0detect

V systéme Windows 10 1803 však bola služba zisťovania interaktívnych služieb zo systému úplne odstránená a už nemôžete prepnúť na nulu relácie (relácia 0), takže jednoducho neuvidíte okná, ktoré sa zobrazujú v rámci systémového účtu..

Popis služby môžete zmeniť príkazom:

& $ NSSMPath set $ NewServiceName description “Monitorovanie zmien AD skupín”

Vytvorenú službu môžete odstrániť pomocou príkazu sc delete alebo

nssm odstrániť CheckADGroupSrv