Повышение уровня процесса .NET 2.0 для установки приложений
-
23-09-2019 - |
Вопрос
У нас есть приложение, написанное как на C++, так и на .NET, которое устанавливается для всех пользователей в папку Program Files.Это приложение загружает новые версии себя (как установщики MSI) и запускает новый процесс установки для замены себя.
Процесс установки в том виде, в котором он существует сегодня:
- Скопируйте приложение диспетчера установки (C#, .NET 2.0) во временный каталог.Назовите это «Менеджер»
- Менеджер выполняется с повышенными привилегиями по этой статье.
- Исходное приложение завершится.
- Диспетчер запускает установщик MSI (с повышенными привилегиями, поскольку копия имеет повышенные права)
- Менеджер создает новую версию приложения.
Баг:
Недавно установленное приложение работает с повышенными правами.Это вызывает проблемы, которые я не буду здесь перечислять.
В идеале запуск нового установленного приложения должен осуществляться с разрешениями исходного пользователя.
Я не могу понять, как вернуть приложению статус обычного пользователя после повышения прав.
Неэлегантный хак:
(да, да, в любом случае весь этот процесс неэлегантен)
- Скопируйте менеджер установки во временный каталог.
- Запустите менеджер установки с правами обычного пользователя.Давайте назовем этот экземпляр «LowlyManager».
- Исходное приложение закрывается.
- LowlyManager запускает приложение снова, на этот раз с повышенными привилегиями.Назовем этот экземпляр «UpperManagement».
- UpperManagement запускает установщик
- UpperManagement корректно завершает работу, возвращая код завершения установщика.
- LowlyManager интерпретирует код ошибки из UpperManagement и запускает вновь установленное приложение.На этот раз в качестве первоначального вызывателя.
Есть лучший способ сделать это?
(Я опустил множество других деталей до и после этих шагов, которые делают процесс более плавным для пользователя, но этого должно быть достаточно, чтобы понять суть проблемы, которую я пытаюсь решить.)
Другие требования:
- Мы не можем установить приложение для каждого пользователя.
- Пользователю не должно открываться диалоговое окно аутентификации, если бы UAC просто спросил: «Вы уверены, что хотите это разрешить?».Я думаю, что это может убить решение, использующее WindowsImpersonationContext, но я не уверен.
- Система должна работать на XP, Vista и Windows 7 (даже если для XP существует отдельный процесс).
Решение
В одну сторону: http://www.codeproject.com/KB/vista-security/VistaElevator.aspx
Другой способ (упомянутый в последнем комментарии к предыдущей статье): http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how/