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.