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ć.