Cómo crear y ejecutar el servicio de Windows usando el script de PowerShell

Cómo crear y ejecutar el servicio de Windows usando el script de PowerShell

Estoy intentando crear un nuevo servicio (AppOneTest) en Windows 2016, que debería estar disponible en services.msc y cada vez que se inicie el servicio (AppOneTest) debería iniciar el explorador de procesos.

$ServiceName = "ApplicationOneTest"
$ServiceDisplayName = "AppOneTest"
$ServiceDescription = "This launches process explorer"
$ExecutablePath = "C:\processexp\procexp64.exe"

$ScriptPath = "C:\Backup\LaunchScript.ps1"
$LaunchScript = @"
    # Script to launch processexp
    & '$ExecutablePath'
"@
$LaunchScript | Out-File -FilePath $ScriptPath -Encoding utf8

New-Service -Name $ServiceName -DisplayName $ServiceDisplayName -Description $ServiceDescription -BinaryPathName "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File $ScriptPath" -StartupType Automatic

sc.exe config $ServiceName obj= "domain\username" password= "******" type= interact

Start-Service -Name $ServiceName

Este script intentará crear un servicio e intentará iniciarlo. Sin embargo, cuando intento iniciar el servicio que se creó, se bloquea y nunca se inicia.

Cualquier ayuda es muy apreciada.

Respuesta1

Los servicios interactivos son en su mayoría ineficaces a partir de Windows Vista y no deberían utilizarse.

Los programas de servicio deben ajustarse a una interfaz específica, deben interactuar con el Administrador de control de servicios, señalando su estado y todo eso. Process Explorer o cualquier otra aplicación promedio no haría esto.

Puedes usar un contenedor de servicios comoNSSMpara ejecutar programas arbitrarios como servicios. Esta es una solución popular para aplicaciones de servidor Java.


Para ejecutar sus pruebas de UI, debe usar una máquina virtual con el inicio de sesión automático configurado y mostrar la suspensión/bloqueo deshabilitado, y luego ejecutar sus pruebas en la sesión normal que siempre está abierta.

Respuesta2

Estás intentando ejecutar un servicio de sistema interactivo. Esto no se recomienda y puede haber algunas complejidades que resolver además de mi respuesta. Tenga en cuenta que no todos los programas están diseñados para ejecutarse utilizando el protocolo de servicio del sistema y realmente dudo que Explorer sea adecuado. Puede encontrar las utilidades que enumero en esta respuesta para ser útil en la creación de servicios ad-hoc a partir de programas inadecuados: srvany-ngy NSSM.

Como mínimo, debe ejecutar el servicio con la misma cuenta de usuario que el usuario que inició sesión. En PowerShell, esto significa usar unPSCredencial objeto que contiene las credenciales del usuario.

Código de ejemplo:

$username = "username"
$password = "password"
$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($username, $securepassword)

New-Service [...] -Credential $cred

Referencias:

información relacionada