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


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

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

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

7 115

7 ответов:

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

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

команда командной строки для запуска / остановки услуги:

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 веб-приложение и положить код там. Развертывание веб-службы в корневой папке 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. Чтобы получить его, откройте копию реестра (пуск > regedit) и найдите следующий раздел реестра.

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

под этим есть отдельный ключ для каждой учетной записи каждого пользователя на этом компьютере, а имя ключа-это SID каждой учетной записи. Сид, как правило, формата с-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 учетной записи пользователя, для которой мы хотим установить разрешения, давайте перейдем к нему. Предположим, что идентификатор безопасности учетная запись пользователя 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) часть текста выше, и вставьте его перед the 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. См. Примечание 1, чтобы узнать, как это сделать.

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

таким образом, при указании ПТО, Я даю право задание пользователь для приостановки / продолжения, запуска и остановки службы w3svc.

  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 услуга.

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

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

здесь статьи МСКБ с инструкциями для Windows Server 2008 / Windows 7, но инструкции одинаковы для 2000 и 2003.

есть бесплатный инструмент GUI ServiceSecurityEditor

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

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

ServiceSecurityEditor чувствует, как обман, это так просто :)

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

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