Antes de que me derriben, sé cómo programar una tarea, reiniciar un servicio con powershell o dar a una cuenta que no sea de administrador los privilegios para reiniciar un servicio. Ese no es el problema. Sin embargo, el problema es la combinación de todas estas tres tareas combinadas.
Tengo un servicio de Windows que necesita procesar archivos en una carpeta de red. Por lo tanto, inicia sesión con una "cuenta de servicio" que en realidad es solo una cuenta de dominio normal. Esta cuenta de dominio no es un administrador pero tiene derechos de acceso a dicha carpeta. El servicio funciona bien y hace su trabajo.
Sin embargo, a veces hay un error en uno de los archivos que impide que se procesen otros archivos. Por lo general, a alguien le toma un tiempo darse cuenta y hay algo de retraso.
Entonces, creé un script de monitoreo en powershell que sondea la carpeta de red para estos archivos erróneos. Si se encuentran, los archivos se mueven a una carpeta temporal para su revisión y el servicio debe reiniciarse.
Le di privilegios a la cuenta de servicio a través de la política de grupo para iniciar y detener el servicio.
Cuando inicio sesión en el servidor con la cuenta de servicio, puedo reiniciar el servicio manualmente con la MMC de servicios. También puedo ejecutar el script de PowerShell y hace exactamente lo que se supone que debe hacer: sondear la carpeta, mover los archivos y reiniciar el servicio. ¡Excelente!
En la siguiente fase, creé una tarea programada que se ejecuta cada 10 minutos. La tarea utiliza la misma cuenta de servicio que el servicio para ejecutar el script de PowerShell. La casilla "ejecutar con los más altos privilegios" está marcada. Como dije, el script de PowerShell necesita acceso a la unidad de red, por lo que no puedo ejecutarlo como administrador del servidor local y no quiero usar las credenciales de administrador de dominio para una tarea tan simple como esta. (Intento implementar el principio de privilegio mínimo tanto como puedo).
Le di a la cuenta de servicio los derechos de "inicio de sesión como trabajo por lotes" en el servidor local utilizando la Política de seguridad local MMC.
Ahora para la parte que no puedo entender: en el momento programado, las tareas programadas se completan con éxito y el script de PowerShell se está ejecutando. El script sondea la carpeta y los archivos de error se mueven. Lo único que no funciona es reiniciar el servicio ...?! Nuevamente, ejecutar el script manualmente ya que el mismo usuario funcionó perfectamente.
No veo mucho en el visor de eventos, pero el inicio de sesión en mi script indica este error:
TerminatingError (Stop-Service): "No se puede abrir Service Control Manager en la computadora '.'. Esta operación puede requerir otros privilegios".
Los comandos que uso para reiniciar el servicio son:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(Estoy usando Windows Server 2012 R2 y Powershell versión 4 en un dominio 2008 R2).
Actualización: Intenté configurar los permisos de servicio para el usuario usando subinacl (como se describe aquí ) y configurar la cadena SDDL manualmente (como se describe aquí ), para que mis indicadores de control se vean así (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). También intenté establecer los privilegios del servicio en Control total en el GPO. Ninguno de estos resolvió el problema tampoco. Debe ser un problema con privilegios en algún lugar que todavía estoy pasando por alto, porque cuando programo la tarea con una cuenta de dominio que es un administrador local en el servidor, funciona bien.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
lugar de Stop-Service
CmdLet? Aparentemente, Stop-Service y Start-Service aparentemente no se pueden usar de forma remota de acuerdo con esta respuesta: No se puede usar Get-Service –ComputerName en una computadora remota y su mensaje de error podría estar relacionado con el intento de conectarse a un localhost "remoto". (<== ese es un punto allí.)