Abaixo, reuni tudo o que aprendi sobre Como iniciar / interromper um serviço do Windows a partir de uma conta de usuário não administrador, se alguém precisar saber.
Principalmente, existem duas maneiras pelas quais iniciar / parar um serviço do Windows.
1. Acesso direto ao serviço através da conta de usuário do Windows de logon. 2. Acessando o serviço pelo IIS usando a conta do Serviço de Rede.
Comando da linha de comandos para iniciar / parar serviços:
C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>
Código C # para iniciar / parar serviços:
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:
Ao acessar o serviço pelo IIS, crie um Aplicativo Web ASP.NET do Visual Studio C # e insira o código nele. Implante o WebService na pasta raiz do IIS (C: \ inetpub \ wwwroot \) e pronto. Acesse-o pelo URL http: ///.
1. Método de Acesso Direto
Se a Conta de Usuário do Windows a partir da qual você der o comando ou executar o código for uma conta não Administradora, será necessário definir os privilégios para essa conta de usuário específica, para que você possa iniciar e interromper os Serviços do Windows. É assim que se faz.
Faça logon em uma conta de administrador no computador em que a conta não seja de administrador na qual você deseja iniciar / parar o serviço. Abra o prompt de comando e dê o seguinte comando:
C:/>sc sdshow <SERVICE_NAME>
A saída disso será algo como isto:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Ele lista todas as permissões que cada Usuário / Grupo neste computador possui.
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.
Agora, o que precisamos fazer é definir as permissões apropriadas para Iniciar / Parar os Serviços do Windows nos grupos ou usuários que desejamos. Nesse caso, precisamos que o usuário não administrador atual possa iniciar / interromper o serviço, para definir as permissões para esse usuário. Para fazer isso, precisamos do SID dessa conta de usuário específica do Windows. Para obtê-lo, abra o Registro (Iniciar> regedit) e localize a seguinte chave do Registro.
LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
De acordo com isso, existe uma chave separada para cada conta de usuário neste computador e o nome da chave é o SID de cada conta. Os SIDs geralmente têm o formato S-1-5-21-2103278432-2794320136-1883075150-1000. Clique em cada chave e você verá no painel à direita uma lista de valores para cada chave. Localize "ProfileImagePath" e, por seu valor, você pode encontrar o nome de usuário ao qual o SID pertence. Por exemplo, se o nome de usuário da conta for SACH, o valor de "ProfileImagePath" será algo como "C: \ Users \ Sach". Portanto, anote o SID da conta de usuário para a qual você deseja definir as permissões.
Nota2:
Aqui está um exemplo simples de código C # que pode ser usado para obter uma lista das referidas chaves e seus 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");
}
Agora que temos o SID da conta de usuário para a qual queremos definir as permissões, vamos a ele. Vamos supor que o SID da conta do usuário seja S-1-5-21-2103278432-2794320136-1883075150-1000 . Copie a saída do comando [sc sdshow] para um editor de texto. Isso parecerá assim:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Agora, copie o (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) parte do texto acima, e colá-lo pouco antes do S: (UA; ... parte do texto Em seguida, altere essa parte para olhar como este:.
(A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)
Em seguida, adicione sc sdset na frente e coloque a parte acima entre aspas. Seu comando final deve se parecer com o seguinte:
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)"
Agora execute isso no prompt de comando e, se for bem-sucedido, ele deverá fornecer a saída da seguinte maneira:
[SC] SetServiceObjectSecurity SUCCESS
Agora estamos prontos! Sua conta de usuário não administrador recebeu permissões para iniciar / parar seu serviço! Tente fazer login na conta do usuário e Iniciar / Parar o serviço, e você deve fazer isso.
2. Acesso através do método IIS
Nesse caso, precisamos conceder a permissão ao usuário do IIS "Serviços de rede" em vez da conta de usuário do Windows de logon. O procedimento é o mesmo, apenas os parâmetros do comando serão alterados. Como definimos a permissão para "Serviços de rede", substitua SID pela string "NS" no comando sdset final que usamos anteriormente. O comando final deve ser algo como isto:
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)"
Execute-o no prompt de comando em uma conta de usuário Admin e pronto! Você tem permissão para iniciar / parar o serviço de qualquer conta de usuário (independentemente de ser uma conta de administrador ou não) usando um WebMethod. Consulte a Nota 1 para descobrir como fazê-lo.