2010-03-05 5 views
8

У нас есть набор программ, которые проверяют новые версии при запуске, а затем загружают новые версии для запуска при необходимости. Это, очевидно, проблема в Windows 7, когда она заблокирована как «стандартный пользователь», поскольку они не могут писать в каталог c: \ program files и ниже. Кто-нибудь видел пример приложения, которое касается проблемы?Автоматическое обновление программы и Windows 7

Наши приложения написаны на Delphi, но пример на любом языке был бы полезен.

Заранее спасибо

Update:

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

Update 2:

Я задал subsequent question, а не добавление нового здесь

ответ

7

Есть два варианта установки приложения:

  1. Применение является доступен для всех пользователей: установка или обновление требует возвышения для Windows Vista и выше
  2. Приложение доступно одному пользователю: установите или обновите приложение в профиле пользователя в % LOCALAPPDATA%, не требуется отметка

Объявление 2: Google Chrome делает это. Он устанавливает EXE-файл здесь:

% LOCALAPPDATA% \ Google \ Chrome \ Application \ chrome.exe

--jeroen

+0

Jeroen, Это похоже на правильный ответ. Могу ли я регистрировать типы библиотек локально (для одного пользователя)? – Mmarquee

+0

Вы можете, если у вас есть собственный механизм регистрации. Вы не можете, если используете механизм регистрации по умолчанию (система). Какую функциональность вы хотите зарегистрировать? –

+0

Мы регистрируем типовые библиотеки. Кажется, есть вызов win api для этого пользователя, который Delphi не публикует. Затем мы используем эти typelibs для предоставления возможностей, позволяющих использовать для объединения наших отдельных функций в одно «приложение». Это мы делаем в настоящее время, но в xp мы можем сойти с рук, а в Windows 7 мы не можем. – Mmarquee

6

Обычно то, что вы увидите приложение делать, если нужно нагнетать разрешения что-то вроде этого.

  1. Применение определяет, будет ли обновление необходимо
  2. Application запускает услугу "Updater", который требует "Администратор" разрешения
  3. обновления само приложение, с обновленным
  4. Применение повторных пусков

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

1

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

  1. Приложение использует папку LOCALAPPPATH \ для хранения кеша основного приложения.
  2. Launcher проверяет, есть ли в Интернете более новая версия файла (ов), чем кешированный файл.
  3. Launcher запускает кэшированное приложение в LOCALAPPPATH
+0

И если ваше запущенное приложение содержит «установку» или «установку» как часть его имени, оно автоматически увеличивается (после подсказки, конечно), что позволяет ему записывать в эти защищенные биты. – skamradt

+0

@skamradt - отлично, да - просто помните, что его нужно скомпилировать с помощью установки или установки в качестве части имени, его нельзя переименовать! –

1

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

После завершения загрузки вы можете открыть диалоговое окно с сообщением пользователю о том, что вы готовы к обновлению. Если пользователь согласен с обновлением, вы можете запустить процесс обновления с повышенными привилегиями (как администратор), а процесс обновления может заменить существующие файлы в вашем пути установки теми, которые уже загружены в папку пользователя Temp. Чтобы запустить программу обновления, как администратор, вы можете использовать ShellExecute:

ShellExecute(0,'runas','notepad.exe',nil,nil,SW_SHOWNORMAL); 

При обновлении будет сделано, ваш процесс обновления может перезапустить приложение.

+1

Вы не можете поднять процесс, который уже запущен, но вы можете запустить новый процесс, который повышен до привилегий администратора, а приведенный выше код делает это. – vcldeveloper

1

У вас должен быть отдельный исполняемый файл для работы по обновлению. У updater должен быть манифест, который отмечает, что он требует повышения.

См: http://msdn.microsoft.com/en-us/library/bb756929.aspx

3

Вот несколько советов для вас, чтобы обойти проблемы с обновлением:

  1. Если ваш файл - это «update.exe» или «install.exe», то он автоматически заставит приглашение на повышение UAC. Это простой способ сделать существующее программное обеспечение обойти разрешения Windows Vista/7.
  2. Не рекомендуется проверять и обновлять процесс обновления с помощью приложения. Проблема в том, что ваше приложение, скорее всего, заблокирует файлы и нуждается в обновлении. Внешнее приложение должно управлять вашими обновлениями.
  3. Простейшим решением для обновления является вызов HTTP, который проверяет текущий номер версии продукта, а затем при необходимости загружает двоичный файл установщика. Это не даст вам гибкости в обновлениях, но это быстрое и простое решение.

Наша компания продает программное обеспечение, которое специально помогает с автоматическими обновлениями в Windows 7 UAC (вы можете посетить AutoUpdate +, нажав здесь: link text). Лучшие причины для использования стороннего решения - любого решения - это то, что у вас будет больше гибкости с вашими обновлениями, а также избежать проблем с поддержкой разных версий Windows.

1

Если ваше приложение использует установщик MSI (установщик Windows) для своего установщика, то User Account Control Patching, если он правильно настроен, позволяет устанавливать обновления без повышения.

0
  1. Если ваш установщик не запускался под управлением администратора, вам не нужны дополнительные права на установку обновлений.

  2. Если ваш установщик запускался под управлением администратора, то он может создать задачу в планировщике задач. Скажем, выполняйте эту задачу один раз в неделю под этой учетной записью (admin) и с самыми высокими привилегиями. Задача будет вашим обновлением. Просто.

+0

См. Также: https://blogs.msdn.com/b/larryosterman/archive/2007/08/20/applet-mitigations-updaters.aspx – Alex

Смежные вопросы