CreateProcess вместо ShellExecute при uiAccess=true
От: 3dlev  
Дата: 19.09.11 23:08
Оценка:
Нашей программе когда-то нужна была возможность запускать вторичный процесс elevated из основного процесса со стандартным IL. Было это осуществлено с помощью добавления uiAccess=true в манифест вторичного экзешника, а также подписания его бинарника, и вызова его с помощью ShellExecute. Все работает, но оказалось, что вызов ShellExecute загружает несколько Internet Explorer-овских DLL, таких как urlmon.dll, iertutil.dll итд. Это приводит к тому, что пока наша программа работает, апгрейд Интернет Эксплорера без перезагрузки системы невозможен.
Попробовал вызывать CreateProcess вместо ShellExecute — он возвращает ошибку ERROR_ELEVATION_REQUIRED.
Вопросы — можно ли обойтись без ShellExecute при запуске процесса с повышенными привилегиями?
Как альтернативное решение — можно ли выгрузить "лишние" библиотеки urlmon.dll, iertutil.dll каким либо относительно безопасным способом?
Re: CreateProcess вместо ShellExecute при uiAccess=true
От: Jolly Roger  
Дата: 20.09.11 02:11
Оценка: 2 (1)
Здравствуйте, 3dlev, Вы писали:

3>Нашей программе когда-то нужна была возможность запускать вторичный процесс elevated из основного процесса со стандартным IL. Было это осуществлено с помощью добавления uiAccess=true в манифест вторичного экзешника, а также подписания его бинарника, и вызова его с помощью ShellExecute. Все работает, но оказалось, что вызов ShellExecute загружает несколько Internet Explorer-овских DLL, таких как urlmon.dll, iertutil.dll итд. Это приводит к тому, что пока наша программа работает, апгрейд Интернет Эксплорера без перезагрузки системы невозможен.

3>Попробовал вызывать CreateProcess вместо ShellExecute — он возвращает ошибку ERROR_ELEVATION_REQUIRED.
3>Вопросы — можно ли обойтись без ShellExecute при запуске процесса с повышенными привилегиями?

ИМХО, самый простой способ — использовать промежуточную программу-стартер, которая вызовет ShellExecute завершится. В качестве таковой можно использовать саму себя через параметры командной строки.

3>Как альтернативное решение — можно ли выгрузить "лишние" библиотеки urlmon.dll, iertutil.dll каким либо относительно безопасным способом?


Можно попробовать загрузить весь набор DLL динамически, через LoadLibrary, а после вызова ShellExecute их выгрузить. Требует аккуратности, чтобы лишнего не зацепить.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.