Нижче я зібрав усе, що я дізнався про запуск / зупинку служби Windows з облікового запису користувача, який не використовується адміністратором, якщо хтось повинен знати.
Перш за все, є два способи запуску / зупинки служби Windows.
1. Безпосередній доступ до послуги через вхід в обліковий запис користувача Windows. 2. Доступ до послуги через IIS за допомогою облікового запису Network Service.
Команда командного рядка для запуску / зупинки служб:
C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>
Код C # для запуску / зупинки послуг:
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));
}
Примітка 1:
Отримуючи доступ до послуги через IIS, створіть веб-додаток Visual Studio C # ASP.NET і вставте там код. Розгорніть WebService в кореневу папку IIS (C: \ inetpub \ wwwroot \), і ви готові йти. Доступ до нього за URL-адресою http: ///.
1. Метод прямого доступу
Якщо обліковий запис користувача Windows, з якого ви даєте команду або запускаєте код, не є адміністратором, тоді вам потрібно встановити привілеї для цього конкретного облікового запису користувача, щоб він мав можливість запускати та зупиняти Служби Windows. Ось як ви це робите.
Увійдіть до облікового запису адміністратора на комп’ютері, який має обліковий запис не адміністратора, з якого потрібно запустити / зупинити послугу. Відкрийте командний рядок і дайте таку команду:
C:/>sc sdshow <SERVICE_NAME>
Вихід цього буде приблизно таким:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
У ньому перераховані всі дозволи, які має кожен Користувач / Група на цьому комп’ютері стосовно.
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.
Тепер, що нам потрібно зробити, - це встановити відповідні дозволи для запуску / зупинки служб Windows для потрібних груп або користувачів. У цьому випадку нам потрібно, щоб поточний користувач, який не використовується адміністратором, мав змогу запустити / зупинити послугу, тому ми будемо встановлювати дозволи для цього користувача. Для цього нам потрібен SID цього конкретного облікового запису користувача Windows. Щоб отримати його, відкрийте Реєстр (Start> regedit) та знайдіть наступний ключ реєстру.
LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
При цьому існує окремий ключ для кожного облікового запису користувача на цьому комп’ютері, а ім'я ключа - SID кожного облікового запису. SID зазвичай мають формат S-1-5-21-2103278432-2794320136-1883075150-1000. Натисніть на кожен ключ, і ви побачите на панелі праворуч список значень для кожного ключа. Знайдіть "ProfileImagePath", і за його значенням ви можете знайти ім'я користувача, до якого належить SID. Наприклад, якщо ім'я користувача облікового запису є SACH, значення "ProfileImagePath" буде таким, як "C: \ Users \ Sach". Тому запишіть SID облікового запису користувача, на який потрібно встановити дозволи.
Примітка2:
Тут простий зразок коду C #, який можна використовувати для отримання списку вказаних ключів та його значень.
//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");
}
Тепер, коли у нас є SID облікового запису користувача, на який ми хочемо встановити дозволи, давайте перейдемо до цього. Припустимо, SID облікового запису користувача є S-1-5-21-2103278432-2794320136-1883075150-1000 . Скопіюйте вихід команди [sc sdshow] в текстовий редактор. Це буде виглядати приблизно так:
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
Тепер скопіюйте (A ;; CCLCSWRPWPDTLOCRRC ;;; SY) частину вищенаведеного тексту, і вставте його безпосередньо перед в S: (AU; ... частина тексту Потім змініть цю частину виглядати наступним чином :.
(A ;; RPWPCR ;;; S-1-5-21-2103278432-2794320136-1883075150-1000)
Потім додайте sc sdset в передній частині та додайте цитату вище цитатами. Ваша остаточна команда повинна виглядати приблизно так:
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)"
Тепер виконайте це у вашому командному рядку, і він повинен дати результат у наступному випадку:
[SC] SetServiceObjectSecurity SUCCESS
Тепер нам добре їхати! У вашому обліковому записі, який не використовується адміністратором, надано дозволи на запуск / зупинку вашої послуги! Спробуйте увійти до облікового запису користувача та запустити / зупинити послугу, і це дозволить вам це зробити.
2. Доступ через метод IIS
У цьому випадку нам потрібно надати дозвіл користувачеві IIS "Мережеві послуги" замість входу в систему для входу в систему Windows. Процедура та сама, змінитимуться лише параметри команди. Оскільки ми встановили дозвіл на "Послуги мережі", замініть SID рядком "NS" в остаточній команді sdset, яку ми використовували раніше. Заключна команда повинна виглядати приблизно так:
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)"
Виконайте це у командному рядку з облікового запису користувача адміністратора та voila! У вас є дозвіл на запуск / зупинку служби з будь-якого облікового запису користувача (незалежно від того, чи є це обліковий запис адміністратора чи ні) за допомогою WebMethod. Зверніться до Примітки1, щоб дізнатися, як це зробити.