Di seguito ho raccolto tutto ciò che ho imparato sull'avvio / arresto di un servizio Windows da un account utente non amministratore, se qualcuno ha bisogno di saperlo.
Principalmente, ci sono due modi per avviare / arrestare un servizio Windows.
1. Accesso diretto al servizio tramite l'accesso all'account utente di Windows. 2. Accesso al servizio tramite IIS utilizzando l'account Servizio di rete.
Comando della riga di comando per avviare / arrestare i servizi:
C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>
Codice C # per avviare / arrestare i servizi:
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:
quando si accede al servizio tramite IIS, creare un'applicazione Web ASP.NET di Visual Studio C # e inserire il codice. Distribuisci il servizio Web nella cartella principale di IIS (C: \ inetpub \ wwwroot \) e sei a posto. Accedi tramite l'URL http: ///.
1. Metodo di accesso diretto
Se l'account utente di Windows da cui si dà il comando o si esegue il codice è un account non amministratore, è necessario impostare i privilegi su quel particolare account utente in modo che abbia la capacità di avviare e arrestare i servizi di Windows. Ecco come lo fai.
Accedi a un account amministratore sul computer che dispone dell'account non amministratore da cui desideri avviare / arrestare il servizio. Apri il prompt dei comandi e dai il seguente comando:
C:/>sc sdshow <SERVICE_NAME>
L'output di questo sarà qualcosa del genere:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Elenca tutte le autorizzazioni di cui dispone ogni utente / gruppo su questo computer.
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.
Ora quello che dobbiamo fare è impostare le autorizzazioni appropriate per avviare / arrestare i servizi di Windows per i gruppi o gli utenti che desideriamo. In questo caso, è necessario che l'attuale utente non amministratore sia in grado di avviare / arrestare il servizio, quindi imposteremo le autorizzazioni per quell'utente. Per fare ciò, abbiamo bisogno del SID di quel particolare account utente di Windows. Per ottenerlo, apri il Registro (Start> regedit) e individua la seguente chiave di registro.
LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
Sotto questo c'è una chiave separata per ogni account utente in questo computer, e il nome della chiave è il SID di ogni account. I SID sono generalmente nel formato S-1-5-21-2103278432-2794320136-1883075150-1000. Fai clic su ciascuna chiave e vedrai nel riquadro a destra un elenco di valori per ciascuna chiave. Individua "ProfileImagePath" e in base al suo valore puoi trovare il nome utente a cui appartiene il SID. Ad esempio, se il nome utente dell'account è SACH, il valore di "ProfileImagePath" sarà qualcosa come "C: \ Users \ Sach". Quindi annota il SID dell'account utente su cui desideri impostare le autorizzazioni.
Nota 2:
qui un semplice esempio di codice C # che può essere utilizzato per ottenere un elenco di tali chiavi e dei relativi valori.
//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");
}
Ora che abbiamo il SID dell'account utente su cui vogliamo impostare i permessi, passiamo ad esso. Supponiamo che il SID dell'account utente sia S-1-5-21-2103278432-2794320136-1883075150-1000 . Copiare l'output del comando [sc sdshow] in un editor di testo. Sarà simile a questo:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Ora, copia la parte (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) del testo sopra e incollala appena prima della S: (AU; ... parte del testo. Quindi cambia quella parte in questo modo:
(A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)
Quindi aggiungi sc sdset in primo piano e racchiudi la parte sopra tra virgolette. Il tuo comando finale dovrebbe essere simile al seguente:
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)"
Ora eseguilo nel tuo prompt dei comandi e dovrebbe dare l'output come segue se ha successo:
[SC] SetServiceObjectSecurity SUCCESS
Adesso siamo a posto! Al tuo account utente non amministratore sono state concesse le autorizzazioni per avviare / interrompere il servizio! Prova ad accedere all'account utente e ad avviare / interrompere il servizio e dovrebbe consentirti di farlo.
2. Accesso tramite il metodo IIS
In questo caso, dobbiamo concedere l'autorizzazione all'utente IIS "Servizi di rete" invece che all'account utente di Windows di accesso. La procedura è la stessa, verranno modificati solo i parametri del comando. Dato che abbiamo impostato l'autorizzazione su "Servizi di rete", sostituisci SID con la stringa "NS" nel comando sdset finale che abbiamo usato in precedenza. Il comando finale dovrebbe assomigliare a questo:
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)"
Eseguilo nel prompt dei comandi da un account utente amministratore e voilà! Hai l'autorizzazione per avviare / interrompere il servizio da qualsiasi account utente (indipendentemente dal fatto che si tratti di un account amministratore o meno) utilizzando un metodo Web. Fare riferimento alla Nota 1 per scoprire come farlo.