Windows10下Python程序以管理员身份启动后未执行业务代码问题
Windows Python 提权后代码未执行问题修复
问题根因
- 参数拼接错误:原有代码使用
" ".join(sys.argv)拼接命令参数,当脚本路径、Python解释器路径包含空格时,参数会被错误拆分,提权后的Python进程无法识别目标脚本路径,直接报错退出 - 工作目录偏移:提权后的进程默认工作目录为
C:\Windows\System32,使用相对路径生成验证文件时,文件会被写入系统目录而非脚本所在目录,导致误判代码未执行 - UAC请求未确认:运行时弹出的用户账户控制弹窗如果未点击「是」,提权进程不会启动
修复后完整代码
import ctypes import sys import webbrowser import os def main(): # 采用绝对路径生成验证文件,避免工作目录偏移找不到文件 script_path = os.path.abspath(__file__) script_dir = os.path.dirname(script_path) test_file = os.path.join(script_dir, "test_success.txt") with open(test_file, "w", encoding="utf-8") as f: f.write("提权后代码执行成功") webbrowser.open('http://google.com') # 可选:增加停留逻辑,确认提权进程正常启动 # input("提权运行成功,按任意键退出") def is_admin(): try: return ctypes.windll.shell32.IsUserAnAdmin() except: return False if __name__ == "__main__": if is_admin(): main() else: # 给每个参数包裹双引号,避免空格导致的参数拆分错误 cli_params = " ".join([f'"{arg}"' for arg in sys.argv]) # 传入脚本所在目录作为提权进程的工作目录 ctypes.windll.shell32.ShellExecuteW( None, "runas", sys.executable, cli_params, os.path.dirname(os.path.abspath(__file__)), 1 )
验证说明
- 运行代码时弹出UAC权限请求必须点击「是」,提权操作才能生效
- PyCharm控制台不会显示提权后独立进程的打印输出,属于正常现象,直接查看脚本目录下生成的
test_success.txt即可验证执行结果 - 如需排查错误,可在main函数中增加异常捕获逻辑,将错误信息写入绝对路径的日志文件定位问题
内容的提问来源于stack exchange,提问作者KahngjoonK
相关产品推荐
相关产品推荐

