A PowerShell parancsfájl futtatása Windows szolgáltatásként

Bármely PowerShell-parancsfájlból elkészíthet egy Windows szolgáltatást, amely a háttérben fut és automatikusan elindul, amikor a kiszolgáló elindul. A srvany.exe és az instsrv.exe segédprogramok segítségével (a Windows Server Resource 2003 készletben szerepel) létrehozhat egy Windows szolgáltatást, amely lehetővé teszi a powershell.exe folyamat elindítását egy paraméterrel a ps1 parancsfájl elérési útjának formájában. A szolgáltatás létrehozásának ezen módszerének fő hátránya, hogy az srvany.exe nem ellenőrzi az alkalmazás végrehajtását (a mi esetünkben a PowerShell szkript), és ha az alkalmazás összeomlik (lefagy), a szolgáltatás ezt nem látja, és továbbra is működik. Ebben a cikkben a segédprogram segítségével Windows-szolgáltatást hozunk létre egy PowerShell-parancsfájlt tartalmazó fájlból NSSM (Nem szoptató szolgáltató menedzser - fordítás nélkül hagyja ... :)), amely nem rendelkezik ezekkel a hiányosságokkal.

Az NSSM-et letöltheti és telepítheti manuálisan vagy a Chocolately segítségével. Először maga a Choco-t kell telepítenie:

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

Ezután telepítse az NSSM csomagot:

choco install nssm

Ebben a példában valós időben figyeljük egy adott AD-csoportban bekövetkező változásokat (a cikkből származó szkript), és értesítjük a biztonsági rendszergazdát egy felbukkanó értesítéssel és betűvel, amikor megváltoztatjuk.

Tehát van egy kódunk, amelyet el kell menteni egy PS1 fájlba. Adjon hozzá egy végtelen ciklust, amely percenként egyszer ellenőrzi:

míg ($ true)
# Az Ön PS-kódja
Start-Sleep-Seconds 60

Természetesen egy ilyen forgatókönyv megvalósításához létrehozhat egy feladatot az ütemezőben (Feladatütemező), de ha reagálnia kell a valós időben bekövetkező változásokra, akkor egy külön szolgáltatással rendelkező módszer sokkal helyesebb..

Szolgáltatást létrehozhat egy PowerShell-parancsfájlból, az NSSM segítségével, közvetlenül a PowerShell-ből :):

$ NSSMPath = (Get-Command "C: \ tools \ nssm \ win64 \ nssm.exe"). Forrás
$ NewServiceName = “CheckADGroupSrv”
$ PoShPath = (Get-Command powershell). Forrás
$ PoShScriptPath = “C: \ tools \ CheckADGroup \ checkad.ps1”
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath telepíti a $ NewServiceName $ PoShPath $ args fájlt
& $ NSSMPath állapot $ NewServiceName

Futtassa az új szolgáltatást:

Start-Service $ NewServiceName

Ellenőrizze a szolgáltatás állapotát a PowerShell használatával:

Get-Service $ NewServiceName

Tehát létrehozott és elindított egy új Windows szolgáltatást. Ellenőrizze, hogy megjelenik-e a services.msc szolgáltatáskezelő konzolban

A CheckADGroupSrv szolgáltatás valóban megjelent, automatikusan elindulva van beállítva és jelenleg fut (fut). Mint láthatja, a PowerShell szkript az nssm.exe folyamaton belül fut.

Felhívjuk figyelmét, hogy a szolgáltatás a rendszerfiók alatt fut. Ha más modulokat használ a PS parancsfájljaiban (esetemben a tartományi biztonsági csoport összetételének megszerzéséhez a Windows PowerShell Active Directory moduljának Get-ADGroupMember parancsmagját használjuk), ennek a fióknak hozzáféréssel kell rendelkeznie a modul fájlokhoz és az AD-hez való kapcsolódáshoz ( eset). Ezt a szolgáltatást egy másik fiókkal (vagy gMSA-fiókkal) is elindíthatja, és feljogosíthatja a felhasználókat a szolgáltatás leállítására / újraindítására, ha nincs helyi rendszergazdai jog..

Annak érdekében, hogy a szolgáltatás értesítéseket jelenítsen meg egy felhasználói munkamenetben (interakcióba léphet az asztallal), a „Belépés”(Bejelentkezés) engedélyezze a„Engedélyezze az asztali interakciót”(Engedélyezi a szolgáltatásnak az asztali kapcsolatba lépését).

Ahhoz, hogy ez működjön a Windows 10 / Windows Server 2012 R2 / 2016 rendszerben, meg kell változtatnia a regisztrációs paraméter DWORD értékét NoInteractiveServices a HKLM \ System \ CurrentControlSet \ Control \ Windows ágban 0 és engedélyezze az interaktív szolgáltatások böngésző szolgáltatását (Interaktív szolgáltatások észlelési szolgáltatása):

Start-Service -Name ui0detect

A Windows 10 1803 rendszerben azonban az interaktív szolgáltatások észlelési szolgáltatását teljesen eltávolították a rendszerből, és már nem válthat át a nulla munkamenetre (0. munkamenet), így egyszerűen nem fogja látni a rendszerfiók alatt megjelenő ablakokat..

A szolgáltatás leírását a következő paranccsal módosíthatja:

& $ NSSMPath set $ NewServiceName leírása “Az AD-csoport változásának figyelése”

A létrehozott szolgáltatás törléséhez használhatja a sc delete parancsot vagy

nssm eltávolítani CheckADGroupSrv