Starten / Beenden eines Windows-Dienstes über ein Benutzerkonto, das kein Administrator ist

121

Ich habe einen WindowsService mit dem Namen BST. Und ich muss einem Nicht-Administrator-Benutzer, UserA, die Berechtigung zum Starten / Stoppen dieses bestimmten Dienstes erteilen. Mein Dienst läuft unter verschiedenen Windows-Betriebssystemen, angefangen von Windows Server 2003 bis Windows 7.

Wie kann ich das machen?

Ich habe gegoogelt und einige Informationen zum Erteilen von Berechtigungen mit dem Befehl [sc sdset] gefunden, bin mir aber über die Parameter nicht ganz sicher. Ich möchte die Berechtigungen nicht für eine Gruppe festlegen, sondern NUR für einen bestimmten Benutzer, in diesem Fall UserA.

Sach
quelle

Antworten:

141

Im Folgenden habe ich alles zusammengestellt, was ich über das Starten / Stoppen eines Windows-Dienstes über ein Nicht-Administrator-Benutzerkonto gelernt habe, falls jemand dies wissen muss.

In erster Linie gibt es zwei Möglichkeiten, einen Windows-Dienst zu starten / zu stoppen. 1. Direkter Zugriff auf den Dienst über das Windows-Anmelde-Benutzerkonto. 2. Zugriff auf den Dienst über IIS über das Netzwerkdienstkonto.

Befehlszeilenbefehl zum Starten / Stoppen von Diensten:

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

C # -Code zum Starten / Stoppen von Diensten:

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));
}

Hinweis 1: Wenn Sie über IIS auf den Dienst zugreifen, erstellen Sie eine Visual Studio C # ASP.NET-Webanwendung und geben Sie den Code dort ein. Stellen Sie den WebService im IIS-Stammordner (C: \ inetpub \ wwwroot \) bereit, und Sie können loslegen. Greifen Sie über die URL http: /// darauf zu.

1. Direktzugriffsmethode

Wenn das Windows-Benutzerkonto, von dem aus Sie entweder den Befehl eingeben oder den Code ausführen, ein Nicht-Administratorkonto ist, müssen Sie die Berechtigungen für dieses bestimmte Benutzerkonto festlegen, damit Windows-Dienste gestartet und gestoppt werden können. Das ist wie man es macht. Melden Sie sich bei einem Administratorkonto auf dem Computer an, auf dem sich das Nicht-Administratorkonto befindet, von dem aus Sie den Dienst starten / stoppen möchten. Öffnen Sie die Eingabeaufforderung und geben Sie den folgenden Befehl ein:

C:/>sc sdshow <SERVICE_NAME>

Die Ausgabe davon wird ungefähr so ​​aussehen:

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

Es listet alle Berechtigungen auf, die jeder Benutzer / jede Gruppe auf diesem Computer in Bezug auf hat.

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.

Jetzt müssen wir die entsprechenden Berechtigungen zum Starten / Stoppen von Windows-Diensten für die gewünschten Gruppen oder Benutzer festlegen. In diesem Fall muss der aktuelle Nicht-Administrator-Benutzer den Dienst starten / stoppen können, damit wir die Berechtigungen für diesen Benutzer festlegen können. Dazu benötigen wir die SID dieses bestimmten Windows-Benutzerkontos. Um es zu erhalten, öffnen Sie die Registrierung (Start> regedit) und suchen Sie den folgenden Registrierungsschlüssel.

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

Darunter befindet sich für jedes Benutzerkonto in diesem Computer ein separater Schlüssel, und der Schlüsselname ist die SID jedes Kontos. SID haben normalerweise das Format S-1-5-21-2103278432-2794320136-1883075150-1000. Klicken Sie auf jeden Schlüssel. Im rechten Bereich wird eine Werteliste für jeden Schlüssel angezeigt. Suchen Sie "ProfileImagePath", und anhand seines Werts finden Sie den Benutzernamen, zu dem die SID gehört. Wenn der Benutzername des Kontos beispielsweise SACH lautet, lautet der Wert von "ProfileImagePath" etwa "C: \ Users \ Sach". Notieren Sie sich daher die SID des Benutzerkontos, für das Sie die Berechtigungen festlegen möchten.

Hinweis 2: Hier ein einfaches C # -Codebeispiel , mit dem eine Liste der Schlüssel und ihrer Werte abgerufen werden kann.

//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");
}

Nachdem wir nun die SID des Benutzerkontos haben, auf das wir die Berechtigungen festlegen möchten, wollen wir uns darauf konzentrieren. Angenommen , die SID des Benutzerkontos lautet S-1-5-21-2103278432-2794320136-1883075150-1000 . Kopieren Sie die Ausgabe des Befehls [sc sdshow] in einen Texteditor. Es wird so aussehen:

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

Kopieren Sie nun den Teil (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) des obigen Textes und fügen Sie ihn kurz vor dem Teil S: (AU; ... des Textes ein. Ändern Sie diesen Teil dann so, dass er wie folgt aussieht : (A. ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Dann fügen Sie sc sdset an der Front, und den obigen Teil mit Anführungszeichen setzen. Ihr letzter Befehl sollte ungefähr so ​​aussehen:

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)"

Führen Sie dies nun an Ihrer Eingabeaufforderung aus. Bei Erfolg sollte die Ausgabe wie folgt erfolgen:

[SC] SetServiceObjectSecurity SUCCESS

Jetzt können wir loslegen! Ihrem Nicht-Administrator-Benutzerkonto wurden Berechtigungen zum Starten / Stoppen Ihres Dienstes erteilt! Versuchen Sie, sich beim Benutzerkonto anzumelden und den Dienst zu starten / zu stoppen. Dies sollte Ihnen ermöglichen.

2. Zugriff über die IIS-Methode

In diesem Fall müssen wir dem IIS-Benutzer "Network Services" anstelle des Windows-Anmeldekontos die Berechtigung erteilen. Die Vorgehensweise ist dieselbe, nur die Parameter des Befehls werden geändert. Da wir die Berechtigung auf "Netzwerkdienste" gesetzt haben, ersetzen Sie die SID durch die Zeichenfolge "NS" im letzten Befehl sdset, den wir zuvor verwendet haben. Der letzte Befehl sollte ungefähr so ​​aussehen:

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)"

Führen Sie es in der Eingabeaufforderung von einem Admin-Benutzerkonto aus, und voila! Sie haben die Berechtigung, den Dienst über ein beliebiges Benutzerkonto (unabhängig davon, ob es sich um ein Administratorkonto handelt oder nicht) mithilfe einer WebMethod zu starten / zu stoppen. Informationen dazu finden Sie in Anmerkung 1.

Sach
quelle
11
HINWEIS: ** Sie MÜSSEN die Ergebnisse des Befehls shshow kopieren, der auf Ihrem eigenen Computer ausgeführt wird, und dann gemäß den Angaben bearbeiten. ** Kopieren Sie den Code NICHT einfach von hier und führen Sie ihn so aus, wie er ist.
Sach
5
Ich habe diesen manuellen Ansatz ausprobiert und er hat hervorragend funktioniert. Aber wenn Sie wie ich sind und dies auf über 20 Computern tun müssen, möchten Sie ein Programm oder ein Skript, um dies zu tun. Sie können die Windows-API-Aufrufe QueryServiceObjectSecurity und SetServiceObjectSecurity verwenden . MSDN hat ein vollständiges Beispiel für die Anwendung auf das "Gast" -Konto
Drew Chapin
1
Ein großes Lob! Lief wie am Schnürchen.
Horst Gutmann
2
Ich denke, einige der anderen Antworten bieten eine einfachere und direktere Lösung, um den Aufwand und die Sorgfalt, die mit dieser Antwort verbunden waren, nicht zu beeinträchtigen. Es sei denn, ich vermisse einen Vorteil davon?
Spike0xff
1
Wenn Sie dies programmgesteuert tun und die Ausgabe von aufteilen möchten, sc sdshowkönnen Sie diesen regulären Ausdruck verwenden, um die Komponenten aufzuteilen: (?:\D:)?\(.+?\)und dann den neuen Teil mit der SID als vorletzten einfügen.
PhonicUK
115

Ich benutze dafür das Dienstprogramm SubInACL . Zum Beispiel, wenn ich will , um den Benutzer geben Job auf dem Computer VMX001 die Fähigkeit zum Starten und Stoppen des World Wide Web - Publishing - Dienstes (auch als w3svc), würde ich den folgenden Befehl als Administrator erteilen:

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

Die Berechtigungen, die Sie erteilen können, sind wie folgt definiert (Liste von hier ):

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

Also, durch PTO Angabe, ich bin berechtigt , den Job Benutzer Pause / Weiter, Start und Stopp des w3svc - Dienst.

Arcain
quelle
18
Dies ist die beste Antwort. Es verwendet das richtige Tool für den Job, ohne in der Registrierung herumzuhacken, SIDs zu übersetzen oder abhängig von der unklaren ACL-Formatierung. Bietet alles, was erforderlich ist, um die Aufgabe schnell und einfach zu erledigen, mit genügend Details, um sie auf jedes vernünftige Szenario zu extrapolieren.
pierce.jason
2
Muss ich neu starten oder mich abmelden / anmelden, wenn ich dies verwende?
David sagt Reinstate Monica
2
@DavidGrinberg Ich kann mich nicht erinnern, jemals das betroffene Konto abmelden und dann wieder einschalten zu müssen oder neu starten zu müssen, wenn nur subinacl wie hier beschrieben verwendet wird.
Arcain
1
Kann bestätigen, dass dies auf einem 2012-Server funktioniert, der sc \\server start|stop|query servicenamevom Remote-Server verwendet wird. Kein Neustart \ Abmelden erforderlich
Stig Eide
Dies funktionierte, um einen Dienst vor Ort zu starten. Es stürzte jedoch mit CouldNotAccessDependentServicesRemote-Powershell ab : Cannot access dependent services of '...'. Durch Hinzufügen E : Enumerate Dependent Serviceszu den ACL-Rechten wurde dies behoben.
Willem
42
  1. Melden Sie sich als Administrator an.
  2. Download subinacl.exevon Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Erteilen Sie dem regulären Benutzerkonto Berechtigungen zum Verwalten der BST-Dienste.
    ( subinacl.exeist 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 oder
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Melden Sie sich ab und wieder als Benutzer an. Sie sollten nun in der Lage sein, den BST-Dienst zu starten.
Venkat
quelle
1
Sieht viel einfacher und besser aus, als die Konfigurationen manuell zu bearbeiten.
gsk
1
Ist die Abmeldung erforderlich?
David sagt Reinstate Monica
Hoppla! Fehlgeschlagen ... Ich habe "Fehler OpenSCManager: Der RPC-Server ist nicht verfügbar. WARNUNG: / grant = mike = f: Kein vorheriges Objekt geöffnet". Der Dienst, den ich ausprobiert habe, war MySQL. Neustart: Der Zugriff wird wie immer verweigert.
Mike Nagetier
15

Es gibt ein kostenloses GUI-Tool ServiceSecurityEditor

Hiermit können Sie Windows-Dienstberechtigungen bearbeiten. Ich habe es erfolgreich verwendet, um einem Nicht-Administrator-Benutzer die Rechte zum Starten und Stoppen eines Dienstes zu erteilen.

Ich hatte "sc sdset" verwendet, bevor ich von diesem Tool wusste.

ServiceSecurityEditor hat Lust zu schummeln, so einfach ist das :)

FCW
quelle
1
Ich habe ServiceSecurityEditor basierend auf dieser Empfehlung ausprobiert und es ist ausgezeichnet.
Guru Josh
11

Mit einem der folgenden Tools ist es wesentlich einfacher, einem Dienst Verwaltungsberechtigungen zu erteilen:

  • Gruppenrichtlinie
  • Sicherheitsvorlage
  • Befehlszeilentool subinacl.exe.

Hier ist der MSKB-Artikel mit Anweisungen für Windows Server 2008 / Windows 7, die Anweisungen sind jedoch für 2000 und 2003 identisch.

Ryan Fisher
quelle
1

Das Befehlszeilentool subinacl.exe ist wahrscheinlich das einzige brauchbare und sehr einfach zu verwendende Tool in diesem Beitrag. Sie können kein Gruppenrichtlinienobjekt mit Nicht-Systemdiensten verwenden, und die andere Option ist viel zu kompliziert.

JustAGuy
quelle
-2

Der Windows-Dienst wird mit einem lokalen Systemkonto ausgeführt. Er kann automatisch gestartet werden, wenn sich der Benutzer beim System anmeldet, oder er kann manuell gestartet werden. Ein Windows-Dienst gibt jedoch an, dass BST mit einem bestimmten Benutzerkonto auf dem Computer ausgeführt werden kann. Dies kann durchgeführt werden Gehen Sie wie folgt vor: Starten Sie services.msc und rufen Sie die Eigenschaften Ihres Windows-Dienstes BST auf. Von dort aus können Sie die Anmeldeparameter des erforderlichen Benutzers angeben. Der Dienst wird dann mit diesem Benutzerkonto ausgeführt, und kein anderer Benutzer kann diesen Dienst ausführen.

Jack Sparrow
quelle
1
Danke für die Antwort Jack. Es ist jedoch nicht das, was ich tun möchte. Ich brauche meinen Dienst BST, um so zu laufen wie jetzt. Ich brauche nur einen Benutzer, der kein Administrator ist, um es stoppen / starten zu können.
Sach