Ejecución de PowerShell Script (* .PS1) como un servicio de Windows

Cualquier script de PowerShell se puede transformar en un servicio real de Windows que se ejecuta en segundo plano y se inicia automáticamente durante el arranque del servidor.. Puede crear un servicio de Windows usando srvany.exe o instsrv.exe herramientas (del Kit de recursos de Windows Server 2003) que le permiten ejecutar el powershell.exe proceso con un parámetro que contiene la ruta a su archivo de script PS1.

La principal desventaja de crear un servicio con este método es que srvany.exe no controla el estado de ejecución de un script de PowerShell, y si la aplicación falla (cuelga), el servicio no la ve y sigue funcionando. Para crear un servicio de Windows a partir de un archivo que contiene un script de PowerShell, en este artículo usaremos el NSSM (Administrador de servicios no chupadores), que no demuestra las desventajas mencionadas anteriormente.

Puede descargar e instalar NSSM manualmente o usando Chocolatey. En primer lugar, instale Choco en sí:

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

Luego instale el paquete NSSM:

choco install nssm

En este ejemplo, realizaremos un seguimiento de los cambios en un grupo específico de Active Directory en tiempo real e informaremos a un administrador de seguridad mediante una notificación emergente y un correo electrónico (la secuencia de comandos se proporciona en este artículo).

Entonces, tenemos un código de PowerShell que debe guardarse como un archivo PS1. Agreguemos un bucle infinito que realiza una verificación cada minuto:

while($true) {
#Your PS code
Start-Sleep –Seconds 60
}

Por supuesto, para implementar tal escenario, puede crear una tarea separada en el Programador de tareas. Pero si tiene que responder a los cambios en tiempo real, el método de servicio por separado es mejor.

Puede crear un servicio desde un script de PowerShell usando NSSM directamente desde PowerShell:

$NSSMPath = (Get-Command "C:psnssmwin64nssm.exe").Source
$NewServiceName = “CheckADGroup”
$PoShPath= (Get-Command powershell).Source
$PoShScriptPath = “C:psCheckADGroupcheckad.ps1”
$args="-ExecutionPolicy Bypass -NoProfile -File "{0}"" -f $PoShScriptPath
& $NSSMPath install $NewServiceName $PoShPath $args
& $NSSMPath status $NewServiceName

Inicie su nuevo servicio:

Start-Service $NewServiceName

Verifique el estado del servicio en PowerShell:

Get-Service $NewServiceName

Así que ha creado e iniciado su nuevo servicio de Windows. Asegúrese de que haya aparecido en la consola de administración de servicios (services.msc).

CheckADGroup ha aparecido, está configurado para iniciarse automáticamente y se está ejecutando actualmente. Como puede ver, su secuencia de comandos de PowerShell se ejecuta dentro del proceso nssm.exe.

Tenga en cuenta que el servicio se ejecuta en la cuenta del sistema. Si usa otros módulos en sus scripts de PowerShell (en mi caso, Get-ADGroupMember de Active Directory para Windows PowerShell se usa para obtener la lista de miembros en el grupo de seguridad del dominio), esta cuenta debe tener acceso a los archivos del módulo PS y AD permisos de conexión (en mi caso). También puede iniciar este servicio con otra cuenta de dominio (o una cuenta gMSA) y permitir a los usuarios detener / reiniciar el servicio si no tienen derechos de administrador local.

Para que el servicio pueda mostrar notificaciones en una sesión de usuario, habilite el Permitir que el servicio interactúe con el escritorio opción en el Acceder pestaña.

Para que funcione en Windows 10 y Windows Server 2012 R2 / 2016, cambie el DWORD NoInteractiveServices valor del parámetro en la clave de registro HKEY_LOCAL_MACHINE System CurrentControlSet Control Windows para 0 y ejecutar el Servicio de detección de servicios interactivos:

Start-Service -Name ui0detect

Sin embargo, el Servicio de detección de servicios interactivos se eliminó por completo de la compilación 1803 de Windows 10 y no podrá cambiar a la Sesión 0. Por lo tanto, no verá las ventanas de notificación que se muestran en Cuenta del sistema.

Puede cambiar la descripción del servicio usando este comando:

& $NSSMPath set $NewServiceName description “Monitoring of AD group changes”

Para eliminar el servicio que ha creado, utilice el sc delete comando o:

nssm remove CheckADGroup

nssm eliminar el servicio powershell

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *