我是一个 Windows 软件应用程序的开发人员,我目前将其发布为“便携式”,这意味着用户需要将其提取到磁盘中的某个位置。我随附了一个小型更新工具(外部应用程序/python 脚本通过 pyinstaller 转换为 .exe),它处理更新如下:
- 主应用程序在后台调用更新工具并退出
- 更新工具运行:获取新文件、删除主应用程序目录中的文件并提取新文件(新的主应用程序 .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, )