Iniciar / detener un servicio de Windows desde una cuenta de usuario que no sea administrador

Tengo un WindowsService llamado, digamos, BST. Y debo otorgarle a un usuario que no sea administrador, UserA, los permisos para iniciar / detener este servicio en particular. Mi servicio se ejecuta en una variedad de sistemas operativos Windows, comenzando desde Windows Server 2003 a Windows 7.

¿Cómo puedo hacer esto?

Busqué en Google y encontré algunas cosas sobre cómo otorgar permisos usando el comando [sc sdset], pero no estoy seguro de los parámetros. No quiero establecer los permisos para un grupo, SÓLO para un usuario particular, UserA en este caso.

A continuación, he reunido todo lo que aprendí sobre cómo iniciar / detener un servicio de Windows desde una cuenta de usuario que no es administrador, si alguien necesita saberlo.

En primer lugar, hay dos formas de iniciar / detener un servicio de Windows. 1. Acceder directamente al servicio a través de la cuenta de usuario de Windows de inicio de sesión. 2. Acceder al servicio a través de IIS usando la cuenta del servicio de red.

Comando de línea de comando para iniciar / detener servicios:

C:/> net start  C:/> net stop  

C # Código para iniciar / detener servicios:

 ServiceController service = new ServiceController(SERVICE_NAME); //Start the service if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10.0)); } //Stop the service if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10.0)); } 

Nota 1: Al acceder al servicio a través de IIS, cree una aplicación web Visual Studio C # ASP.NET y coloque el código allí. Implemente el servicio web en la carpeta raíz de IIS (C: \ inetpub \ wwwroot \) y listo. Acceda a ella por la URL http: ///.

1. Método de acceso directo

Si la cuenta de usuario de Windows desde la que le da el comando o ejecuta el código es una cuenta que no es de administrador, debe configurar los privilegios para esa cuenta de usuario en particular, de modo que tenga la capacidad de iniciar y detener los servicios de Windows. Así es como lo haces. Inicie sesión en una cuenta de administrador en la computadora que tenga la cuenta que no es de administrador desde la cual desea iniciar / detener el servicio. Abra el símbolo del sistema y dé el siguiente comando:

 C:/>sc sdshow  

La salida de esto será algo como esto:

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

Enumera todos los permisos que tiene cada usuario / grupo en esta computadora.

 A description of one part of above command is as follows: D:(A;;CCLCSWRPWPDTLOCRRC;;;SY) It has the default owner, default group, and it has the Security descriptor control flags (A;;CCLCSWRPWPDTLOCRRC;;;SY): ace_type - "A": ACCESS_ALLOWED_ACE_TYPE, ace_flags - n/a, rights - CCLCSWRPWPDTLOCRRC, please refer to the Access Rights and Access Masks and Directory Services Access Rights CC: ADS_RIGHT_DS_CREATE_CHILD - Create a child DS object. LC: ADS_RIGHT_ACTRL_DS_LIST - Enumerate a DS object. SW: ADS_RIGHT_DS_SELF - Access allowed only after validated rights checks supported by the object are performed. This flag can be used alone to perform all validated rights checks of the object or it can be combined with an identifier of a specific validated right to perform only that check. RP: ADS_RIGHT_DS_READ_PROP - Read the properties of a DS object. WP: ADS_RIGHT_DS_WRITE_PROP - Write properties for a DS object. DT: ADS_RIGHT_DS_DELETE_TREE - Delete a tree of DS objects. LO: ADS_RIGHT_DS_LIST_OBJECT - List a tree of DS objects. CR: ADS_RIGHT_DS_CONTROL_ACCESS - Access allowed only after extended rights checks supported by the object are performed. This flag can be used alone to perform all extended rights checks on the object or it can be combined with an identifier of a specific extended right to perform only that check. RC: READ_CONTROL - The right to read the information in the object's security descriptor, not including the information in the system access control list (SACL). (This is a Standard Access Right, please read more http://msdn.microsoft.com/en-us/library/aa379607(VS.85).aspx) object_guid - n/a, inherit_object_guid - n/a, account_sid - "SY": Local system. The corresponding RID is SECURITY_LOCAL_SYSTEM_RID. 

Ahora lo que tenemos que hacer es establecer los permisos adecuados para Iniciar / Detener los servicios de Windows a los grupos o usuarios que queremos. En este caso, necesitamos que el usuario actual que no es administrador pueda Iniciar / Detener el servicio, así que vamos a establecer los permisos para ese usuario. Para hacer eso, necesitamos el SID de esa cuenta de usuario de Windows en particular. Para obtenerlo, abra el Registro (Inicio> regedit) y ubique la siguiente clave de registro.

 LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 

Debajo de eso hay una clave separada para cada una de las cuentas de cada usuario en esta computadora, y el nombre de la clave es el SID de cada cuenta. Los SID generalmente tienen el formato S-1-5-21-2103278432-2794320136-1883075150-1000. Haga clic en cada Clave, y verá en el panel de la derecha una lista de valores para cada Clave. Ubique “ProfileImagePath”, y por su valor puede encontrar el nombre de usuario al que pertenece SID. Por ejemplo, si el nombre de usuario de la cuenta es SACH, entonces el valor de “ProfileImagePath” será algo así como “C: \ Users \ Sach”. Anote el SID de la cuenta de usuario a la que desea configurar los permisos.

Nota 2: Aquí una muestra simple de código C # que se puede usar para obtener una lista de dichas claves y sus valores.

 //LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList RegistryKey RegistryKey profileList = Registry.LocalMachine.OpenSubKey(keyName); //Get a list of SID corresponding to each account on the computer string[] sidList = profileList.GetSubKeyNames(); foreach (string sid in sidList) { //Based on above names, get 'Registry Keys' corresponding to each SID RegistryKey profile = Registry.LocalMachine.OpenSubKey(Path.Combine(keyName, sid)); //SID string strSID = sid; //UserName which is represented by above SID string strUserName = (string)profile.GetValue("ProfileImagePath"); } 

Ahora que tenemos el SID de la cuenta de usuario a la que queremos establecer los permisos, empecemos. Supongamos que el SID de la cuenta de usuario es S-1-5-21-2103278432-2794320136-1883075150-1000 . Copie la salida del comando [sc sdshow] a un editor de texto. Se verá así:

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

Ahora copie la parte (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) del texto anterior, y péguelo justo antes de la S: (AU; … parte del texto. Luego cambie esa parte para que se vea así: (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

A continuación, agregue sc sdset al frente y encierre la parte anterior con comillas. Su comando final debe verse de la siguiente manera:

 sc sdset  "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)" 

Ahora ejecute esto en su símbolo del sistema, y ​​debería dar el resultado de la siguiente manera si es exitoso:

 [SC] SetServiceObjectSecurity SUCCESS 

¡Ahora estamos listos para irnos! Su cuenta de usuario que no es administrador ha recibido permisos para iniciar / detener su servicio. Intente iniciar sesión en la cuenta de usuario y en Iniciar / Detener el servicio, y debería permitirle hacer eso.

2. Acceso a través del método IIS

En este caso, debemos otorgar el permiso al usuario de IIS “Servicios de red” en lugar de la cuenta de usuario de inicio de sesión de Windows. El procedimiento es el mismo, solo se cambiarán los parámetros del comando. Desde que configuramos el permiso para “Servicios de red”, reemplace SID con la cadena “NS” en el último comando sdset que utilizamos previamente. El comando final debería verse más o menos así:

 sc sdset  "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;NS)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)" 

Ejecútelo en el símbolo del sistema de una cuenta de usuario de administrador y ¡listo! Tiene permiso para iniciar / detener el servicio desde cualquier cuenta de usuario (independientemente de si se trata de una cuenta de administrador o no) utilizando un método web. Consulte la Nota1 para descubrir cómo hacerlo.

Yo uso la utilidad SubInACL para esto. Por ejemplo, si quisiera dar al usuario el trabajo en la computadora VMX001 la capacidad de iniciar y detener el Servicio de publicación World Wide Web (también conocido como w3svc), emitiría el siguiente comando como Administrador:

subinacl.exe /service w3svc /grant=VMX001\job=PTO

Los permisos que puede otorgar se definen de la siguiente manera (lista tomada desde aquí ):

 F : Full Control R : Generic Read W : Generic Write X : Generic eXecute L : Read controL Q : Query Service Configuration S : Query Service Status E : Enumerate Dependent Services C : Service Change Configuration T : Start Service O : Stop Service P : Pause/Continue Service I : Interrogate Service U : Service User-Defined Control Commands 

Por lo tanto, al especificar PTO, estoy autorizando al usuario del trabajo Pausa / Continuar, Iniciar y Detener el servicio w3svc.

  1. Inicia sesión como administrador.
  2. Descarga subinacl.exe desde Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Otorgue permisos a la cuenta de usuario regular para administrar los servicios de BST.
    ( subinacl.exe está en C:\Program Files (x86)\Windows Resource Kits\Tools\ ).
  4. cd C:\Program Files (x86)\Windows Resource Kits\Tools\
    subinacl /SERVICE \\MachineName\bst /GRANT=domainname.com\username=F o
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Cierre sesión y vuelva a iniciar sesión como usuario. Ahora deberían poder lanzar el servicio BST.

Es significativamente más fácil otorgar permisos de administración a un servicio usando una de estas herramientas:

  • Política de grupo
  • Plantilla de seguridad
  • herramienta de línea de comandos subinacl.exe.

Aquí está el artículo de MSKB con instrucciones para Windows Server 2008 / Windows 7, pero las instrucciones son las mismas para 2000 y 2003.

Hay un GUI Tool ServiceSecurityEditor gratuito

Lo cual le permite editar los permisos del servicio de Windows. Lo he usado con éxito para dar a un usuario que no es administrador los derechos para iniciar y detener un servicio.

Había usado “sc sdset” antes de saber sobre esta herramienta.

ServiceSecurityEditor se siente como hacer trampa, es así de fácil 🙂

La herramienta de línea de comandos subinacl.exe es probablemente la única viable y muy fácil de usar de cualquier cosa en esta publicación. No puede usar un GPO con servicios que no sean del sistema y la otra opción es demasiado complicada.

El servicio de Windows se ejecuta con una cuenta de sistema local. Puede iniciarse automáticamente cuando el usuario inicia sesión en el sistema o puede iniciarse manualmente. Sin embargo, un servicio de Windows indica que BST puede ejecutarse utilizando una cuenta de usuario particular en la máquina. Esto se puede hacer de la siguiente manera: inicie services.msc y vaya a las propiedades de su servicio de Windows, BST. Desde allí, puede proporcionar los parámetros de inicio de sesión del usuario requerido. Service se ejecuta con esa cuenta de usuario y ningún otro usuario puede ejecutar ese servicio.