Python中如何触发UAC提示获取代码运行的管理员权限
根因定位
- 原代码存在字段拼写错误:传入
lbVerb='runas'而非正确的lpVerb,win32com的ShellExecuteEx参数解析会错位映射该值,在32位Python运行于64位Windows的场景下,会直接导致Shell调用行为异常,触发进程冻结 - 参数拼接未做转义:脚本路径、Python解释器路径带空格时(例如
C:\Program Files\Python39\python.exe),未给路径加双引号包裹,会被Shell解析成多个独立参数,导致提权后的进程加载失败、终端无响应 - 缺少跨架构兼容参数:未显式设置
fMask关联子进程句柄,32位进程在跨架构提权时会因窗口消息阻塞,出现无响应卡死 - 权限判断逻辑缺陷:仅靠命令行末尾标记判断是否已提权,未主动校验系统权限状态,在终端传参异常时会出现递归提权、进程卡死
- 语法兼容问题:代码中使用Python2专属的
print >> out重定向写法,在Python3环境下会直接触发语法报错
修复后的稳定提权实现
import os import sys import ctypes import win32api import win32com.shell.shell as shell from win32com.shell import shellcon ASADMIN_MARK = "--asadmin" # 主动校验当前进程是否具备管理员权限 def check_admin_privilege(): try: return ctypes.windll.shell32.IsUserAnAdmin() except: return False if not check_admin_privilege(): # 给所有路径、参数加双引号,兼容带空格的路径场景 full_script_path = f'"{os.path.abspath(sys.argv[0])}"' quoted_args = [f'"{arg}"' for arg in sys.argv[1:]] quoted_args.append(ASADMIN_MARK) exec_params = " ".join([full_script_path] + quoted_args) # 正确传入lpVerb字段,显式设置进程关联参数避免跨架构阻塞 exec_result = shell.ShellExecuteEx( fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, lpVerb="runas", lpFile=sys.executable, lpParameters=exec_params, nShowCmd=shellcon.SW_SHOW ) # 等待子进程完成初始加载,避免父进程过早退出导致终端卡死 win32api.WaitForInputIdle(exec_result["hProcess"], 1000) sys.exit(0) # 管理员权限下的业务逻辑 if __name__ == "__main__": with open("somefile.txt", "w") as out_f: print("i am root", file=out_f)
运行注意事项
- 依赖
pywin32库提供的win32com、win32api接口,需提前通过pip install pywin32完成安装 - 32位Python在64位Windows下运行时,设置的
SEE_MASK_NOCLOSEPROCESS参数会避免跨架构的消息循环阻塞,彻底解决终端无响应问题 - UAC弹窗触发时,若用户选择“否”拒绝提权,可根据
ShellExecuteEx的返回值增加异常捕获逻辑,补充对应的错误提示
内容的提问来源于stack exchange,提问作者JRKGaming
相关产品推荐
相关产品推荐

