<p>这段代码实际上可以工作(在Windows2008服务器上测试)。我用它为另一个用户调用<code>runas</code>,并传递他的密码。使用新用户上下文打开的新命令提示,无需输入密码。</p>
<p>请注意,您必须安装<code>pywin32</code>才能访问win32 API。</p>
<p>想法是:</p>
<ul>
<li>对于<code>Popen</code>命令,在没有任何输入重定向的情况下,重定向输出</li>
<li>逐字符读取,直到遇到“:”(密码提示的最后一个字符)。</li>
<li>使用<code>win32</code>包将密钥事件发送到控制台,最后使用<code>\r</code>结束密码输入。</li>
</ul>
<p>(改编自<a href="http://nullege.com/codes/show/src%40m%40a%40main-HEAD%40External.LCA_RESTRICTED%40Languages%40IronPython%4027%40Lib%40site-packages%40win32%40Demos%40win32console_demo.py/51/win32console.GetStdHandle.WriteConsoleInput/python" rel="nofollow noreferrer">this code</a>):</p>
<pre><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
</code></pre>