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