У нас есть приложение, написанное на C ++ и .NET, которое устанавливается для всех пользователей в папке Program Files. Это приложение загружает новые версии себя (как установщики MSI) и порождает новый процесс установки, чтобы заменить себя.
Процесс установки, существующий сегодня:
- Скопируйте приложение менеджера установки (C #, .NET 2.0) во временный каталог. Позвоните этому «менеджеру»
- Менеджер выполняется с повышенными привилегиями за эту статью .
- Исходное приложение выходит.
- Менеджер порождает установщик MSI (с повышенными привилегиями, поскольку копия повышена)
- Менеджер порождает новую версию приложения.
Ошибка:
Недавно установленное приложение работает в повышенном состоянии. Это вызывает проблемы, которые я не буду перечислять здесь.
В идеале запуск недавно установленного приложения должен выполняться с разрешениями исходного пользователя.
Я не могу понять, как превратить приложение в обычного пользователя после повышения.
Неэкранированный хак:
(да, да, весь этот процесс все равно не элегантен)
- Скопируйте менеджер установки во временный каталог
- Запустите менеджер установки со стандартными привилегиями пользователя. Давайте назовем этот экземпляр «LowlyManager».
- Исходное приложение выходит.
- LowlyManager снова запускает приложение , на этот раз с повышенными привилегиями. Давайте назовем этот экземпляр «UpperManagement»
- UpperManagement запускает установщик
- UpperManagement завершает работу корректно, возвращая код завершения программы установки.
- LowlyManager интерпретирует код ошибки из UpperManagement и порождает только что установленное приложение. На этот раз как первоначальный призыватель.
Есть ли лучший способ сделать это?
(Я пропустил множество других деталей до и после этих шагов, которые делают процесс более плавным для пользователя, но этого должно быть достаточно, чтобы понять суть проблемы, которую я пытаюсь решить.)
Другие требования:
- Мы не можем установить приложение для пользователя
- Пользователю не должно быть представлено диалоговое окно аутентификации, если бы UAC просто спросил: «Вы уверены, что хотите это разрешить?». Я думаю, что это может убить решение с помощью WindowsImpersonationContext, но я не уверен.
- Система должна работать на XP, Vista и Windows 7 (даже если для XP существует отдельный процесс).