Domanda

Ho un servizio di windows nome, diciamo, BST. E ho bisogno di dare un utente non amministratore, UtenteA, le autorizzazioni a Start / Stop questo particolare servizio. I miei eseguito il servizio su una varietà di sistema operativo Windows, a partire da Windows Server 2003 a Windows 7.

Come posso fare questo?

I Googled e trovato alcune cose di dare autorizzazioni utilizzando il comando [sc sdset], ma io non sono esattamente sicuro sui parametri. Non voglio impostare le autorizzazioni per un gruppo, ma solo per un particolare utente, UtenteA in questo caso.

È stato utile?

Soluzione

Qui di seguito ho messo insieme tutto quello che ho imparato a conoscere Avvio / Arresto di un servizio di Windows da un account utente non amministratore, se i bisogni che nessuno sappia.

In primo luogo, ci sono due modi in cui per avviare / arrestare un servizio Windows.      1. Direttamente accedere al servizio tramite account utente di accesso di Windows.     2. Accesso al servizio tramite IIS utilizzando account servizio di rete.

Comando della riga di comando per avviare / servizi di stop:

C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>

C # Codice per avviare / servizi di stop:

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 Visual Studio C # ASP.NET Web Application e mettere il codice in là. Distribuire il servizio Web a IIS cartella principale (C: \ inetpub \ wwwroot \) e si sta bene ad andare. L'accesso è dal URL http:. ///

1. Metodo Accesso diretto

Se l'account utente di Windows da cui sia si dà il comando o eseguire il codice è un account non-Admin, allora è necessario impostare i privilegi per quel particolare account utente in modo che abbia la capacità di avviare e interrompere i servizi di Windows. Questo è come lo fai. Accesso a un account di amministratore sul computer che ha il conto non-Admin da cui si desidera Start / Stop del servizio Apri il prompt dei comandi e dare il seguente comando:.

C:/>sc sdshow <SERVICE_NAME>

Output di questo sarà qualcosa di simile:

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

Essa elenca tutte le autorizzazioni di ogni utente / gruppo in questo computer ha per quanto riguarda.

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 Windows Services per i gruppi o gli utenti che vogliamo. In questo caso abbiamo bisogno che l'utente non-Admin corrente sia in grado di avviare / arrestare il servizio in modo che stiamo per impostare le autorizzazioni per quell'utente. Per fare questo, abbiamo bisogno del SID di quel particolare account utente di Windows. Per ottenerlo, aprire il Registro di sistema (Start> regedit) e individuare la seguente chiave di registro.

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

In che c'è una chiave separato per ogni un account ogni utente in questo computer, e il nome chiave è il SID di ogni account. SID sono di solito del formato S-1-5-21-2103278432-2794320136-1883075150-1000. Fare clic su ogni chiave, e vedrete nel riquadro alla lista un diritto di valori per ogni chiave. Individuare "ProfileImagePath", e il suo valore è possibile trovare il nome utente che SID appartiene. Per esempio, se il nome utente dell'account è SACH, allora il valore di "ProfileImagePath" sarà qualcosa come "C: \ Users \ Sach". Così nota lungo il SID dell'account utente che si desidera impostare le autorizzazioni per.

Nota 2: Ecco un esempio di codice C # semplice che può essere utilizzato per ottenere un elenco di tali chiavi ei suoi 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 che desidera impostare le autorizzazioni per, veniamo al dunque. Supponiamo che il SID dell'account utente è S-1-5-21-2103278432-2794320136-1883075150-1000 . Copiare l'output del comando [sc sdshow] per un editor di testo. Si sarà simile a questa:

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

Ora, copiare il (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) una parte del testo di cui sopra, e incollarlo poco prima S: (AU .; ... parte del testo poi cambiare quella parte di simile a questa: (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Quindi aggiungere sc sdset nella parte anteriore, e racchiudono la parte sopra con le citazioni. Il comando finale dovrebbe essere simile a quanto segue:

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 eseguire questo nel vostro prompt dei comandi, e dovrebbe dare l'output come segue in caso di successo:

[SC] SetServiceObjectSecurity SUCCESS

Ora siamo pronti per partire! L'account utente non-Admin è stato concesso autorizzazioni per avvio / arresto il vostro servizio! Prova loggin all'account utente e Start / Stop del servizio e dovrebbe permettere di farlo.

2. Accessoattraverso il metodo IIS

In questo caso, abbiamo bisogno di concedere l'autorizzazione per l'utente IIS "servizi di rete" anziché l'account utente di Windows di accesso. La procedura è la stessa, solo i parametri del comando sarà cambiato. Dal momento che abbiamo impostato il permesso di "Servizi di rete", sostituire SID con la stringa "NS" in finale sdset Comando abbiamo usato in precedenza. Il comando finale dovrebbe essere simile 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)"

Esegui nel prompt dei comandi da un account utente amministratore, e voilà! Si può avviare / arrestare il servizio da qualsiasi account utente (indipendentemente dal fatto che tra l'altro un account amministratore o meno) utilizzando un WebMethod. Fare riferimento alla Nota 1 per trovare il modo di farlo.

Altri suggerimenti

Io uso il SubInACL utility per questo. Per esempio, se ho voluto dare all'utente lavoro sul computer VMX001 la capacità di avviare e arrestare il servizio World Wide Web Publishing (anche conosciuto come w3svc), vorrei eseguire il seguente comando come amministratore:

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

I permessi si può concedere sono definiti come segue (elenco tratto 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 presa di forza, mi autorizza il lavoro all'utente di mettere in pausa / Continuare, Start, e arrestare il servizio w3svc.

  1. Login come amministratore.
  2. Scarica subinacl.exe da Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx? id = 23510
  3. concedere le autorizzazioni per un utente normale di gestire la BST servizi.
    (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. Logout e riconnettersi come utente. Essi dovrebbero essere in grado di lanciare il servizio BST.

C'è uno strumento GUI gratuito ServiceSecurityEditor

che consente di modificare le autorizzazioni di servizio di Windows. Ho usato con successo per dare un utente non amministratore i diritti per avviare e arrestare un servizio.

I aveva usato "sc sdset" prima di sapere su questo strumento.

ServiceSecurityEditor sente come barare, è così facile:)

E 'molto più facile per concedere le autorizzazioni di gestione di un servizio utilizzando uno di questi strumenti:

  • Criteri di gruppo
  • modello di protezione
  • subinacl.exe strumento da riga di comando.

Ecco il MSKB articolo con le istruzioni per Windows Server 2008 / Windows 7, ma le istruzioni sono le stesse per il 2000 e il 2003.

subinacl.exe strumento da riga di comando è probabilmente l'unica possibile e molto facile da usare da qualsiasi cosa in questo post. Non puoi utilizzare un oggetto Criteri di gruppo con i servizi non di sistema e l'altra opzione è solo modo modo troppo complicato.

eseguito il servizio di Windows utilizzando un account.It sistema locale può avviare automaticamente l'utente accede al sistema oppure può essere avviato manually.However, un BST finestre servizio di esempio può essere eseguito utilizzando un account utente particolare sui machine.This può essere fatto come segue: iniziare services.msc e andare alle proprietà del servizio di Windows, BST.From ci si può dare i parametri di accesso del user.Service richiesta poi viene eseguito con l'account utente e nessun altro utente può eseguire tale servizio .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top