我的问题的简要说明:
1。 我的Jenkins工作需要建立与另一台计算机的RDP连接以执行一些活动。
2。 直到最近,会话之间仍保留默认密码。但是现在某些设置已更改,每次我创建新的RDP会话时都需要手动重新输入密码。
我准备了一个简短的python脚本,该脚本通过win32gui软件包与Windows gui交互。
我使用pyinstaller从此脚本构建了一个独立的可执行文件。 最后,我将对这个可执行文件的调用直接添加到作业中。
Somethig这样的:
while attempts:
security_window_title = "Windows Security"
try:
hwnd_credentials = win32gui.FindWindow(0, security_window_title)
window_controls = []
win32gui.EnumChildWindows(hwnd_credentials, collect_window_control, None)
focus_on_window(hwnd_credentials)
sleep(0.5)
prev_user_login = window_controls[2]["hwnd"]
x = int(window_controls[1]["x"] + 80)
y = int(window_controls[1]["y"] + 20)
click(x, y)
type_message(password)
ok_button = window_controls[6]["hwnd"]
push_button(ok_button)
except win32gui.error:
sleep(1)
attempts -= 1
if not attempts:
raise RuntimeError("Can't interact with window: {}.".format(security_window_title))
else:
break
while attempts:
sleep(timeout)
attempts -= 1
if check_connection_started():
break
if check_certificate_errors():
for control in window_controls[::-1]:
if control["text"] == "&Yes":
push_button(control["hwnd"])
if not attempts:
raise RuntimeError("Connection not established.")
3。 当从作业运行脚本并使用功能齐全的Windows ui时,这将不是问题。我可以找到一个窗口,该窗口中的脚本应该使用win32gui python软件包指定密码。我可以生成所有适当的键盘事件来输入密码。
通过控制台使用RDP为我提供了一组非常奇怪的类似于Windows的对象,我无法使用win32gui python包与普通Windows进行交互。例如,我确实找到一个窗口,该窗口的hwnd非零,并且text属性等于“ Remote Desktop Connection”。但是我无法使用基本方法win32gui.SetForegroundWindow(hwnd)专注于此类窗口。这导致未命名的win32gui异常。
是否有可能将密码转移到所需的类似于窗口的结构的控件中,以便作业不会中断其执行?
非常感谢您的帮助。
答案 0 :(得分:0)
我可以使用win32gui.SetForegroundWindow(hwnd)
专注于“远程桌面连接”和“ Windows安全性”。
示例代码:
import win32api
import win32gui
import win32con
import time
from pynput.keyboard import Key, Controller
def main():
Remote = "Remote Desktop Connection"
Security = "Windows Security"
try:
hwnd_Remote = win32gui.FindWindow(0, Remote)
print(hwnd_Remote)
win32gui.ShowWindow(hwnd_Remote,win32con.SW_SHOWNORMAL)
win32gui.SetForegroundWindow(hwnd_Remote)
keyboard = Controller()
keyboard.type('ipaddress')
keyboard.press(Key.enter)
keyboard.release(Key.enter)
time.sleep(3)
hwnd_Security = win32gui.FindWindow(0, Security)
print(hwnd_Security)
win32gui.ShowWindow(hwnd_Security,win32con.SW_SHOWNORMAL)
win32gui.SetForegroundWindow(hwnd_Security)
keyboard.type('password')
keyboard.press(Key.enter)
keyboard.release(Key.enter)
except win32gui.error:
raise RuntimeError("Can't interact with window: {}.".format(Remote))
if __name__ == "__main__":
main()
确保前台进程没有禁用对SetForegroundWindow
函数的调用。添加LockSetForegroundWindow(LSFW_UNLOCK)
或AllowSetForegroundWindow(ASFW_ANY)
以启用对SetForegroundWindow
的呼叫。