Запуск / зупинення служби Windows із облікового запису користувача, який не є адміністратором


121

У мене є WindowsService з назвою, скажімо, BST. І мені потрібно надати користувачеві, який не є адміністратором, UserA, дозволи на запуск / зупинку цієї конкретної послуги. Моя служба працює на різних ОС Windows, починаючи з Windows Server 2003 до Windows 7.

Як я можу це зробити?

Я заглянув у Google і знайшов деякі відомості про надання дозволів за допомогою команди [sc sdset], але я не точно впевнений у параметрах. Я не хочу встановлювати дозволи для групи, але ТОЛЬКО конкретному користувачеві, UserA в цьому випадку.

Відповіді:


141

Нижче я зібрав усе, що я дізнався про запуск / зупинку служби 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, щоб дізнатися, як це зробити.


11
ПРИМІТКА: ** Ви ОБОВ'ЯЗКОВЕ скопіювати результати команди shshow, виконані у вашій власній машині, а потім відредагувати відповідно до того, що я вказав. ** НЕ просто копіюйте код звідси і виконайте його на своєму комп’ютері як є.
Сак

5
Я спробував цей підхід вручну, і він спрацював чудово. Але якщо ви схожі на мене, і вам потрібно зробити це на 20+ комп’ютерах, тоді ви хочете зробити програму чи сценарій для цього. Ви можете використовувати виклики API Windows: QueryServiceObjectSecurity та SetServiceObjectSecurity . У MSDN є повний приклад застосування цього документа до акаунта "Гість"
Дрю Чапін

1
Великі кудо! Працював як шарм.
Хорст Гутманн

2
не відмовляючись від зусиль і піклування, які вклалися в цю відповідь, я думаю, що деякі з інших відповідей пропонують більш просте і пряме рішення. Якщо я не пропускаю певної переваги в цьому?
Spike0xff

1
Якщо ви робите це програмно і хочете розділити результат, sc sdshowви можете скористатися цим регулярним виразом, щоб розділити компоненти: (?:\D:)?\(.+?\)а потім вставити нову частину з SID як другу-до-останньої.
PhonicUK

115

Для цього я використовую утиліту SubInACL . Наприклад, якби я хотів , щоб дати користувачеві роботу на комп'ютерному VMX001 можливість запуску і зупинки World Wide Web Publishing Service (також відомий як W3SVC), я хотів би виконати наступну команду в якості адміністратора:

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

Дозволи, які ви можете надати, визначаються наступним чином (список, взятий звідси ):

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

Так, вказавши ВВП, я дає право на роботу користувача Pause / Continue, Пуск і зупинити w3svc служби.


18
Це найкраща відповідь. Він використовує правильний інструмент для роботи без злому в реєстрі, перекладу SID або залежно від неясного форматування ACL. Забезпечує все необхідне, щоб швидко та легко виконати роботу з достатньою деталізацією, щоб екстраполювати її на будь-який розумний сценарій.
pierce.jason

2
Чи потрібно мені перезапустити або вийти з системи / увійти, коли я це використовую?
Девід каже: Відновіть Моніку

2
@DavidGrinberg Я не пригадую, щоб коли-небудь потрібно було вимкнути та повторно ввімкнути пошкоджений обліковий запис, або перезапустити лише використання subinacl, як описано тут.
arcain

1
Можна підтвердити, що це працює на сервері 2012 року за допомогою sc \\server start|stop|query servicenameвіддаленого сервера. Не потрібно перезавантажувати \ виходити з логотипу
Stig Eide

Це працювало для запуску служби на місцях. Однак він розбився з CouldNotAccessDependentServicesдопомогою Remote PowerShell: Cannot access dependent services of '...'. Додавання E : Enumerate Dependent Servicesправ ACL виправлено це.
Віллем

42
  1. Увійдіть як адміністратор.
  2. Завантажити subinacl.exeз Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  3. Надати дозволи звичайному обліковому запису користувача для управління послугами BST.
    ( subinacl.exeє в 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 або
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. Вийдіть із системи та увійдіть назад як користувач. Тепер вони повинні мати можливість запустити послугу BST.

1
Виглядає набагато простіше і краще, ніж вручну маніпулювати конфігураціями.
gsk

1
Чи потрібен вихід?
Девід каже: Відновіть Моніку

ой! Не вдалося ... Я отримав "Помилка OpenSCManager: RPC-сервер недоступний. УВАГА: / grant = mike = f: Попередній об'єкт не відкрито". Сервіс, який я спробував, був MySQL. Перезавантаження: доступ заборонено, як ніколи.
мійський гризун

15

Є безкоштовний GUI Tool ServiceSecurityEditor

Що дозволяє редагувати дозволи Windows-сервісу. Я успішно використовував його, щоб надати користувачеві, який не є адміністратором, права на запуск та зупинку послуги.

Я раніше використовував "sc sdset", перш ніж знав про цей інструмент.

ServiceSecurityEditor відчуває себе обманом, це так просто :)


1
Я спробував ServiceSecurityEditor, виходячи з цієї рекомендації, і це чудово.
Гуру Джош

11

Набагато простіше надати сервісні дозволи для управління за допомогою одного з таких інструментів:

  • Групова політика
  • Шаблон безпеки
  • інструмент командного рядка subinacl.exe.

Ось стаття MSKB з інструкціями для Windows Server 2008 / Windows 7, але інструкції однакові для 2000 та 2003 років.


1

Інструмент командного рядка subinacl.exe - це, мабуть, єдиний життєздатний і дуже простий у використанні з будь-чого на цій посаді. Ви не можете використовувати GPO з несистемними послугами, а інший варіант - це просто складний спосіб.


-2

Служба Windows працює за допомогою локального облікового запису системи. Вона може запускатися автоматично, коли користувач увійде в систему або її можна запустити вручну. Однак сервіс Windows скаже, що BST можна запустити за допомогою певного облікового запису користувача на машині. Це можна зробити наступним чином: запустіть services.msc та перейдіть до властивостей служби Windows, BST. Звідти ви можете вказати параметри входу потрібного користувача. Сервіс потім працює з цим обліковим записом користувача, і жоден інший користувач не може запустити цю послугу.


1
Дякую за відповідь Джек. Однак це не те, що я хочу робити. Мені потрібна моя служба BST, щоб запуститись, як це робиться зараз. Мені потрібен лише будь-який користувач, який не є адміністратором, щоб мати змогу зупинити / запустити його.
Сач
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.