A continuación, he reunido todo lo que aprendí sobre Iniciar / Detener un servicio de Windows desde una cuenta de usuario que no sea administrador, si alguien necesita saberlo.
Principalmente, 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. Accediendo al servicio a través de IIS utilizando la cuenta del Servicio de red.
Comando de línea de comando para iniciar / detener servicios:
C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>
Código C # 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 de 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 estará listo. Acceda 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 no es una cuenta de administrador, entonces debe establecer los privilegios para esa cuenta de usuario en particular para que pueda iniciar y detener los servicios de Windows. Así es como lo haces.
Inicie sesión en una cuenta de administrador en la computadora que tiene la cuenta que no es de administrador desde la que desea iniciar / detener el servicio. Abre el símbolo del sistema y da el siguiente comando:
C:/>sc sdshow <SERVICE_NAME>
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 cada usuario / grupo en esta computadora tiene con respecto.
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 debemos hacer es establecer los permisos apropiados para Iniciar / Detener los Servicios de Windows para los grupos o usuarios que queramos. En este caso, necesitamos que el usuario actual no administrador pueda iniciar / detener el servicio, por lo 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 busque la siguiente clave de registro.
LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
Debajo hay una clave separada para cada cuenta de 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. Busque "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, el valor de "ProfileImagePath" será algo así como "C: \ Users \ Sach". Por lo tanto, anote el SID de la cuenta de usuario para la que desea establecer los permisos.
Nota 2:
Aquí hay una muestra de código C # simple 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 para la que queremos establecer los permisos, vamos a hacerlo. 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] en 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)
Luego agregue sc sdset en el frente y encierre la parte anterior con comillas. Su comando final debería parecerse a lo siguiente:
sc sdset <SERVICE_NAME> "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 tiene éxito:
[SC] SetServiceObjectSecurity SUCCESS
¡Ahora estamos listos para irnos! ¡Su cuenta de usuario no administrador ha recibido permisos para iniciar / detener su servicio! Intente iniciar sesión en la cuenta de usuario e iniciar / detener el servicio y debería permitirle hacerlo.
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 iniciar sesión en la cuenta de usuario de Windows. El procedimiento es el mismo, solo se cambiarán los parámetros del comando. Como configuramos el permiso para "Servicios de red", reemplace SID con la cadena "NS" en el comando sdset final que usamos anteriormente. El comando final debería verse así:
sc sdset <SERVICE_NAME> "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 desde una cuenta de usuario 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 Nota 1 para saber cómo hacerlo.