Avvia / arresta un servizio Windows da un account utente non amministratore


121

Ho un WindowsService denominato, ad esempio, BST. E devo fornire a un utente non amministratore, UtenteA, le autorizzazioni per avviare / arrestare questo particolare servizio. Il mio servizio funziona su una varietà di sistemi operativi Windows, a partire da Windows Server 2003 a Windows 7.

Come posso fare questo?

Ho cercato su Google e ho trovato alcune cose su come concedere i permessi utilizzando il comando [sc sdset], ma non sono esattamente sicuro dei parametri. Non voglio impostare i permessi per un gruppo, ma SOLO per un particolare utente, in questo caso UtenteA.

Risposte:


141

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.


11
NOTA: ** È NECESSARIO copiare i risultati del comando shshow eseguito nella propria macchina e quindi modificare in base a quanto specificato. ** NON copiare semplicemente il codice da qui ed eseguirlo sul tuo computer così com'è.
Sach

5
Ho provato questo approccio manuale e ha funzionato magnificamente. Ma se sei come me e hai bisogno di farlo su più di 20 computer, allora vorrai un programma o uno script per farlo. È possibile utilizzare le chiamate API di Windows QueryServiceObjectSecurity e SetServiceObjectSecurity . MSDN ha un esempio
Drew Chapin

1
Grandi complimenti! Ha funzionato come un fascino.
Horst Gutmann

2
per non togliere lo sforzo e la cura che è andato in questa risposta, penso che alcune delle altre risposte offrano una soluzione più semplice e più diretta. A meno che non mi manchi qualche vantaggio?
Spike0xff

1
Se lo stai facendo in modo programmatico e vuoi dividere l'output da sc sdshowpuoi usare questa regex per dividere i componenti: (?:\D:)?\(.+?\)e quindi inserire la nuova parte con il SID come penultima.
PhonicUK

115

Uso l' utilità SubInACL per questo. Ad esempio, se volessi dare al lavoro dell'utente sul computer VMX001 la possibilità di avviare e arrestare il servizio di pubblicazione sul Web (noto anche come w3svc), emetterei il seguente comando come amministratore:

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

I permessi che puoi concedere sono definiti come segue (elenco preso da qui ):

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

Quindi, specificando PTO, autorizzo l' utente del lavoro a Pausa / Continua, Avvia e Arresta il servizio w3svc.


18
Questa è la migliore risposta. Utilizza lo strumento giusto per il lavoro senza hackerare il registro, tradurre SID o a seconda della formattazione ACL oscura. Fornisce tutto ciò che è necessario per portare a termine il lavoro in modo rapido e semplice con dettagli sufficienti per estrapolarlo a qualsiasi scenario ragionevole.
pierce.jason

2
Devo riavviare o disconnettermi / accedere quando lo uso?
David dice Reinstate Monica

2
@DavidGrinberg Non ricordo di aver mai avuto bisogno di disconnettere e riaccendere l'account interessato, o di dover riavviare quando si utilizza solo subinacl come descritto qui.
arcain

1
Posso confermare che funziona sul server 2012 utilizzando sc \\server start|stop|query servicenamedal server remoto. Nessun riavvio \ disconnessione necessaria
Stig Eide

Questo ha funzionato per avviare un servizio localmente. Tuttavia si è schiantato con CouldNotAccessDependentServicesutilizzando PowerShell remoto: Cannot access dependent services of '...'. L'aggiunta E : Enumerate Dependent Servicesai diritti ACL ha risolto il problema.
Willem

42
  1. Accedi come amministratore.
  2. Scarica subinacl.exeda Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Concedi le autorizzazioni all'account utente normale per gestire i servizi BST.
    ( subinacl.exeè in 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. Esci e accedi di nuovo come utente. Ora dovrebbero essere in grado di avviare il servizio BST.

1
Sembra molto più semplice e migliore della manipolazione manuale delle configurazioni.
gsk

1
È richiesto il logout?
David dice Reinstate Monica

whoops! Non riuscito ... Ho ricevuto "Errore OpenSCManager: il server RPC non è disponibile. ATTENZIONE: / grant = mike = f: Nessun oggetto precedente aperto". Il servizio che ho provato è stato MySQL. Riavvio: l'accesso è negato, come sempre.
mike rodent

15

È disponibile uno strumento GUI gratuito ServiceSecurityEditor

Che ti consente di modificare le autorizzazioni del servizio Windows. L'ho usato con successo per dare a un utente non amministratore i diritti per avviare e interrompere un servizio.

Avevo usato "sc sdset" prima di conoscere questo strumento.

ServiceSecurityEditor si sente come barare, è così facile :)


1
Ho provato ServiceSecurityEditor sulla base di questa raccomandazione ed è eccellente.
Guru Josh

11

È molto più semplice concedere le autorizzazioni di gestione a un servizio utilizzando uno di questi strumenti:

  • Politica di gruppo
  • Modello di sicurezza
  • strumento da riga di comando subinacl.exe.

Di seguito è riportato l' articolo MSKB con le istruzioni per Windows Server 2008 / Windows 7, ma le istruzioni sono le stesse per il 2000 e il 2003.


1

Lo strumento da riga di comando subinacl.exe è probabilmente l'unico valido e molto facile da usare da qualsiasi cosa in questo post. Non puoi usare un GPO con servizi non di sistema e l'altra opzione è semplicemente troppo complicata.


-2

Il servizio Windows viene eseguito utilizzando un account di sistema locale.Può avviarsi automaticamente quando l'utente accede al sistema o può essere avviato manualmente.Tuttavia, un servizio Windows afferma che BST può essere eseguito utilizzando un particolare account utente sulla macchina. come segue: avvia services.msc e vai alle proprietà del tuo servizio Windows, BST. Da lì puoi fornire i parametri di accesso dell'utente richiesto. Il servizio quindi viene eseguito con quell'account utente e nessun altro utente può eseguire quel servizio.


1
Grazie per la risposta Jack. Tuttavia non è quello che voglio fare. Ho bisogno che il mio servizio BST funzioni come ora. Ho solo bisogno di qualsiasi utente che non sia un amministratore per poterlo arrestare / avviare.
Sach
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.