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

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

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

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

Ответы [ 7 ]

137 голосов
/ 15 декабря 2010

Ниже я собрал все, что узнал о запуске / остановке службы 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 создайте веб-приложение ASP.NET для Visual Studio C # и поместите туда код. Разверните 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. Чтобы получить его, откройте реестр (Пуск> 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) * +1057 *

Затем добавьте 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.

110 голосов
/ 17 сентября 2013

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

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

40 голосов
/ 03 апреля 2013
  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.
13 голосов
/ 25 января 2017

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

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

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

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

11 голосов
/ 21 января 2012

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

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

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

1 голос
/ 31 мая 2016

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

0 голосов
/ 14 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...