Подтвердить что ты не робот

Вопрос о написании фонового/автоматического/беззвучного загрузчика/установщика для приложения в С#

Фон:
У меня есть основное приложение, которое должно быть в состоянии пойти в Интернет и загрузить связанные с ним DLL файлы (те, которые мы пишем, расположенные на нашем сервере). Это действительно необходимо, чтобы загрузить эти файлы DLL в папку приложения в "C:\Program Files". Раньше я использовал System.Net.WebClient для загрузки любых файлов, которые я хотел получить в Интернете.

Проблема
У меня было много проблем с загрузкой данных в прошлом и сохранением файлов на жестком диске пользователя. Я получаю много сообщений о том, что пользователи не работают, и обычно это связано с проблемами прав пользователя в программе.

В тех случаях, когда это была проблема с правами пользователя программы, каждый пользователь мог перейти в точное местоположение файла в Интернете, загрузить его, а затем сохранить его в нужном месте вручную.

Я хочу, чтобы это работало, как и все другие программы, которые я видел для загрузки/установки в этом fassion (т.е. Firefox Pluign Updates, Flash Player, JAVA, Adobe Reader и т.д.). Все они работают без заминок.

Вопрос
Есть ли какой-то код, который мне нужно использовать, чтобы предоставить моим программам программы загрузки специальные права на папку Program Files? Могу ли я это сделать? Есть ли лучший класс или библиотека, которую я должен использовать? Есть ли другой подход к загрузке файлов, которые я должен использовать, например, используя потоки или что-то еще для загрузки данных?

Любая помощь здесь ценится. Я хочу попытаться держаться подальше от сторонних приложений/библиотек, если это вообще возможно, кроме Microsoft, конечно, из-за проблем с лицензированием, но все равно отправляйте любые предложения по-моему.

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

4b9b3361

Ответ 1

Обычный способ сделать это будет следующим:

  • Ваше приложение обнаруживает необходимость обновления.
  • Ваше приложение запустит другое приложение (updater), которое загрузит необходимые файлы и установит их в Program Files. Это приложение для обновления должно выполняться с правами администратора (т.е. Запрашивать повышение UAC в Vista/Win7). Самый простой способ обеспечить это: добавить манифест приложения к этому приложению обновления.

Если пользователь является администратором с включенным UAC, точка 2 вызовет приглашение UAC, которое должно быть принято (обратите внимание, что это верно для Firefox/Acrobat/etc. updaters). Если пользователь не является администратором, ему будет предложено ввести учетные данные администратора. (Обратите внимание, что это хорошо: только администратору разрешено обновлять приложения, установленные для всех пользователей.)

Ваше приложение для обновления не нужно писать специальным способом: он может использовать System.Net.WebClient так же, как и раньше. В манифесте приложения будет указано, что он запрашивает необходимые предпосылки для записи в Program Files.

Обратите внимание, что эта проблема (Program Files недоступна для записи администраторами без повышения UAC) - это функция операционной системы, а не ограничение языка программирования, поэтому вы не решите эту проблему, просто "используя другую библиотеку". Если вы хотите, чтобы ваше приложение запускалось в Vista/Win7 и записывалось в Program Files, вам потребуется высота UAC.

Ответ 3

Для записи в каталог Program Files требуется высота UAC (если это разрешено пользователем) в Vista/Win7. См. Этот пример кода о том, как запрашивать разрешение пользователей: http://msdn.microsoft.com/en-us/library/aa970890.aspx

На самом деле, пожалуйста, подумайте о разработке своего приложения, чтобы он записывал в более подходящее место, где это не опасно перезаписывать критический файл программы.

Ответ 5

Нужно ли действительно быть в Program Files? У меня была аналогичная проблема в приложении, и мы написали класс для устранения не установленных сборок, сначала попробовав их загрузить из подпапки% usersprofile%, а затем попытавшись загрузить. Это может быть легко, если вы добавите метод разрешения в текущее событие AssemblyResolve домена приложения.

    AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve;
    public Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
         //try to get locally

         //try to download
         return assembly;
    }

Ответ 6

Не делай этого.

Теоретически это можно сделать легко. вы просто ждёте другое приложение, которое работает с правами администратора - вы можете запросить их в конфигурации. В приложении для обновления вы просто подключаетесь к защищенному (ssl) веб-сайту, загружаете все, что вам нужно, файлы, которые вы загружаете должны, должны быть криптографически подписаны.

Это также можно легко решить с помощью ClickOnce или другого веб-установщика, способного обновлять.

Что вы не должны делать, это просто загрузить небезопасную DLL из непроверенного источника и выполнить их.