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

121

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

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

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

С
источник

Ответы:

141

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

Затем добавьте 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, чтобы узнать, как это сделать.

С
источник
11
ПРИМЕЧАНИЕ: ** Вы ДОЛЖНЫ скопировать результаты команды shshow, выполненной на вашем собственном компьютере, а затем отредактировать в соответствии с тем, что я указал. ** НЕ просто копируйте код отсюда и выполняйте на своем компьютере как есть.
Суббота,
5
Я попробовал этот ручной подход, и он отлично сработал. Но если вы похожи на меня, и вам нужно сделать это на более чем 20 компьютерах, вам понадобится программа или сценарий для этого. Вы можете использовать вызовы Windows API QueryServiceObjectSecurity и SetServiceObjectSecurity . В MSDN есть полный пример применения этого к учетной записи «Гость»
Дрю Чапин
1
Большая честь! Работал как шарм.
Хорст Гутманн
2
чтобы не отнимать усилия и осторожность, вложенные в этот ответ, я думаю, что некоторые из других ответов предлагают более простое и более прямое решение. Если я не упускаю из этого преимущества?
Spike0xff
1
Если вы делаете это программно и хотите разделить вывод, sc sdshowвы можете использовать это регулярное выражение для разделения компонентов: (?:\D:)?\(.+?\)а затем вставить новую часть с SID как предпоследнюю.
PhonicUK
116

Я использую для этого утилиту 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

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

arcain
источник
18
Это лучший ответ. Он использует правильный инструмент для работы без взлома реестра, перевода SID или в зависимости от неясного форматирования ACL. Предоставляет все необходимое для быстрого и простого выполнения работы с достаточным количеством деталей, чтобы экстраполировать их на любой разумный сценарий.
pierce.jason
2
Мне нужно перезагрузить компьютер или выйти из системы / войти в систему, когда я использую это?
Дэвид говорит: "Восстановите Монику"
2
@DavidGrinberg Я не припомню, чтобы когда-либо требовалось, чтобы затронутая учетная запись выходила из системы, а затем снова включалась, или необходимость перезапуска при использовании только subinacl, как описано здесь.
arcain 01
1
Можно подтвердить, что это работает на сервере 2012 года, используя sc \\server start|stop|query servicenameудаленный сервер. Не требуется перезапуск \ выход из системы
Стиг Эйде
Это сработало для запуска службы локально. Однако он разбился с 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.
Venkat
источник
1
Выглядит намного проще и лучше, чем манипулировать конфигурациями вручную.
gsk
1
Требуется ли выход из системы?
Дэвид говорит: "Восстановите Монику"
упс! Ошибка ... Я получил сообщение «Ошибка OpenSCManager: сервер RPC недоступен. ВНИМАНИЕ: / grant = mike = f: предыдущий объект не открывался». Я попробовал использовать MySQL. Перезагрузка: доступ как всегда запрещен.
Майк грызун
15

Есть бесплатный GUI Tool ServiceSecurityEditor

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

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

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

FCW
источник
1
Я попробовал ServiceSecurityEditor на основе этой рекомендации, и это превосходно.
Гуру Джош
11

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

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

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

Райан Фишер
источник
1

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

JustAGuy
источник
-2

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

Джек Воробей
источник
1
Спасибо за ответ, Джек. Однако я не хочу этого делать. Мне нужно, чтобы моя служба BST работала, как сейчас. Мне нужен только любой пользователь, не являющийся администратором, чтобы остановить / запустить его.
Суббота,