Windows: обновить пользовательское программное обеспечение, установленное в Program Files

Я разработчик программного обеспечения для Windows, которое я в настоящее время выпускаю как "переносное", то есть пользователь должен извлечь его где-то на свой диск. Наряду с этим я поставляю небольшой инструмент обновления (скрипт внешнего приложения / python, преобразованный в.exe через pyinstaller), который обрабатывает обновления следующим образом:

  1. Главное приложение вызывает инструмент обновления в фоновом режиме и выходит
  2. Запускается утилита обновления: извлекает новые файлы, удаляет файлы в главном каталоге приложения и извлекает новые (новое основное приложение.exe, dll и другие файлы, которые могут потребоваться)
  3. Обновить инструмент вызова основного приложения снова

Вопросы: создав инсталлятор (NSIS / InnoSetup) и разрешив пользователю установить приложение в Program Files, смогу ли я сохранить этот инструмент обновления? Я имею в виду, могло ли у него быть разрешение на такое обновление? Если нет, как можно / нужно делать обновления?

1 ответ

Похоже, вам просто нужно, чтобы приложение обновлений могло повысить привилегии. Я нашел следующую суть здесь: https://gist.github.com/GaryLee/d1cf2089c3a515691919

import sys
import ctypes

def run_as_admin(argv=None, debug=False):
    shell32 = ctypes.windll.shell32
    if argv is None and shell32.IsUserAnAdmin():
       return True

if argv is None:
    argv = sys.argv
if hasattr(sys, '_MEIPASS'):
    # Support pyinstaller wrapped program.
    arguments = map(unicode, argv[1:])
else:
    arguments = map(unicode, argv)
argument_line = u' '.join(arguments)
executable = unicode(sys.executable)
if debug:
    print 'Command line: ', executable, argument_line
ret = shell32.ShellExecuteW(None, u"runas", executable, argument_line, None, 1)
if int(ret) <= 32:
    return False
return None


if __name__ == '__main__':
ret = run_as_admin()
if ret is True:
    print 'I have admin privilege.'
    raw_input('Press ENTER to exit.')
elif ret is None:
    print 'I am elevating to admin privilege.'
    raw_input('Press ENTER to exit.')
else:
    print 'Error(ret=%d): cannot elevate privilege.' % (ret, )
Другие вопросы по тегам