Стартиране на PowerShell Script като услуга на Windows

От всеки скрипт на PowerShell можете да направите услуга на Windows, която работи във фонов режим и да се стартира автоматично, когато сървърът се стартира. Можете да създадете услуга на Windows с помощта на помощните програми srvany.exe и instsrv.exe (включени в комплекта на Windows Server Resource 2003 Kit), което ви позволява да стартирате процеса powershell.exe с параметър под формата на пътя към файла на скрипта ps1. Основният недостатък на този метод за създаване на услуга е, че srvany.exe не контролира изпълнението на приложението (скрипт PowerShell в нашия случай) и ако приложението се срине (замръзва), услугата не вижда това и продължава да работи. В тази статия ще използваме помощната програма за създаване на Windows услуга от файл със скрипт на PowerShell NSSM (Мениджър, който не изсмуква услугата - оставете без превод ... :)), което е лишено от тези недостатъци.

Можете да изтеглите и инсталирате NSSM ръчно или чрез Chocolately. Първо трябва да инсталирате самия Choco:

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

След това инсталирайте пакета NSSM:

choco инсталирайте nssm

В този пример ще наблюдаваме промените в конкретна група AD в реално време (скриптът от тази статия) и ще уведомяваме администратора за сигурност с изскачащо известие и писмо при промяна.

Така че, ние имаме код, който трябва да бъде записан във файл PS1. Добавете безкраен цикъл, който извършва проверка веднъж в минута:

докато ($ true)
# Вашият PS код
Старт-сън-секунди 60

Разбира се, за да реализирате такъв сценарий, можете да създадете задача в планировчика (Task Scheduler), но ако трябва да реагирате на всички промени в реално време, метод с отделна услуга е много по-правилен.

Можете да създадете услуга от PowerShell скрипт, като използвате NSSM директно от PowerShell :):

$ NSSMPath = (Get-Command "C: \ tools \ nssm \ win64 \ nssm.exe"). Източник
$ NewServiceName = „CheckADGroupSrv“
$ PoShPath = (Get-Command powershell). Източник
$ PoShScriptPath = "C: \ tools \ CheckADGroup \ checkad.ps1"
$ args = '-ExecutionPolicy Bypass -NoProfile -File "0"' -f $ PoShScriptPath
& $ NSSMPath инсталирате $ NewServiceName $ PoShPath $ аргументи
& $ NSSMPath статус $ NewServiceName

Стартирайте новата услуга:

Start-Service $ NewServiceName

Проверете състоянието на услугата с помощта на PowerShell:

Вземете услуга $ NewServiceName

Така че, вие създадохте и стартирахте нова услуга на Windows. Проверете дали се появява в конзолата за управление на услугите services.msc

Услугата CheckADGroupSrv наистина се появи, тя е конфигурирана да се стартира автоматично и в момента работи (работи). Както можете да видите, вашият скрипт PowerShell работи в процеса nssm.exe.

Моля, обърнете внимание, че услугата работи под системния акаунт. Ако използвате други модули във вашите PS скриптове (в моя случай командлетът Get-ADGroupMember от модула Active Directory за Windows PowerShell се използва за получаване на състава на групата за защита на домейна), този акаунт трябва да има достъп до файловете на модула и права за свързване с AD (в моя случай). Можете също да стартирате тази услуга под различен акаунт (или gMSA акаунт) и да дадете на потребителите правото да спрат / рестартират услугата, ако нямат права на местен администратор.

За да може услугата да показва известия в потребителска сесия (да взаимодейства с работния плот), трябва да натиснете „Вход”(Влезте) активирайте„Разрешаване на взаимодействие на работния плот”(Разрешаване на услугата да взаимодейства с десктопа).

За да работи това в Windows 10 / Windows Server 2012 R2 / 2016, трябва да промените DWORD стойността на параметъра на системния регистър NoInteractiveServices в клона HKLM \ System \ CurrentControlSet \ Control \ Windows на 0 и активирайте услугата за браузър на интерактивни услуги (Интерактивна услуга за откриване на услуги):

Start-Service -Name ui0detect

В Windows 10 1803 обаче услугата за интерактивни услуги за откриване е напълно премахната от системата и вече не можете да преминете към нулева сесия (сесия 0), така че просто няма да видите прозорци, които се показват под системния акаунт.

Можете да промените описанието на услугата с командата:

& $ NSSMPath set $ NewServiceName описание „Мониторинг на промените в AD групата“

За да изтриете създадената услуга, можете да използвате командата sc delete или

nssm премахнете CheckADGroupSrv