Повышение уровня процесса .NET 2.0 для установки приложений

StackOverflow https://stackoverflow.com/questions/2557232

Вопрос

У нас есть приложение, написанное как на C++, так и на .NET, которое устанавливается для всех пользователей в папку Program Files.Это приложение загружает новые версии себя (как установщики MSI) и запускает новый процесс установки для замены себя.

Процесс установки в том виде, в котором он существует сегодня:

  1. Скопируйте приложение диспетчера установки (C#, .NET 2.0) во временный каталог.Назовите это «Менеджер»
  2. Менеджер выполняется с повышенными привилегиями по этой статье.
  3. Исходное приложение завершится.
  4. Диспетчер запускает установщик MSI (с повышенными привилегиями, поскольку копия имеет повышенные права)
  5. Менеджер создает новую версию приложения.

Баг:

Недавно установленное приложение работает с повышенными правами.Это вызывает проблемы, которые я не буду здесь перечислять.

В идеале запуск нового установленного приложения должен осуществляться с разрешениями исходного пользователя.

Я не могу понять, как вернуть приложению статус обычного пользователя после повышения прав.

Неэлегантный хак:

(да, да, в любом случае весь этот процесс неэлегантен)

  1. Скопируйте менеджер установки во временный каталог.
  2. Запустите менеджер установки с правами обычного пользователя.Давайте назовем этот экземпляр «LowlyManager».
  3. Исходное приложение закрывается.
  4. LowlyManager запускает приложение снова, на этот раз с повышенными привилегиями.Назовем этот экземпляр «UpperManagement».
  5. UpperManagement запускает установщик
  6. UpperManagement корректно завершает работу, возвращая код завершения установщика.
  7. 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/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top