Uruchom / zatrzymaj usługę systemu Windows z konta użytkownika innego niż Administrator

121

Mam usługę WindowsService o nazwie, powiedzmy, BST. I muszę przyznać użytkownikowi niebędącemu administratorem, UserA, uprawnienia do uruchamiania / zatrzymywania tej konkretnej usługi. Moja usługa działa w różnych systemach operacyjnych Windows, od Windows Server 2003 do Windows 7.

W jaki sposób mogę to zrobić?

Wyszukałem w Google i znalazłem trochę informacji na temat nadawania uprawnień za pomocą polecenia [sc sdset], ale nie jestem dokładnie pewien parametrów. Nie chcę ustawiać uprawnień dla grupy, ale TYLKO dla konkretnego użytkownika, w tym przypadku użytkownika A.

Sach
źródło

Odpowiedzi:

141

Poniżej zebrałem wszystko, czego dowiedziałem się o uruchamianiu / zatrzymywaniu usługi Windows z konta użytkownika innego niż administrator, jeśli ktoś musi wiedzieć.

Przede wszystkim istnieją dwa sposoby uruchamiania / zatrzymywania usługi systemu Windows. 1. Bezpośredni dostęp do usługi za pośrednictwem konta logowania użytkownika systemu Windows. 2. Dostęp do usługi przez IIS przy użyciu konta Usługa sieciowa.

Polecenie wiersza poleceń do uruchamiania / zatrzymywania usług:

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

Kod C # do uruchamiania / zatrzymywania usług:

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

Uwaga 1: uzyskując dostęp do usługi za pośrednictwem usług IIS, utwórz aplikację sieci Web Visual Studio C # ASP.NET i umieść w niej kod. Wdróż usługę sieci Web w folderze głównym usług IIS (C: \ inetpub \ wwwroot \) i gotowe. Dostęp do niego przez adres URL http: ///.

1. Metoda bezpośredniego dostępu

Jeśli konto użytkownika systemu Windows, z którego wydasz polecenie lub uruchomisz kod, nie jest kontem administratora, musisz ustawić uprawnienia dla tego konkretnego konta użytkownika, aby miało możliwość uruchamiania i zatrzymywania usług systemu Windows. Tak to się robi. Zaloguj się do konta administratora na komputerze, na którym znajduje się konto inne niż Admin, z którego chcesz uruchomić / zatrzymać usługę. Otwórz wiersz polecenia i wydaj następujące polecenie:

C:/>sc sdshow <SERVICE_NAME>

Wynik tego będzie mniej więcej taki:

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

Zawiera listę wszystkich uprawnień, które ma każdy użytkownik / grupa na tym komputerze.

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.

Teraz musimy ustawić odpowiednie uprawnienia do uruchamiania / zatrzymywania usług systemu Windows wybranym grupom lub użytkownikom. W tym przypadku potrzebujemy, aby bieżący użytkownik niebędący administratorem mógł uruchomić / zatrzymać usługę, więc zamierzamy ustawić uprawnienia dla tego użytkownika. Aby to zrobić, potrzebujemy identyfikatora SID tego konkretnego konta użytkownika systemu Windows. Aby go uzyskać, otwórz Rejestr (Start> regedit) i zlokalizuj następujący klucz rejestru.

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

Zgodnie z tym istnieje osobny klucz dla każdego konta użytkownika na tym komputerze, a nazwa klucza to identyfikator SID każdego konta. Identyfikatory SID mają zwykle format S-1-5-21-2103278432-2794320136-1883075150-1000. Kliknij każdy klucz, a zobaczysz w okienku po prawej stronie listę wartości dla każdego klucza. Zlokalizuj „ProfileImagePath”, a po jego wartości możesz znaleźć nazwę użytkownika, do której należy SID. Na przykład, jeśli nazwa użytkownika konta to SACH, wówczas wartość „ProfileImagePath” będzie miała postać „C: \ Users \ Sach”. Zanotuj więc identyfikator SID konta użytkownika, dla którego chcesz ustawić uprawnienia.

Uwaga 2: Tutaj prosty przykład kodu C #, którego można użyć do uzyskania listy wspomnianych kluczy i ich wartości.

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

Teraz, gdy mamy już identyfikator SID konta użytkownika, dla którego chcemy ustawić uprawnienia, przejdźmy do tego. Załóżmy, że identyfikator SID konta użytkownika to S-1-5-21-2103278432-2794320136-1883075150-1000 . Skopiuj dane wyjściowe polecenia [sc sdshow] do edytora tekstu. Będzie to wyglądać tak:

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

Teraz, skopiuj (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) część powyższego tekstu i wklej go tuż przed tym S: (AU; ... część tekstu Następnie zmień tę część, która wygląda tak:. (A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)

Następnie dodaj sc sdset z przodu i zamknij powyższą część w cudzysłów. Twoje ostatnie polecenie powinno wyglądać mniej więcej tak:

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

Teraz wykonaj to w wierszu poleceń i powinno dać wynik w następujący sposób, jeśli się powiedzie:

[SC] SetServiceObjectSecurity SUCCESS

Teraz możemy już iść! Twoje konto użytkownika niebędącego administratorem otrzymało uprawnienia do uruchamiania / zatrzymywania usługi! Spróbuj zalogować się na konto użytkownika i uruchomić / zatrzymać usługę, a to powinno Ci na to pozwolić.

2. Dostęp za pośrednictwem metody IIS

W takim przypadku musimy przyznać uprawnienia użytkownikowi IIS „Usługi sieciowe” zamiast logowanemu kontu użytkownika systemu Windows. Procedura jest taka sama, tylko parametry polecenia zostaną zmienione. Ponieważ ustawiliśmy uprawnienia na „Usługi sieciowe”, zamień SID na ciąg „NS” w ostatnim poleceniu sdset, którego używaliśmy wcześniej. Ostateczna komenda powinna wyglądać mniej więcej tak:

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

Uruchom go w wierszu poleceń z konta użytkownika Admin i voila! Masz uprawnienia do uruchamiania / zatrzymywania usługi z dowolnego konta użytkownika (niezależnie od tego, czy jest to konto administratora, czy nie) przy użyciu metody WebMethod. Zobacz Uwaga 1, aby dowiedzieć się, jak to zrobić.

Sach
źródło
11
UWAGA: ** MUSISZ skopiować wyniki polecenia shshow wykonanego na własnym komputerze, a następnie edytować zgodnie z tym, co podałem . ** NIE kopiuj kodu stąd i nie wykonuj go na swoim komputerze tak, jak jest.
Sach
5
Wypróbowałem to ręczne podejście i zadziałało świetnie. Ale jeśli jesteś podobny do mnie i musisz to zrobić na ponad 20 komputerach, będziesz potrzebować programu lub skryptu, który to zrobi. Możesz użyć wywołań interfejsu API systemu Windows QueryServiceObjectSecurity i SetServiceObjectSecurity . MSDN ma pełny przykład zastosowania tego do konta „Gość”
Drew Chapin
1
Wielkie brawa! Działał jak urok.
Horst Gutmann
2
Aby nie odrywać wysiłku i troski, jakie włożono w tę odpowiedź, myślę, że niektóre inne odpowiedzi oferują prostsze i bardziej bezpośrednie rozwiązanie. Chyba że brakuje mi z tego jakiejś korzyści?
Spike0xff
1
Jeśli robisz to programowo i chcesz podzielić dane wyjściowe sc sdshow, możesz użyć tego wyrażenia regularnego, aby podzielić komponenty: (?:\D:)?\(.+?\)a następnie wstaw nową część z identyfikatorem SID jako przedostatnią.
PhonicUK
116

Używam do tego narzędzia SubInACL . Na przykład, gdybym chciał dać użytkownikowi pracę na komputerze VMX001 możliwość uruchamiania i zatrzymywania usługi publikowania w sieci World Wide Web (znanej również jako w3svc), wydałbym następujące polecenie jako Administrator:

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

Uprawnienia, które możesz przyznać, są zdefiniowane w następujący sposób (lista zaczerpnięta z tego miejsca ):

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

Tak więc, określając PTO, upoważniam użytkownika zadania do wstrzymania / kontynuowania, uruchamiania i zatrzymywania usługi w3svc.

arcain
źródło
18
To najlepsza odpowiedź. Używa odpowiedniego narzędzia do tego zadania bez włamywania się do rejestru, tłumaczenia identyfikatorów SID lub polegania na niejasnym formatowaniu ACL. Zapewnia wszystko, co jest potrzebne do szybkiego i łatwego wykonania pracy, z wystarczającą szczegółowością, aby ekstrapolować ją na dowolny rozsądny scenariusz.
pierce.jason
2
Czy muszę ponownie uruchamiać lub wylogowywać / logować się, gdy tego używam?
David mówi „Przywróć Monikę”
2
@DavidGrinberg Nie przypominam sobie, by kiedykolwiek musiałem wylogować się z konta, którego dotyczy problem, i ponownie go włączyć, ani konieczności ponownego uruchamiania, gdy używam tylko subinacl, jak opisano tutaj.
arcain
1
Potwierdzam, że to działa na serwerze 2012 przy użyciu sc \\server start|stop|query servicenamezdalnego serwera. Nie potrzeba ponownego uruchomienia \ wylogowania
Stig Eide
To zadziałało, aby uruchomić usługę lokalnie. Jednak rozbił się przy CouldNotAccessDependentServicesużyciu zdalnego PowerShell: Cannot access dependent services of '...'. Dodanie E : Enumerate Dependent Servicesdo praw ACL rozwiązało ten problem.
Willem
42
  1. Zaloguj się jako administrator.
  2. Pobierz subinacl.exez firmy Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Przyznaj uprawnienia zwykłemu użytkownikowi do zarządzania usługami BST.
    ( subinacl.exejest w 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 lub
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Wyloguj się i zaloguj ponownie jako użytkownik. Powinni teraz móc uruchomić usługę BST.
Venkat
źródło
1
Wygląda znacznie łatwiej i lepiej niż ręczne manipulowanie konfiguracjami.
gsk,
1
Czy wylogowanie jest wymagane?
David mówi „Przywróć Monikę”
ups! Niepowodzenie ... Otrzymałem komunikat „Błąd OpenSCManager: serwer RPC jest niedostępny. OSTRZEŻENIE: / grant = mike = f: Nie otwarto żadnego poprzedniego obiektu”. Usługa, którą wypróbowałem, to MySQL. Reboot: odmowa dostępu, jak zawsze.
mike gryzoń
15

Dostępny jest bezpłatny GUI Tool ServiceSecurityEditor

Co pozwala na edycję uprawnień usługi Windows. Z powodzeniem użyłem go, aby nadać użytkownikowi niebędącemu administratorem prawa do uruchamiania i zatrzymywania usługi.

Użyłem „sc sdset”, zanim dowiedziałem się o tym narzędziu.

ServiceSecurityEditor ma ochotę oszukiwać, to takie proste :)

FCW
źródło
1
Wypróbowałem ServiceSecurityEditor na podstawie tego zalecenia i jest doskonały.
Guru Josh
11

Znacznie łatwiej jest przyznać uprawnienia do zarządzania usługą za pomocą jednego z tych narzędzi:

  • Zasady grupy
  • Szablon bezpieczeństwa
  • Narzędzie wiersza polecenia subinacl.exe.

Oto artykuł MSKB z instrukcjami dla systemu Windows Server 2008 / Windows 7, ale instrukcje są takie same dla 2000 i 2003.

Ryan Fisher
źródło
1

Narzędzie wiersza poleceń subinacl.exe jest prawdopodobnie jedynym wykonalnym i bardzo łatwym w użyciu z czegokolwiek w tym poście. Nie możesz używać obiektu zasad grupy z usługami niesystemowymi, a druga opcja jest po prostu zbyt skomplikowana.

JustAGuy
źródło
-2

Usługa Windows działa przy użyciu lokalnego konta systemowego i może zostać uruchomiona automatycznie, gdy użytkownik loguje się do systemu, lub może zostać uruchomiona ręcznie, jednak usługa Windows mówi, że BST można uruchomić przy użyciu określonego konta użytkownika na komputerze. w następujący sposób: uruchom services.msc i przejdź do właściwości swojej usługi systemu Windows, BST, Stamtąd możesz podać parametry logowania wymaganego użytkownika. Usługa działa wtedy z tym kontem użytkownika i żaden inny użytkownik nie może jej uruchomić.

Jack Sparrow
źródło
1
Dzięki za odpowiedź Jack. Jednak to nie jest to, co chcę robić. Chcę, aby moja usługa BST działała tak, jak teraz. Potrzebuję tylko użytkownika, który nie jest administratorem, aby móc go zatrzymać / uruchomić.
Sach