Python使用subprocess调用runas命令时能否自动输入密码?
Python runas命令自动输入密码实现方案
原生runas命令不支持从subprocess的标准输入流接收密码,Windows系统设计上runas会直接读取安全控制台的输入,绕过stdin/stdout管道,因此直接通过subprocess.run的stdin参数传密码是无效的。
下面是几种可行的实现方式:
- 方案1:使用
/savecred参数(仅测试环境可用,安全性低)
给runas加上/savecred标识,首次运行时手动输入一次密码,Windows会保存对应凭据,后续运行无需重复输入。示例代码:
注意:该方案会将凭据长期存在系统中,有明显安全隐患,禁止在生产环境使用。import subprocess command = "runas /savecred /user:theuser cmd" subprocess.run(command, shell=True) - 方案2:调用Windows系统API实现(推荐)
借助pywin32库调用Windows原生的CreateProcessWithLogonW接口,直接用指定用户凭据启动进程,无需调用runas命令,可控性和安全性更高。
第一步先安装依赖:pip install pywin32
示例代码:import win32api import win32con import win32process username = "theuser" domain = "." # 本地用户填. 域用户填对应域名 password = "你的密码" target_cmd = "cmd.exe" startupinfo = win32process.STARTUPINFO() startupinfo.dwFlags = win32process.STARTF_USESHOWWINDOW startupinfo.wShowWindow = win32con.SW_SHOW # 用指定用户创建进程 process_handle, thread_handle, pid, tid = win32process.CreateProcessWithLogonW( username, domain, password, win32process.LOGON_WITH_PROFILE, None, target_cmd, win32con.CREATE_NEW_CONSOLE, None, None, startupinfo ) # 可选:等待进程运行结束 win32process.WaitForSingleObject(process_handle, win32con.INFINITE) # 关闭资源句柄 win32api.CloseHandle(process_handle) win32api.CloseHandle(thread_handle) - 方案3:模拟键盘输入(不推荐,稳定性差)
借助pyautogui库模拟手动输入密码的操作,仅适合临时场景使用,容易因为窗口未聚焦、弹窗延迟等问题失效。
第一步安装依赖:pip install pyautogui
示例代码:import subprocess import pyautogui import time command = "runas /user:theuser cmd" subprocess.Popen(command, shell=True) time.sleep(1) # 等待密码输入弹窗加载完成 pyautogui.typewrite("你的密码\n")
内容的提问来源于stack exchange,提问作者Day Latarka
相关产品推荐
相关产品推荐

