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

У меня есть WindowsService с именем, скажем, BST. И мне нужно предоставить пользователю, не являющемуся Администратором, UserA, разрешения для запуска/остановки этой конкретной службы. Моя служба работает с различными ОС Windows, начиная с Windows Server 2003 до Windows 7.

Как я могу это сделать?

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

Ответ 1

Ниже я собрал все, что я узнал о запуске/остановке службы Windows из учетной записи пользователя, не являющейся администратором, если кто-то должен знать.

В первую очередь, есть два способа запуска/остановки службы Windows.    1. Прямой доступ к сервису с помощью учетной записи пользователя Windows.   2. Доступ к службе через IIS с использованием учетной записи Network Service.

Командная строка для запуска/остановки служб:

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

Код С# для запуска/остановки служб:

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 С# 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 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. Чтобы получить его, откройте реестр (Пуск > 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: Вот простой пример кода С#, который можно использовать для получения списка указанных ключей и его значений.

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

Выполните его в командной строке из учетной записи пользователя администратора и вуаля! У вас есть разрешение на запуск/остановку службы из любой учетной записи пользователя (независимо от того, является ли она учетной записью администратора или нет) с помощью WebMethod. Обратитесь к Note1, чтобы узнать, как это сделать.

Ответ 2

Для этого я использую утилиту SubInACL. Например, если я хочу предоставить пользователю задание на компьютере VMX001 возможность запуска и остановки службы публикации World Wide Web (также известной как 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

Итак, задав PTO, я разрешаю пользователю job приостанавливать/продолжать, запускать и останавливать службу w3svc.

Ответ 3

  • Войдите как администратор.
  • Загрузите subinacl.exe из Microsoft:
    http://www.microsoft.com/en-us/download/details.aspx?id=23510
  • Предоставить разрешения для обычной учетной записи пользователя для управления BST услуги.
    (subinacl.exe находится в C:\Program Files (x86)\Windows Resource Kits\Tools\).
  • 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
  • Выйдите из системы и войдите в систему как пользователь. Теперь они должны иметь возможность запустите службу BST.

Ответ 4

Значительно проще предоставить разрешения администратора службе с помощью одного из этих инструментов:

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

Здесь статья MSKB с инструкциями для Windows Server 2008/Windows 7, но инструкции одинаковы для 2000 и 2003 годов.

Ответ 5

Существует бесплатный графический интерфейс ServiceSecurityEditor

Позволяет редактировать разрешения Windows. Я успешно использовал его, чтобы предоставить пользователю, не являющемуся Администратором, права на запуск и остановку службы.

Я использовал "sc sdset", прежде чем узнал об этом инструменте.

ServiceSecurityEditor чувствует себя как обман, это легко:)

Ответ 6

Инструмент командной строки subinacl.exe, вероятно, является единственным жизнеспособным и очень простым в использовании из всего, что находится в этом сообщении. Вы не можете использовать объект групповой политики с несистемными службами, а другой вариант просто слишком сложно.

Ответ 7

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