Нашей программе когда-то нужна была возможность запускать вторичный процесс 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
Здравствуйте, 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 их выгрузить. Требует аккуратности, чтобы лишнего не зацепить.