¿Cómo otorgo permisos de inicio / detención / reinicio en un servicio a un usuario o grupo arbitrario en un servidor que no es miembro del dominio?


61

Tenemos un conjunto de servicios de Windows que se ejecutan en nuestros servidores que realizan un montón de tareas automatizadas independientemente el uno del otro, con la excepción de un servicio que se ocupa de los otros servicios.

En el caso de que uno de los servicios no responda o se bloquee, este servicio intentará reiniciar el servicio y, si se produce una excepción durante el intento, enviará un correo electrónico al equipo de soporte para que puedan reiniciar el servicio ellos mismos.

Después de investigar un poco, me he encontrado con algunas 'soluciones' que van desde la solución mencionada en KB907460 hasta dar a la cuenta bajo la cual el servicio ejecuta derechos de administrador.

No me siento cómodo con ninguno de estos métodos: no entiendo las consecuencias del primer método como se describe en el artículo de la base de conocimiento de Microsoft, pero definitivamente no quiero dar acceso de administrador a la cuenta en la que se ejecuta el servicio .

He echado un vistazo rápido a la Política de seguridad local y, aparte de la política que define si una cuenta puede iniciar sesión como un servicio, no puedo ver nada más que parezca que se refiere a servicios.

Estamos ejecutando esto en el Servidor 2003 y el Servidor 2008, por lo que cualquier idea o puntero sería gratamente recibido.


Aclaración: no quiero otorgar la capacidad de iniciar / detener / reiniciar TODOS los servicios a un usuario o grupo determinado; quiero poder otorgar el permiso para hacerlo solo en servicios específicos , a un usuario o grupo determinado.


Aclaración adicional: los servidores en los que necesito otorgar estos permisos no pertenecen a un dominio: son dos servidores con conexión a Internet que reciben archivos, los procesan y los envían a terceros, además de servir a un par de sitios web, por lo que La directiva de grupo de Active Directory no es posible. Lamento no haberlo aclarado.


También puede echar un vistazo a este artículo de ms, que también apunta a modificaciones GP: support.microsoft.com/kb/256345

3
Lo siento, te extrañé ... Estaba ocupado. Estabas buscando algo como esto: serverfault.com/questions/15147/…
Evan Anderson

Sé que esta es una pregunta muy antigua, pero ¿consideró usar las opciones de 'recuperación' en el administrador de servicios de Windows?
Tim Long

Respuestas:


51

No parece haber una forma de hacer esto basada en la GUI a menos que esté unido a un dominio, al menos no uno que pueda encontrar en cualquier lugar, así que investigué un poco más y encontré una respuesta que funciona para Nuestra situación.

No entendí lo que significaba la representación de cadena en el artículo de la base de conocimiento, pero al investigar un poco, descubrí que se trata de la sintaxis SDDL. Más excavaciones me llevaron a este artículo de Alun Jones que explica cómo obtener el descriptor de seguridad para un servicio y qué significa cada bit. MS KB914392 tiene más detalles.

Para agregar al descriptor de seguridad existente del servicio, use sc sdshow "Service Name"para obtener el descriptor existente. Si se trata de un antiguo servicio de Windows .NET, como es el caso con el nuestro, el descriptor de seguridad debería verse así:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S:(AU;FA
;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

Necesitábamos otorgar permisos RP(para iniciar el servicio), WP(para detener el servicio), DT(pausar / continuar el servicio) y LO(para consultar el estado actual del servicio). Esto podría hacerse agregando nuestra cuenta de servicio al grupo de Usuarios avanzados, pero solo quiero otorgar acceso individual a la cuenta bajo la cual se ejecuta el servicio de mantenimiento.

Utilizando runaspara abrir un símbolo del sistema en la cuenta de servicio, ejecuté lo whoami /allque me dio el SID de la cuenta de servicio, y luego construí el SDDL adicional a continuación:

(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)

Esto luego se agrega a la sección D: de la cadena SDDL anterior:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWP
DTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSWRPWPDTLOC
RSDRCWDWO;;;WD)

Esto se aplica al servicio utilizando el sc sdsetcomando:

sc sdset "Service Name" D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;
CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU
)(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S:(AU;FA;CCDCLCSW
RPWPDTLOCRSDRCWDWO;;;WD)

Si todo va de acuerdo con el plan, el servicio se puede iniciar, detener, pausar y hacer que su estado sea consultado por el usuario definido por el SID anterior.


10
Para una manera más fácil de hacer lo mismo, debería usar SetACL.exe . Aquí hay un ejemplo de cómo usarlo para establecer permisos en un servicio:SetACL.exe -on "\\server1\W32Time" -ot srv -actn ace -ace "n:domain1\group1;p:start_stop"
Mason G. Zhwiti

2
Puede usar Process Hacker ( processhacker.sourceforge.net ) para una GUI para configurar todos los servicios. Incluye servicios ocultos y le permite configurar más configuraciones de un servicio, como la ruta binaria, y los permisos.
ygoe

1
La interfaz gráfica de CoreTech funcionó para mí. Es difícil de creer que GUI no exista en Windows ya. Leyendo las respuestas aquí, ¿cómo puede ser tan difícil? Gran falla en nombre de Microsoft.
MikeKulls

Me gusta agregar CCLCSWa los permisos SDDL (además de RPWPDTLO) para que también pueda ver el servicio enumerado cuando ejecuto Get-Service (que primero requiere modificar el SDDL para que el servicio scmanager service control manager pueda enumerar servicios accesibles) . También necesitaba SWpoder reiniciar ciertos servicios.
Baodad

34

Acabo de tener el mismo problema.
Puede usar SubInACL.exe del Kit de recursos. Descargue la utilidad independiente aquí: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23510

Use msiexec /a PathToMSIFile /qb TARGETDIR=DirectoryToExtractTopara extraer los archivos si no desea instalar el .msi

  1. Abra un símbolo del sistema como administrador
  2. Vaya al directorio donde colocó el .exe
  3. correr subinacl /service SERVICE_NAME /grant=COMPUTER_NAME\USERNAME=TOP

T = Iniciar servicio
O = Detener servicio
P = Pausar / continuar servicio

Referencia completa: Cómo otorgar a los usuarios derechos para administrar servicios en Windows 2000
o escribirsubinacl /help

Nota: no intentes, subinacl /service SERVICE_NAME /permya que podría meterte en problemas (lección aprendida: P). El nombre puede ser engañoso (perm! = Permiso), ya que elimina todos los permisos para todos los usuarios (¡incluso Admin!).


No se pueden fusionar las cuentas SO y SF, lo siento Pat.
Chopper3

@ Chopper3 Gracias por su respuesta. De hecho, tengo 2 cuentas SO: una está registrada y asociada con esta cuenta SF; la otra es una cuenta SO no registrada que tenía antes de registrarme (usaba la misma dirección de correo electrónico). Esperaba que los dos pudieran fusionarse para poder rastrear la publicación que hice antes. Como se mencionó aquí , traté de marcar una publicación pero no pude hacerlo en SO (1 reputación). Es por eso que marqué esta publicación. También intenté enviar un correo electrónico a team@stackoverflow.com hace más de dos semanas, pero no obtuve ninguna respuesta. ¿Podría dirigirme al lugar / persona correcta por favor?
patrx

1
Consulte los detalles de este procedimiento en MSDN: support.microsoft.com/?kbid=288129
Marc Climent

4

Estás buscando Configuración del equipo - Políticas - Configuración de Windows - Configuración de seguridad - Servicios del sistema

Allí no solo puede definir el tipo de inicio del servicio, sino que también puede configurar las ACL de seguridad para cada servicio. Por defecto, la interfaz solo enumerará los servicios que están instalados en la máquina en la que está ejecutando GP Editor.

Para agregar servicios que solo existen en otra máquina:

  • exportar la clave de registro del servicio desde la otra máquina
  • importar en la máquina gpedit
  • aplicar la política
  • eliminar la clave importada

Confío en que quiere hacer esto gpedit.msc, ya que la ventana "Administrar servidor" no muestra un nodo de políticas. Si es así, no puedo ver un punto por debajo del nodo Configuración de seguridad que hace referencia a "Servicios del sistema" como usted sugiere más arriba, a ambos Server 2008 o Server 2003.
abitgone

Ah, sí. Asumí que planeabas hacer estos cambios a través de la política de grupo.
Ryan Bolger

1
De hecho, estos no son servidores miembros. ¿Hay alguna forma de enfocarse en esto utilizando una política local o algún otro método?
abandonado el

2

Usé SubinAcl (como lo sugiere patrx) para poder iniciar MySQL como un usuario de dominio regular (no administrador) y ¡funciona perfectamente! (sin embargo, el comando debe ejecutarse como -Al menos local- Admin)

El comando es:

[PATH_TO_SUBACL]\subinacl.exe /service MySQL /grant=[Domain User - Without domain]=TOP

Solo tenga en cuenta que ingresé al usuario sin prefijarlo con el dominio ... de lo contrario, el comando falla al analizar el comando.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.