2013-07-05 2 views
0

У меня есть один исполняемый файл, который через InnoSetup по умолчанию устанавливается в Program Files \ FolderName. У exe есть сторонний компонент, который выходит онлайн, чтобы проверить новые версии и загружает их, а затем немного возится, чтобы заменить exe - простые вещи. Проблема в том, что она не может сделать это в Program Files из-за необходимой безопасности там. Я читал Windows 7 - Can't update my program's files in C:\Program Files, в котором Дэвид Хефферман дает решение, но тогда кажется, чтобы сказать, что это плохая идея, но я не знаю, относится ли битка плохих идей к его решению или комментариям OP!Обновление собственного программного обеспечения в программных файлах

Итак, каков предпочтительный метод, с помощью которого программа может обновить себя? Один, который будет работать с XPSP3 до Win8. Я не могу найти правильную фразу для входа в Google, которая дает мне соответствующие результаты. Игнорировать цифровые подписи и так далее, для простоты.

(Обратите внимание, что это может быть так, что я сформулировал это как вопрос мнения, но это не так. Должен быть какой-то MS-одобренный способ сделать это, что я не могу найти. FWIW это программа Delphi, но любая Win32 примечания сделаю)

+2

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

+0

Правильно, для меня это было немного неоднозначно и не помогало комментариями OP, поэтому, начиная новый вопрос, а не добавляя к этому вопросу - не хотелось путать путаницу над моей собственной неопределенностью! Благодарю. – GeoffM

ответ

1

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

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

Однако вы запускаете эту стороннюю утилиту, вы должны сначала проверить версию ОС Windows, чтобы увидеть, действительно ли необходимо работать с UAC (Vista + ...), а затем запустить утилиту в повышенном состоянии.

+0

Когда я говорю о компоненте, он фактически скомпилирован с обновляемым приложением (даже не с DLL/BPL). Таким образом, программа, которая хочет обновить себя, должна работать в повышенном состоянии, которое не является идеальным. Тем не менее, интересно, что вы говорите, что это можно сделать программно - мне нужно будет изучить это. Данные, безусловно, записаны в пользовательских папках. Благодарю. – GeoffM

+0

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

+0

Да, я знаю, почему ACL существует и что его нужно решать, но не был уверен, что это лучший способ. Благодарю. – GeoffM

0

Он говорит о своей «крайне плохой практике», чтобы возиться с вашей системой, чтобы обычные пользователи могли писать в «Program Files».

Если ваша программа находится в «Program Files», она устанавливается с правами администратора системы. Поэтому обновления также должны быть установлены с правами администратора системы.

Вы можете настроить InnoSetup на запрос прав администратора, чтобы вы могли писать в «Program Files», но если сторонний компонент не делает этого, лучше всего установить все в другой каталог.

т.е. C: \ Your_Program

Таким образом, ваш третий компонент участник может написать там.

+0

Хм, так я * думаю * вы оба говорите, обычные пользователи не могут обновлять программное обеспечение? Теперь это имеет смысл. Я не хочу C: \ My_Program, который будет спускаться, как свинцовый шар с пользователями. – GeoffM

+0

Если это только ваша собственная программа, я думаю, что лучший вариант - упаковать приложение app.exe в update.exe с помощью innosetup. Если обновление - более новая загрузка и выполнение update.exe. Если при обновлении окна требуется повышение, он будет запрашивать пользователя. (С или без пароля в зависимости от их настройки). Вы можете сделать innosetup с помощью/silent-переключателя и перезапустить программу после выполнения с минимальным вмешательством пользователя. Полное молчаливое обновление не представляется возможным, если ваша программа не работает постоянно (она не работает) – Rik

+0

Другие программы, которые самообновление, похоже, могут сделать это без повышения, что, по-моему, является тем, что меня путает. Если мое программное обеспечение вызывает подсказку о повышении, тогда все в порядке - главное - заставить его работать «подходящим» способом! – GeoffM

-1

Есть несколько вариантов здесь:

  • Самого простое: сделать обновление в качестве отдельной программы с манифестом, который требует прав администратора. Также вы можете попросить права администратора при запуске обновления. Или вы можете переместить ваш обновитель в COM-объект вне процесса вместо отдельного exe.
  • Вы можете создать скрытый пользователь с настройками администратора во время установки вашей программы. Затем вы запустите программу обновления с учетными данными этого пользователя.
  • Вы можете установить системный сервис во время установки вашей программы, и эта служба будет запущена из системной учетной записи. Таким образом, ваш обновитель будет реализован как служба.
+0

Создать скрытый пользователь с правами администратора? Установить службу под системную учетную запись? И очень плохая практика. –

+0

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

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