如何使用Python打开具备提升权限的PowerShell命令提示符
Python subprocess 调用PowerShell实现管理员权限运行方案
Windows 平台实现(UAC提权)
Windows系统下权限提升由系统UAC机制管控,无法通过代码静默绕过用户确认,需通过PowerShell内置的Start-Process加RunAs动词触发UAC提权流程,参考实现代码:
import subprocess # 替换为需要高权限执行的实际命令 target_ps_command = "my command" run_cmd = [ "pwsh", "-NoProfile", "-Command", f"Start-Process pwsh -ArgumentList '-NoProfile','-Command','{target_ps_command}' -Verb RunAs -Wait" ] subprocess.run(run_cmd)
参数说明
-NoProfile:可选参数,加了之后启动PowerShell时不加载用户配置文件,避免自定义配置干扰命令执行-Verb RunAs:Windows系统注册的进程启动动词,触发UAC权限申请弹窗,用户确认后目标进程将获得管理员令牌-Wait:让发起提权的父进程等待高权限PowerShell进程执行结束后再退出,不需要同步等待执行结果可移除该参数
注意事项
- 执行时必然弹出系统级UAC确认窗口,不存在常规合法手段可以绕过该确认流程静默拿到管理员权限
- 若待执行命令中包含单引号,需提前做转义处理:将命令内的所有单引号替换为两个连续单引号
'',避免PowerShell参数解析错误 - 提权启动的PowerShell进程默认工作目录为
C:\Windows\System32,如果命令依赖相对路径,可给Start-Process追加-WorkingDirectory参数指定执行目录,示例:
run_cmd = [ "pwsh", "-NoProfile", "-Command", f"Start-Process pwsh -ArgumentList '-NoProfile','-Command','{target_ps_command}' -Verb RunAs -Wait -WorkingDirectory 'D:\\your\\project\\path'" ]
- 提权后的进程是独立的安全上下文,无法直接通过父进程subprocess的
stdout/stderr管道捕获输出,需要获取执行结果时,可在高权限命令中将输出写入指定临时文件,父进程等待执行完成后读取文件内容即可。
Linux/macOS 平台实现
类Unix平台下PowerShell(pwsh)提权直接通过sudo实现即可:
import subprocess subprocess.run(['sudo', 'pwsh', '-NoProfile', '-Command', 'my command'])
执行时会在当前终端提示输入用户密码,校验通过后将以root权限执行目标命令。
避坑提示
- 不要为了省事给
subprocess.run传shell=True执行提权命令,极易出现参数转义错误,还存在命令注入安全风险,按列表顺序传参是最稳妥的方式。
内容的提问来源于stack exchange,提问作者ISK2022
相关产品推荐
相关产品推荐

