Windows: обновить пользовательское программное обеспечение, установленное в Program Files
Я разработчик программного обеспечения для Windows, которое я в настоящее время выпускаю как "переносное", то есть пользователь должен извлечь его где-то на свой диск. Наряду с этим я поставляю небольшой инструмент обновления (скрипт внешнего приложения / python, преобразованный в.exe через pyinstaller), который обрабатывает обновления следующим образом:
- Главное приложение вызывает инструмент обновления в фоновом режиме и выходит
- Запускается утилита обновления: извлекает новые файлы, удаляет файлы в главном каталоге приложения и извлекает новые (новое основное приложение.exe, dll и другие файлы, которые могут потребоваться)
- Обновить инструмент вызова основного приложения снова
Вопросы: создав инсталлятор (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, )