使用Python subprocess以管理员权限打开新CMD窗口执行命令报错
解决subprocess调用runas获取管理员权限执行命令的问题
错误原因分析
- 第一段代码的问题:
subprocess.Popen的命令列表格式错误,必须将每个命令/参数拆分为单独的列表元素,不能把cmd.exe /K "CoreServer.exe -c -s"作为单个元素传递。- 命令顺序逻辑错误,
runas应作为主命令,后续参数需指定用户及要执行的目标命令。
- 第二段代码的问题:
- 给
"CoreServer.exe -c -s"添加了多余引号,runas会将整个带引号的字符串识别为单个可执行文件路径,导致找不到文件;若要传递带参数的命令,需通过cmd /c包裹执行。
- 给
正确实现代码
方案1:通过runas打开管理员CMD并执行指定命令
import subprocess from subprocess import CREATE_NEW_CONSOLE import os def OpenServers(): echoServerFullPath = "你的CoreServer.exe所在目录路径" # 替换为实际路径 print(f"Full path {echoServerFullPath}") print(os.path.exists(echoServerFullPath)) os.chdir(echoServerFullPath) # 正确拆分命令参数:runas为主命令,依次指定用户、要执行的cmd命令 command = [ "runas", "/user:Administrator", 'cmd.exe /K "CoreServer.exe -c -s"' ] subprocess.Popen(command, creationflags=CREATE_NEW_CONSOLE)
方案2:拆分cmd参数避免引号转义问题
如果担心引号转义引发异常,可以进一步拆分cmd的参数:
import subprocess from subprocess import CREATE_NEW_CONSOLE import os def OpenServers(): echoServerFullPath = "你的CoreServer.exe所在目录路径" os.chdir(echoServerFullPath) # 拆分cmd的命令与参数为列表 cmd_command = ["cmd.exe", "/K", "CoreServer.exe", "-c", "-s"] # 将cmd命令列表拼接为字符串,传递给runas runas_command = ["runas", "/user:Administrator", " ".join(cmd_command)] subprocess.Popen(runas_command, creationflags=CREATE_NEW_CONSOLE)
注意事项
- 确保
Administrator账户存在且已启用,若使用其他管理员账户,替换为对应用户名即可。 - 若
CoreServer.exe不在当前工作目录,建议使用完整绝对路径(如"C:\\apps\\CoreServer.exe"),避免路径找不到的问题。 - 执行代码后会弹出CMD窗口要求输入管理员密码,输入正确后才会执行目标命令。
内容的提问来源于stack exchange,提问作者nikhil
相关产品推荐
相关产品推荐

