Spuštění skriptu PowerShell jako služby Windows

Z jakéhokoli skriptu PowerShell můžete vytvořit službu Windows, která běží na pozadí a po spuštění serveru se spustí automaticky. Službu Windows můžete vytvořit pomocí obslužných programů srvany.exe a instsrv.exe (součástí sady Windows Server Resource 2003 Kit), což vám umožní spustit proces powershell.exe s parametrem ve formě cesty k souboru skriptu ps1. Hlavní nevýhoda této metody vytváření služby je v tom, že srvany.exe nekontroluje provádění aplikace (skript PowerShell v našem případě), a pokud aplikace havaruje (zamrzne), služba to nevidí a pokračuje v práci. V tomto článku použijeme tento nástroj k vytvoření služby Windows ze souboru se skriptem PowerShell Nssm (Non-Sucking Service Manager - odejít bez překladu ... :)), který postrádá tyto nedostatky.

NSSM si můžete stáhnout a nainstalovat ručně nebo pomocí Chocolately. Nejprve musíte nainstalovat Choco sám:

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

Pak nainstalujte balíček NSSM:

choco install nssm

V tomto příkladu budeme sledovat změny v konkrétní skupině AD v reálném čase (skript z tohoto článku) a oznámíme správci zabezpečení vyskakovacím oznámením a dopisem při změně.

Máme tedy kód, který je třeba uložit do souboru PS1. Přidejte nekonečnou smyčku, která provádí kontrolu jednou za minutu:

while ($ true)
# Váš PS kód
Start-Sleep-Seconds 60

K implementaci takového scénáře můžete samozřejmě vytvořit úkol v plánovači (Plánovač úloh), ale pokud potřebujete reagovat na jakékoli změny v reálném čase, je metoda s oddělenou službou mnohem správnější.

Službu můžete vytvořit ze skriptu PowerShell pomocí NSSM přímo z PowerShell :):

$ NSSMPath = (Get-Command "C: \ tools \ nssm \ win64 \ nssm.exe"). Zdroj
$ NewServiceName = “CheckADGroupSrv”
$ PoShPath = (Získat-Command powerhell). Zdroj
$ PoShScriptPath = “C: \ tools \ CheckADGroup \ checkad.ps1”
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath nainstalovat $ NewServiceName $ PoShPath $ args
& $ NSSMPath status $ NewServiceName

Spusťte novou službu:

Start-Service $ NewServiceName

Zkontrolujte stav služby pomocí PowerShell:

Získejte službu $ NewServiceName

Vytvořili jste a spustili novou službu systému Windows. Ověřte, že se objeví v konzole pro správu služeb services.msc

Služba CheckADGroupSrv se skutečně objevila, je nakonfigurována tak, aby se spouštěla ​​automaticky a právě běží (běží). Jak vidíte, váš skript PowerShell běží uvnitř procesu nssm.exe.

Upozorňujeme, že služba je spuštěna v rámci systémového účtu. Používáte-li ve svých skriptech PS jiné moduly (v mém případě se k získání složení skupiny zabezpečení domény používá cmdlet Get-ADGroupMember z modulu Active Directory pro Windows PowerShell), musí mít tento účet přístup k souborům modulu a práva pro připojení k AD (v mém případ). Tuto službu můžete také spustit pod jiným účtem (nebo účtem gMSA) a dát uživatelům právo zastavit / restartovat službu, pokud nemají práva místního správce.

Chcete-li, aby služba zobrazovala oznámení v uživatelské relaci (interagovala s desktopem), musíte na „Přihlášení”(Přihlásit se) povolit“Povolit interakci na ploše“(Povolit službě interakci s počítačem).

Aby to fungovalo v systému Windows 10 / Windows Server 2012 R2 / 2016, musíte změnit hodnotu DWORD parametru registru NoInteractiveServices ve větvi HKLM \ System \ CurrentControlSet \ Control \ Windows 0 a povolit službu prohlížeče interaktivních služeb (Služba detekce interaktivních služeb):

Start-Service - jméno ui0detect

V systému Windows 10 1803 však byla služba detekce interaktivních služeb ze systému zcela odstraněna a vy již nemůžete přepnout na nulu relace (relace 0), takže jednoduše neuvidíte okna, která se zobrazí pod účtem Systém..

Popis služby můžete změnit příkazem:

& $ NSSMPath set $ NewServiceName description „Sledování změn ve skupině AD“

Pro smazání vytvořené služby můžete použít příkaz sc delete nebo

nssm odebrat CheckADGroupSrv