写注册表、改系统目录、装驱动时需要管理员权限。可以在脚本启动时自检,并在必要时触发 UAC 提权。

脚本内提权

import ctypes, os, sys

def is_admin() -> bool:
    try: return bool(ctypes.windll.shell32.IsUserAnAdmin())
    except Exception: return False

def run_as_admin() -> None:
    script = os.path.abspath(sys.argv[0])
    params = " ".join(f'"{arg}"' for arg in sys.argv[1:])
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, f'"{script}" {params}', None, 1)

def main():
    print("以管理员权限执行业务逻辑")

if __name__ == "__main__":
    if not is_admin():
        print("权限不足,尝试提权重启...")
        run_as_admin(); sys.exit(0)
    main()

打包时直接要 UAC

pyinstaller -F -w --uac-admin main_script.py

注意

  • 提权会弹 UAC,用户点否就会失败,要有提示。
  • 提权后旧进程应 sys.exit(0),避免双开。
  • 路径和参数含空格时必须加引号。
  • 能不提权就不提权,缩小攻击面。