Reinicio programado de un servicio con powerhshell como cuenta de servicio no administrativa

11

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.

ingrese la descripción de la imagen aquí

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.

VolrathTheFallen
fuente
Esto podría ser de alguna ayuda serverfault.com/questions/357424/… parece que powershell es muy exigente con los permisos y no con los obvios
Drifter104
@ Drifter104: Aunque utilizo GPO para establecer los permisos en el servicio, no en subinacl, lo intenté de todos modos con los parámetros STOE, pero aún veo el mismo resultado. Verificó dos veces mi configuración de GPO y también tienen habilitada la opción Enumerar servicios dependientes.
VolrathTheFallen
@ MyronSemack-msemack Intenté configurar la cadena SDDL para el servicio manualmente como se describe en el artículo, pero todavía no tengo suerte, creo que, en última instancia, un GPO y una subinacl hacen lo mismo, ya que parecen anular uno y otro.
VolrathTheFallen
1
¿Qué tal intentar en Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....lugar de Stop-ServiceCmdLet? 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í.)
John también conocido como hot2use el

Respuestas:

3

La respuesta a otra pregunta también resolvió mi problema.

Los pasos que hice fueron:

  1. enable-psremoting en el servidor en un indicador de administrador de PowerShell
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI en el servidor en un indicador de administrador de PowerShell
  3. Se agregó la cuenta de servicio (o grupo de seguridad) con privilegios completos
  4. sc sdshow scmanager en el servidor en un símbolo del sistema de administración
  5. Copie la salida SDDL
  6. Añadir (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)al SDDL antes de la S: parte
  7. sc sdset scmanager THE_MODIFIED_SDDL el mío se veía así: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. Cambiar mi script de Start-ServicePowerShell para que use CmdLet en lugar de Set-Service(Set-Service no funcionó).

Parece que algo simple resultó ser, MUCHO más complicado de lo que debería haber sido ...

VolrathTheFallen
fuente