Я пытаюсь написать приложение, которое работает как локальный пользователь на сервере и которому требуется доступ для перечисления служб и, возможно, даже для управления ими (запуск / остановка).
Входит в группу администраторов только способ, которым этот пользователь сможет получить доступ к этой функции (используется через ServiceController класс)? Если проще, я был бы в порядке, даже если бы имел возможность просто перечислить список служб (интерактивный запуск / остановка - это не остановка показа). Будет ли работать добавление пользователя в группу опытных пользователей?
Спасибо!
редактировать: http://msdn.microsoft.com/en-us/library/windows/desktop/ms685981(v=vs.85).aspx#access_rights_for_the_service_control_manager
Группа опытных пользователей никогда не поможет. Это старое наследие. Лучше всего считать, что его не существует.
Если вы хотите установить разрешения для отдельных служб Windows детально, вы можете, но это далеко не так просто / интуитивно понятно, как установка разрешений для файла.
Чтобы просмотреть текущие разрешения службы Windows:
C:\Users\Ryan>sc sdshow netlogon
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)
Чтобы установить разрешения для одной службы Windows, например, чтобы пользователь, не являющийся администратором, мог запускать и останавливать конкретную службу:
sc sdset netlogon "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
Выглядит ужасно, правда? Эта штука называется SDDL - Security Descriptor Definition Language.
Эта статья - довольно хорошее руководство по интерпретации SDDL и тому, как делать то, что вы пытаетесь сделать.
Вы также можете использовать шаблоны безопасности и групповые политики, чтобы добиться того же:
Еще один удобный способ сделать то же самое - инструмент командной строки subinacl, включенный в Windows 2003 Resource Kit. Это замечательный маленький набор хитростей.
Вот синтаксис для установки разрешений пользователей на сервисы:
SUBINACL /SERVICE \\MachineName\ServiceName /GRANT=[DomainName\]UserName[=Access]
Доступны следующие варианты доступа:
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
Таким образом, чтобы предоставить членам группы DOMAIN \ GroupName разрешение на запуск и остановку службы ServiceName, нужно:
subinacl /service ServiceName /GRANT=DOMAIN\GroupName=TO
Чтобы просмотреть разрешения, установленные для службы ServiceName (до и после выполнения вышеуказанного), необходимо:
subinacl.exe /service /verbose=1 ServiceName
Вот официальный HOWTO по настройке разрешений службы с помощью subinacl: http://support.microsoft.com/kb/288129
А вот ссылка для скачивания subinacl: http://www.microsoft.com/en-us/download/details.aspx?id=23510
Чтобы перечислить услуги, вашему процессу требуется SC_MANAGER_ENUMERATE_SERVICE
верно, в старые времена это право имел каждый аутентифицированный пользователь, но со времен Vista это уже не так.
Он есть у интерактивных пользователей, поэтому обычный пользователь может net start
или Get-Service
Вы можете изменить разрешения в диспетчере управления службами, чтобы позволить процессу перечислять службы. Вам также необходимо изменить разрешения для любой службы, к которой вы хотите получить доступ.
Я только что написал Сообщение блога Чтобы узнать, как это сделать, он включает сценарий PowerShell, который делает это для всех служб на локальном компьютере.
Хм, все зависит от языка, который вы используете для запроса процессов, но требуемая роль пользователя будет определяться набором привилегий, которые потребуются вашему коду на целевой машине. Некоторые из этих привилегий связаны с обычными учетными записями пользователей, тогда как для других потребуется роль администратора.