Я использую стороннюю службу Windows, которая выполняет некоторые задачи автоматизации, выполняя скрипты и исполняемые файлы с помощью CreateProcessAsUser (). Я сталкиваюсь с проблемами в Windows Server 2008 из-за UAC и способа обработки повышения LUA через API.
Служба работает как LocalSystem и не имеет включенного «Взаимодействовать с рабочим столом». Процессы выполняются как пользователи в группе администраторов, но не в качестве учетной записи администратора (которая освобождена от многих ограничений UAC). Все настройки UAC по умолчанию на месте.
Я могу передавать в службу произвольные команды или код powershell, но я не могу «вырваться» из не повышенного уровня неинтерактивного процесса, который запускается службой.
Суть проблемы заключается в том, что единственной (общедоступной) опцией API для запуска процесса с повышенными правами является ShellExecute () с глаголом runas, но, насколько я могу судить, его нельзя вызвать из неинтерактивный сервис или вы получаете ошибки типа «Для этой операции требуется интерактивная оконная станция».
Единственный найденный мной обходной путь упомянут здесь:
http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
В Vista официальным документированным способом
чтобы поднять процесс только с помощью
API оболочки ShellExecute (Ex) (не
CreateProcess или CreateProcessAsUser).
Так что ваше приложение должно позвонить
ShellExecute (Ex) для запуска помощника
повышен для вызова SendInput.
Кроме того, из-за сессии 0
изоляция, сервис может использовать только
CreateProcessAsUser или
CreateProcessWithLogonW (не может использовать
ShellExecute (Ex)), чтобы указать
интерактивный рабочий стол.
.. Я думаю, что нет прямого пути к
породить повышенный процесс от
служба windows. Мы можем только сначала использовать
CreateProcessAsUser или
CreateProcessWithLogonW, чтобы порождать
не повышенный процесс в пользователя
сессия (интерактивный рабочий стол). Затем в
не повышенный процесс, он может использовать
ShellExecute (Ex) для создания повышенных
процесс для реальной задачи.
Чтобы сделать это из кода .net / powershell, похоже, мне нужно было бы сделать некоторые сложные вещи P / Invoke для вызова CreateProcessAsUser или CreateProcessWithLogonW, поскольку .Net System.Diagnostics.ProcessStartInfo не имеет эквивалента lpDesktop что я мог бы установить на "winsta0 \ default". И мне не ясно, есть ли у LocalSystem даже права вызывать CreateProcessAsUser или CreateProcessWithLogonW.
Я тоже смотрел на
http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx
а также
Process.Start с различными учетными данными с UAC на
Исходя из всего этого, я прихожу к выводу, что не существует простого способа сделать это. Я что-то пропустил? Это действительно не похоже, что это должно быть так сложно. Такое ощущение, что UAC просто никогда не был разработан для обработки неинтерактивных сценариев использования.
И если кто-нибудь из Microsoft в конце концов прочитает это, я заметил, что ShellExecute внутренне обрабатывает повышение, вызывая Информационную службу приложений (AIS). Почему тот же вызов AIS не доступен через Win32 или .NET API?
http://msdn.microsoft.com/en-us/library/bb756945.aspx
Извините, что побежал немного долго. Спасибо за любые идеи.