使用python打开cmd并自动输入密码

Exo*_*arf 6 python subprocess cmd administrator runas

我已经成功地让 python 打开了 cmd。但是,使用 runas 管理员在执行 cmd.exe 之前会进行密码检查。

我用它来打开cmd...

import subprocess

subprocess.call(["runas", "/user:Administrator", "cmd.exe"])

我正在寻找一种方法来自动将密码输入到运行代码时打开的 runas.exe 提示符中。假设我要创建var = "test"并添加它,import subprocess我将如何制作它以便将该变量传递给 runas.exe 并将其视为 runas.exe 的输入?

该解决方案仅需要 3.4 或更高版本的 python 模块。


更新

我发现一些代码似乎直接输入到 runas.exe 中。然而,明显的输入是\x00\r\n在代码中输入应该是的时候test,我相当确定如果我可以获得输入,那么test代码就会成功。

代码如下:

import subprocess

args = ['runas', '/user:Administrator', 'cmd.exe']

proc = subprocess.Popen(args, 
                        stdin=subprocess.PIPE, 
                        stdout=subprocess.PIPE, 
                        stderr=subprocess.PIPE)

proc.stdin.write(b'test\n')
proc.stdin.flush()

stdout, stderr = proc.communicate()
print (stdout)
print (stderr)
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 2

这段代码确实有效(在Windows 2008服务器上测试)。我用它来呼叫runas另一个用户并传递他的密码。将使用新的用户上下文打开新的命令提示符,无需输入密码。

请注意,您必须安装pywin32才能访问 win32 API。

这个想法是:

  • Popen命令runas,没有任何输入重定向,重定向输出
  • 一个字符一个字符地读取,直到遇到“:”(密码提示的最后一个字符)。
  • 使用包将按键事件发送到控制台win32,最后\r结束密码输入。

(改编自此代码):

import win32console, win32con, time
import subprocess

username = "me"
domain = "my_domain"
password ="xxx"

free_console=True
try:
    win32console.AllocConsole()
except win32console.error as exc:
    if exc.winerror!=5:
        raise
    ## only free console if one was created successfully
    free_console=False

stdin=win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)
    
p = subprocess.Popen(["runas",r"/user:{}\{}".format(domain,username),"cmd.exe"],stdout=subprocess.PIPE)
while True:
    if p.stdout.read(1)==b":":
        for c in "{}\r".format(password):  # end by CR to send "RETURN"
            ## write some records to the input queue
            x=win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
            x.Char=unicode(c)  # remove unicode for python 3
            x.KeyDown=True
            x.RepeatCount=1
            x.VirtualKeyCode=0x0
            x.ControlKeyState=win32con.SHIFT_PRESSED
            stdin.WriteConsoleInput([x])

        p.wait()
        break
Run Code Online (Sandbox Code Playgroud)