硬编码密码而不是提示输入

2 投票
2 回答
2868 浏览
提问于 2025-04-18 06:59

@hybris95 - 由于问题的范围发生了变化,而且你很积极回应,我会把你最初的回答标记为解决方案,但我发布了一个后续问题

脚本无法读取密码


我的Python脚本会以提升的用户身份执行另一个脚本。不幸的是,它在执行过程中会让我输入密码。

我该如何把密码写死在代码里,或者自动从其他地方读取密码?有没有什么方法可以在Python中实现?

import os
import sys
import win32com.shell.shell as sh   
ASADMIN = '/user:DOMAIN\user'
os.system('"runas /user:DOMAIN\user "D:/Python27/python.exe myscript.py""')
sys.exit(0)

if sys.argv[-1] != ASADMIN:
    script = os.path.abspath(sys.argv[0])
    params = ''.join([ASADMIN] + ['D:\Python27\python.exe',script] + sys.argv[1:])
    sh.ShellExecuteEx(lpVerb='runas',lpFile=sys.executable,lpParameters=params)
    sys.exit(0)

更新后的代码,但仍然出现错误

import os
import sys, subprocess, socket, string
import wmi, win32api, win32con
import win32com.shell.shell as sh   

command = 'runas /user:DOMAIN\username "D:/Python27/python.exe myscript.py"'

pst = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE)

pst.communicate("password123")

我遇到的错误

Attempting to start D:/Python27/python.exe script.py as user "DOMAIN\username" ...
RUNAS ERROR: Unable to run - D:/Python27/python.exe myscript.py
1326: Logon failure: unknown user name or bad password.

2 个回答

1

你可以使用 subprocess.Popen() 来创建一个子进程,然后用 Popen.communicate() 来给这个子进程提供输入(比如密码):

p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE)
p.communicate(password)
1

因为RunAs这个工具没有提供不需要输入密码的选项。
所以你可以通过一个文件来传递密码。

比如说(在命令行里),我会这样做:
runas /user:DOMAIN\user "D:/Python27/python.exe myscript.py < password.txt
这里的password.txt文件里存放着我的密码。

补充一下:
你也可以直接把密码写在命令里,用管道符来传递:
echo "MyPassword" | runas /user:DOMAIN\user "D:/Python27/python.exe myscript.py

撰写回答