我设法通过python打开cmd。但是,在执行cmd.exe之前,使用runas管理员会附带密码检查。
我正在用它打开cmd ......
import subprocess
subprocess.call(["runas", "/user:Administrator", "cmd.exe"])
我正在寻找一种方法来自动输入密码到runas.exe提示符,该提示符在我运行代码时打开。如果我要创建var = "test"
并在import subprocess
之后添加它,我将如何创建它以便将此变量传递给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)
答案 0 :(得分:2)
虽然不是您问题的答案,但这可以解决您的问题。使用psexec代替runas。你可以像这样运行它:
psexec -u user -p password cmd
(或使用subprocess.Popen
或其他东西从Python运行它)
答案 1 :(得分:1)
这段代码实际上可行(在Windows 2008服务器上测试)。我用它来为不同的用户拨打runas
并传递他的密码。使用新用户上下文打开的新命令提示符,无需输入密码。
请注意,您必须安装pywin32
才能访问win32 API。
这个想法是:
Popen
runas
命令,没有任何输入重定向,重定向输出win32
个包将关键事件发送到控制台,最后\r
结束密码输入。(改编自this code):
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)==":":
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)
x.KeyDown=True
x.RepeatCount=1
x.VirtualKeyCode=0x0
x.ControlKeyState=win32con.SHIFT_PRESSED
stdin.WriteConsoleInput([x])
p.wait()
break
答案 2 :(得分:0)
我正在尝试与伴侣ExoticScarf一样。 复制您的代码 `
args=(["runas.exe", "/user:admin", "program.exe"])
proc = subprocess.Popen(args,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
passw='password'
proc.stdin.write(passw)
proc.stdin.flush()
stdout, stderr = proc.communicate()
print (stdout)
print (stderr)`
添加 universal_newlines = True 似乎可以像str那样写通行证,而不像像字节的对象那样。