Уведомления

Группа в Telegram: @pythonsu

#1 Март 3, 2017 09:40:37

fayst59
Зарегистрирован: 2016-12-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка команд напрямую с клавиатуры

Добрый день форумчане!
При выполнении определенной задачи по автоматизации столкнулся с ниже указанной проблемой.
Мой скрипт открывает RDP (Удаленный рабочий стол) на винде, делает окно активным и нажимает клавишу Return (Enter). Загвоздка заключается в том что все эмуляторы клавиатуры которые я перепробовал (а именно Sendkeys, win32api, ctypes, pyuserinput, pykeyboard и т.п), отправляют команду нажатия клавиши не якобы физически, а системно. Соответственно RDP не распознает нажатую клавишу, т.к. удаленный рабочий стол может считывать либо команды из своей системы, либо с подключенной клавиатуры физически.
Каким макаром мне обмануть хитросплетение этих двух систем и заставить скрипт нажимать эмулировать нажатие клавиш физически?
З.Ы. Заранее благодарен за ответы, буду рад если существуют библиотеки занимающиеся подобной ересью.

Офлайн

#2 Март 6, 2017 20:27:34

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Отправка команд напрямую с клавиатуры

Никаким. Уже много раз подымалась данная тема на форуме.
Ибо пытаясь семулировать нажатие клавиши при раоте с той же либой win32 вы взаимодействуете с ПК с которого запускается РДП а не компом который в средине сессии!
Другими словами, если хотите направление для размышления вам нужно подключится к апи удаленного ПК внутри RDP сессии и уже потом емулировать что вам нужно.

Теоретически можно попробовать примянять нажатие ентера на активном окне коим долэен оказаться ваш РДП сеанс - но тут магия



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Март 15, 2017 09:35:56

fayst59
Зарегистрирован: 2016-12-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Отправка команд напрямую с клавиатуры

ZerG
Никаким. Уже много раз подымалась данная тема на форуме. Ибо пытаясь семулировать нажатие клавиши при раоте с той же либой win32 вы взаимодействуете с ПК с которого запускается РДП а не компом который в средине сессии!Другими словами, если хотите направление для размышления вам нужно подключится к апи удаленного ПК внутри RDP сессии и уже потом емулировать что вам нужно.Теоретически можно попробовать примянять нажатие ентера на активном окне коим долэен оказаться ваш РДП сеанс - но тут магия
Спасибо! Появилась мысль каким нибудь способом перехватить пакеты с клавиатуры, но тут уже начинаются танцы с бубном, не иначе.

Офлайн

#4 Март 16, 2017 10:34:01

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Отправка команд напрямую с клавиатуры

мне кажеться что вы подходите к проблеме не стой стороны, но нужно знать подробнее что вам нужно.

fayst59
Мой скрипт открывает RDP (Удаленный рабочий стол) на винде, делает окно активным и нажимает клавишу Return (Enter)
вы хотите делать какето дейтвия в РДП сессии на удаленом рабочем столе, или у вас стоит проблема автоматизации ввода логина-пароля??



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Март 16, 2017 12:29:32

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Отправка команд напрямую с клавиатуры

если просто автоматизация ввода логина пароля, то все делаеться на раз-два-три
либо используеться сторонний РДП клиент типа RDP Plus, который понимает в аргументах командной строки лоигн-пароль, либо через последовательный запуск через subprocess, win32api.ShellExecute или win32process.CreateProcess
cmdkey /generic:“server name or IP” /user:“username” /pass:“passwd”
mstsc /v:“server name or IP”
cmdkey /delete:“server name or IP”

если надо чтото посылать в уже работающую RDP сесию то это умеет AutoIT( может еще кто, наверняка, но я не искал)
для работы с AutoIT есть такая обертка https://pypi.python.org/pypi/PyAutoIt/0.3 но я ее не пробовал, так как она только для второй ветки
Также нашел PyAutoItPy https://github.com/AhonVashibaka/PyAutoItPy
по сути тоже обертка для работы с AutoItX3.dll
Нижеприведенный код ищет окно с активным РДП сеансом по имени заголовка окна, деает его активным, запускает cmd.exe и в нем выводит таблицу маршрутизации коммандой route print.

 import time
from os import system
from PyAutoItPy import AutoItX, WinHandle
def main():
    Automat=AutoItX()
    #Ищем окно РДП сеанса по заголовку
    Title='[TITLE:192.168.16.225 - Подключение к удаленному рабочему столу]'
    """
        Специальное установки могут быть использованы в качестве параметра title в функциях работы с окнами.
        Эти установки могут быть использованы, чтобы отличить окна по следующим свойствам:
        TITLE - Заголовок окна
        CLASS - Внутреннее название класса окна
        REGEXPTITLE -Заголовок окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение @error будет установлено равным 2)
        REGEXPCLASS - Название класса окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение @error будет установлено равным 2)
        .......
         (с) Из офф справки по AUtoit https://autoit-script.ru/autoit3_docs/intro/windowsadvanced.htm
    """
    Handle=WinHandle(Automat.WinGetHandle(Title))
    if  Handle == '[HANDLE:0x00000000]':
        print('Невозможно получить Handle', Title)
        exit(-1)
    Automat.WinActivate(Handle)  # делаем окно активным
    Automat.Send('{LWIN}')
    time.sleep(1)               # задерки нужны изза времени реакции ОС на нажатия клавиш
    Automat.Send('{UP}')
    Automat.Send('{UP}')
    Automat.Send('{UP}')
    Automat.Send('{ENTER}')
    time.sleep(1)
    Automat.Send('cmd')
    Automat.Send('{ENTER}')
    time.sleep(1)
    Automat.Send('route print')
    Automat.Send('{ENTER}')
if __name__ == '__main__':
    main()
естественно вы должны понимать что АутоИт не сможет заглянуть за окно РДП сенса. Тоесть вы не сможете получить хендл окна в РДП сеансе.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 16, 2017 13:02:28)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version