Автор Тема: [Автоматизация] Радмин, автоввод данных в разных окнах разных данных  (Прочитано 10881 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Glass4217 [?]

  • Новичок
  • *
  • Сообщений: 31
  • Репутация: 0
  • Пол: Мужской
    • Награды
Есть две простейшие лентяйки, которые ждут появления окна радмина и в зависимости от заголовка срабатывает одна или иная, задумал скрестить их в одну и уперся, справку вроде покурил, но в связи с далекостью от програмирования не сообразил как выразить это в код. подскажите плиз))
Код: AutoIt [Выделить]
WinWaitActive("Ввести информацию пользователя WindowsNT")   ;Ждем появления окна с заголовком Ввести информацию пользователя WindowsNT
Sleep(1000)                                                 ;Задержка длительностью 1 секунда навсякй случай
Send ("логин1{TAB}паролль1{ENTER}")                         ;Ввод логина пароля
run("pasword2.exe")                                         ;Запуск новой копии скрипта
Exit                                                        ;выход из текущего скрипта


Код: AutoIt [Выделить]
WinWaitActive("Система безопасности Windows")                ;Ждем появления окна с заголовком Ввести информацию пользователя WindowsNT
Sleep(1000)                                                 ;Задержка длительностью 1 секунда навсякй случай
Send ("логин2{TAB}паролль2{ENTER}")                         ;Ввод логина пароля
run("pasword2.exe")                                         ;Запуск новой копии скрипта
Exit                                                        ;выход из текущего скрипта


необходимо чтобы скрипт сидел ждал появления окна с нужным именем и начинал ввод данных.
« Последнее редактирование: Февраль 04, 2010, 19:29:13 от Glass4217 »
Нам разум дал  стальные руки-крюки.

Русское сообщество AutoIt


Оффлайн killbond [?]

  • Осваивающий
  • **
  • Сообщений: 96
  • Репутация: 32
  • Пол: Мужской
    • Награды
Если не требуется ждать их последовательного появления, то можно так:

Код: AutoIt [Выделить]
$sFirstWnd = "Ввести информацию пользователя WindowsNT" ; Название 1-го окна                                         
$sSecondWnd = "Система безопасности Windows" ; Название 2-го окна
$bFirstCompleted = 0    ; Переключатель, сигнализирует факт обработки первого окна
$bSecondCompleted = 0   ; Тоже переключатель, сигнализирует факт обработки второго окна


While Not $bFirstCompleted AND Not $bSecondCompleted    ; Цикл, будет выполняться, пока переключатели на нуле
    If ( WinExists ( $sFirstWnd ) ) And ( Not $bFirstCompleted ) Then   ; Если существует 1-ое окно и его переключатель на нуле, то условие выполняется
        WinActivate ( $sFirstWnd )                                      ; Если окно существует, то это не значит, что оно активно, поэтому есго надо активировать
        Sleep(1000)                                                     ; Твоя пауза в 1 секунду
        Send ("логин1{TAB}пароль1")                                      ; Отправить логин пароль (только вот куда?) лучше заменить ControlSend
        $bFirstCompleted = Not $bFirstCompleted                         ; Поставить переключатель для этого окна в 1
        ContinueLoop                                                    ; Проверить еще раз условие цикла
    EndIf                                                               ; Закрывает условный оператор
    If ( WinExists ( $sSecondWnd ) ) And ( Not $bSecondCompleted ) then     ; Если существует 2-ое окно и его переключатель на нуле, то условие выполняется
        WinActivate ( $sSecondWnd )                                         ; Если окно существует, то это не значит, что оно активно, поэтому есго надо активировать                                                               
        Sleep(1000)                                                         ; Твоя пауза в 1 секунду
        Send ("Логин2{TAB}Пароль2")                                          ; Отправить логин пароль (только вот куда?) лучше заменить ControlSend
        $bSecondCompleted = Not $bSecondCompleted                           ; Поставить переключатель для этого окна в 1
        ContinueLoop                                                        ; Проверить еще раз условие цикла                                       
    EndIf                                                                   ; Закрывает условный оператор
Wend
Exit    ; Выход, когда условие цикла станет неверным


Если требуется, то в этой строчке просто заменить AND на OR:
Код: AutoIt [Выделить]
While Not $bFirstCompleted AND Not $bSecondCompleted


Маленькая поправка: наобарот, если требуется, то OR, если не требуется - то AND  :whistle:
« Последнее редактирование: Февраль 04, 2010, 19:50:34 от killbond »
AutoIt - Может ВСЁ!
I will find my way, I will reach the end, I have enough forces!

Оффлайн Glass4217 [?]

  • Новичок
  • *
  • Сообщений: 31

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Код: AutoIt [Выделить]
$bFirstCompleted = 0
$bSecondCompleted = 0

Кто это?
не могу понять зачем тут
Код: AutoIt [Выделить]
 WinActivate ( $sFirstWnd )

что мы собираемся тут включать?? надо дождаться когда окно появится.
также не могу понять что делает это)
Код: AutoIt [Выделить]
While (Not $bFirstCompleted) or (Not $bSecondCompleted)
    If ( WinExists ( $sFirstWnd ) ) And ( $bFirstCompleted ) Then

и совсем лишнее
Код: AutoIt [Выделить]
run("pasword.exe")
run("pasword2.exe")



Оффлайн killbond [?]

  • Осваивающий
  • **
  • Сообщений: 96
  • Репутация: 32
  • Пол: Мужской
    • Награды
Цитировать
Код: AutoIt [Выделить]
$bFirstCompleted = 0
$bSecondCompleted = 0


Кто это?

Это переключатели, которые в данном скрипте сигнализируют о том, что 1-ое и 2-ое окна обработаны.

Цитировать
не могу понять зачем тут
Код: AutoIt [Выделить]
 WinActivate ( $sFirstWnd )

что мы собираемся тут включать?? надо дождаться когда окно появится.

Верно, нужно дождаться, но WinWaitActive не может ждать 2 окна, поэтому, запускаем вечный цикл и в нем проверку на то, существует ли какое-то из указанных окон. Если результат будет 1 (окно существует) то это не значит, что оно активно, поэтому WinActivate  :)
Затем выполнить некоторые команды для активного окна (в данном случае ввести логин, пароль) и установить переключатель в 1 (будет сигнализировать о том, что окно обработано)

Цитировать
также не могу понять что делает это)
Код: AutoIt [Выделить]
While (Not $bFirstCompleted) or (Not $bSecondCompleted)
    If ( WinExists ( $sFirstWnd ) ) And ( $bFirstCompleted ) Then


Оператор цикла, цикл будет продолжаться до тех пор, пока оба переключателя не станут единицами. В условном операторе следует указать 2 выражения, т.к. если переключатель стоит в 1 (т.е. окно обработано) повторно его обрабатывать не нужно, для этого проверяется существование окна и "положение" переключателя.

Цитировать
и совсем лишнее
Код: AutoIt [Выделить]
run("pasword.exe")
run("pasword2.exe")


А в твоих скриптах тогда оно зачем? Какие исходники мне дали, такие я и соединял  :)

Заметил некоторые ошибки, исправил, смотри еще раз. Просто я тогда не проверял, теперь проверил, работает - точно.

Русское сообщество AutoIt


Оффлайн Glass4217 [?]

  • Новичок
  • *
  • Сообщений: 31

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Спасибо большое, все заробило, а
Код: AutoIt [Выделить]
run("pasword.exe")

самый первый способ перезапуска скрипта)) ну и польлзую по привычке))

Оффлайн Guezt Gutsy [?]

  • Продвинутый
  • ***
  • Сообщений: 335
  • Репутация: 81
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
HotKeySet("^!q","_quit") ; Ctrl+Alt+q для завершения скрипта по горячей клавише
HotKeySet("^!й","_quit") ; Ctrl+Alt+q для завершения скрипта по горячей клавише
While 1
    WinWaitActive("", "", 10)
    If WinWaitActive("Ввести информацию пользователя WindowsNT для адреса такого то") Then
        Sleep(1000)
        Send("Логин2{TAB}Пароль2{ENTER}")
        ;_quit() ; Расскоментируй если надо выходить с "лентяйки по  завершению ввода пароля
    ElseIf WinWaitActive("Система безопасности Windows для адреса такого то") Then
        Sleep(1000)
        Send("Логин2{TAB}Пароль2{ENTER}")
       ;_quit() ; Расскоментируй если надо выходить с "лентяйки по завершению ввода пароля
    EndIf
WEnd
Func _quit()
    Exit
EndFunc


вот еще простой пример.

Оффлайн Glass4217 [?]

  • Новичок
  • *
  • Сообщений: 31

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Второй вариант лучше, ибо не выжирает весь процессор))) и не требует доработок)
killbond спасибо за мысль про ControlSend подумаю)

Оффлайн Glass4217 [?]

  • Новичок
  • *
  • Сообщений: 31

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Код: AutoIt [Выделить]
$sFirstWnd = "окно1"                ; Название 1-го окна                                          
$sSecondWnd = "окно2"               ; Название 2-го окна
$bFirstCompleted = 0                    ; Переключатель, сигнализирует факт обработки первого окна
$bSecondCompleted = 0                   ; Тоже переключатель, сигнализирует факт обработки второго окна

While Not $bFirstCompleted AND Not $bSecondCompleted                    ; Цикл, будет выполняться, пока переключатели на нуле
    If ( WinWaitActive ( $sFirstWnd ) ) And ( Not $bFirstCompleted ) Then   ; Если существует 1-ое окно и его переключатель на нуле, то условие выполняется
        Sleep(500)                                                      ; Пауза в 0,5 секунд
        Send ("Логин1{TAB}Пароль1{ENTER}")                   ; Отправить логин пароль
    EndIf                                                               ; Закрывает условный оператор
    If ( WinWaitActive ( $sSecondWnd ) ) And ( Not $bSecondCompleted ) then ; Если существует 2-ое окно и его переключатель на нуле, то условие выполняется
        Send ("Логин2{TAB}Пароль2{ENTER}")                   ; Отправить логин пароль                                    
    EndIf                                                               ; Закрывает условный оператор
Wend
Exit  


вот слегка скрестил оба скрипта , теперь он не жрет камень) и работает)
« Последнее редактирование: Февраль 07, 2010, 02:38:56 от Glass4217 »

Русское сообщество AutoIt


Оффлайн killbond [?]

  • Осваивающий
  • **
  • Сообщений: 96
  • Репутация: 32
  • Пол: Мужской
    • Награды
В таком случае нормального завершения скрипта не будет, и вообще, его можно оптимизировать так:
Код: AutoIt [Выделить]
$sFirstWnd = "окно1"                                                        
$sSecondWnd = "окно2"                    

While 1                
    If WinWaitActive ( $sFirstWnd )Then  
        Sleep(500)                                                    
        Send ("Логин1{TAB}Пароль1{ENTER}")                  
    EndIf                                                            
    If WinWaitActive ( $sSecondWnd ) then
        Send ("Логин2{TAB}Пароль2{ENTER}")                                          
    EndIf                                                            
Wend


Но с другой стороны, этот скрипт дожидается не появления окна, а именно того момента, когда окно станет активным.  Ну раз уж работает, то ладно, но на всякий случай: в моем варианте можно было просто вставить в цикл паузу примерно 10-250 мс и процессор был бы менее загружен:
Код: AutoIt [Выделить]
$sFirstWnd = "Ввести информацию пользователя WindowsNT"                          
$sSecondWnd = "Система безопасности Windows"
$bFirstCompleted = 0
$bSecondCompleted = 0


While Not $bFirstCompleted OR Not $bSecondCompleted    
    If ( WinExists ( $sFirstWnd ) ) And ( Not $bFirstCompleted ) Then  
        WinActivate ( $sFirstWnd )                                    
        Sleep(1000)                                                  
        Send ("логин1{TAB}пароль1""Логин2{TAB}Пароль2")                                      
        $bSecondCompleted = Not $bSecondCompleted                    
        ContinueLoop                                
    EndIf
    Sleep (250)
Wend
Exit




Оффлайн Glass4217 [?]

  • Новичок
  • *
  • Сообщений: 31

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Код: AutoIt [Выделить]
$sFirstWnd = "Ввести информацию пользователя WindowsNT"                          
$sSecondWnd = "Система безопасности Windows"
$bFirstCompleted = 0
$bSecondCompleted = 0


While Not $bFirstCompleted OR Not $bSecondCompleted    
    If ( WinExists ( $sFirstWnd ) ) And ( Not $bFirstCompleted ) Then  
        WinActivate ( $sFirstWnd )                                    
        Sleep(500)                                                  
        Send ("Логин1{TAB}Пароль1")
        $bFirstCompleted = Not $bFirstCompleted                        
        ContinueLoop
            Run("Pass2.exe""Логин2{TAB}Пароль2")
        $bSecondCompleted = Not $bSecondCompleted                    
        ContinueLoop  
            Run("Pass2.exe")
            Exit                                 
    EndIf
    Sleep (250)
Wend
Exit

Решил использовать второй вариант, спс)
вопрос перезапуска решил по простому и без выкрутасов так сказать по деревенски)))


Добавлено: Февраль 07, 2010, 11:19:02
В таком случае нормального завершения скрипта не будет, и вообще, его можно оптимизировать так:
Код: AutoIt [Выделить]
$sFirstWnd = "окно1"                                                        
$sSecondWnd = "окно2"                    

While 1                
    If WinWaitActive ( $sFirstWnd )Then  
        Sleep(500)                                                    
        Send ("Логин1{TAB}Пароль1{ENTER}")                  
    EndIf                                                            
    If WinWaitActive ( $sSecondWnd ) then
        Send ("Логин2{TAB}Пароль2{ENTER}")                                          
    EndIf                                                            
Wend


это да, я уже позже заметил несколько странное поведение скрипта))
« Последнее редактирование: Февраль 07, 2010, 11:19:02 от Glass4217, Причина: Объединение сообщений »

Оффлайн j_onion [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Не помню уже где, когдато нашел вот такой скрипт. Ники программеров в конце, я лишь слегка его доработал (убрал проверку на запущенный radmin, потому что некоторые соединения запускаю с ярлыка, без запуска самого виевера, и добавил нормальную обработку окна ввода пароля при подключении к серверу радмина второй версии. Все это сделано при аутентификации радмин, так как виндовой не пользуюсь, ее не менял.
Код: AutoIt [Выделить]
#include <GUIConstants.au3>
#include <string.au3>
;~ #include <Constants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#NoTrayIcon
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
$version = 'Radmin Viewer Version 3.3.0. rus, работает с сервером второй версии'
$mytitle = 'Агент Radmin Viewer:'
$title = 'Radmin Viewer'
$title1 = 'Система безопасности Windows:  '
$title2 = 'Система безопасности Radmin: '
$title1len = StringLen($title1)
$title2len = StringLen($title2)
$s_EncryptPassword = 'qa1w3xe6crfvl;jjkghvfhfd'
$sIni = @ScriptDir & '\' & 'RaAgent.ini'

;if not FileExists(@ScriptDir & '\Radmin.exe') Then
;    MsgBox(0,@ScriptName,'Файл "' & @ScriptDir & '\Radmin.exe" не найден!' & @CRLF & 'Попробуйте скопировать "' & @ScriptName & '" в "' & @ProgramFilesDir & '\Radmin Viewer 3\ !')
;    Exit
;Else
;    Run('Radmin.exe')
;    WinWait($title,'',10)
;EndIf

Opt("TrayOnEventMode",1)
Opt("TrayMenuMode",1)
$aboutitem  = TrayCreateItem("О программе")
TrayItemSetOnEvent(-1,"ShowInfo")
TrayCreateItem('')
$exititem   = TrayCreateItem("Выход")
TrayItemSetOnEvent(-1,"ExitScript")
TraySetState()


Do
    $msg = TrayGetMsg()
    Select
        Case WinExists($title1)
            _WindowsPass()
            WinWaitClose($title1)
        Case WinExists($title2)
            _RadminPass()
            WinWaitClose($title2)
        Case Else
            Sleep(1000)
    EndSelect
;Until Not WinExists($title)
Until Not 1

Func _WindowsPass()
    $auto = 0
    $name = StringMid(WinGetTitle($title1), $title1len)
    $pos = WinGetPos($title1)
    $gui = GUICreate( $mytitle & $name,338,159,$pos[0] + 20,$pos[1] + 20)
    GUICtrlCreateLabel( 'Имя пользователя:', 18,23,108,16)
    GUICtrlCreateLabel( 'Пароль:', 18,57,59,16)
    GUICtrlCreateLabel( 'Домен:', 18,91,59,16)
    $sData = IniReadSection($sIni, $name)
    If @error or not ($sData[0][0] = 3) Then
        Dim $sData[4][2]
        $sData[1][1] = ControlGetText( $title1,'', 'Edit1')
        $sData[2][1] = ''
        $sData[3][1] = ControlGetText( $title1,'', 'Edit3')
    Else
        $sData[2][1] = _StringEncrypt(0, $sData[2][1], $s_EncryptPassword)
        $auto = 1
    EndIf
    $myedit1 = GUICtrlCreateEdit ( $sData[1][1], 137,20,173,23, 0)
    $myedit2 = GuiCtrlCreateInput ( $sData[2][1], 137,55,173,23, $ES_PASSWORD)
    $myedit3 = GUICtrlCreateEdit ( $sData[3][1], 137,89,173,23, 0)
    $button1 = GUICtrlCreateButton ('OK', 83,125,75,23, $BS_DEFPUSHBUTTON)
    $button2 = GUICtrlCreateButton ('Отмена', 180,125,75,23)
    GUISetState()
    Do
        $msg = GUIGetMsg()
        Select
            Case $msg = $GUI_EVENT_CLOSE
                ExitLoop
            Case ($msg = $button1) or $auto
                ControlFocus($title1, '', 'Edit1')
                ControlSetText($title1, '', 'Edit1', GUICtrlRead($myedit1))
                ControlFocus($title1, '', 'Edit2')
                ControlSetText($title1, '', 'Edit2', GUICtrlRead($myedit2))
                ControlFocus($title1, '', 'Edit3')
                ControlSetText($title1, '', 'Edit3', GUICtrlRead($myedit3))
                ControlClick($title1, '','Button2')
                if $auto Then
                    _checkPassword($name,1)
                Else
                    if _checkPassword($name) then
                        $sData = 'Login=' & GUICtrlRead($myedit1) & @LF & 'Password=' & _StringEncrypt(1, GUICtrlRead($myedit2), $s_EncryptPassword) & @LF & 'Domen=' & GUICtrlRead($myedit3)
                        IniWriteSection($sIni, $name, $sData)
                    EndIf
                EndIf
                ExitLoop
            Case $msg = $button2
                ExitLoop
            Case Else
                Sleep(10)
        EndSelect
    Until Not WinExists($title1)
    GUIDelete()
EndFunc

Func _RadminPass()
    $auto = 0
    $name = StringMid(WinGetTitle($title2), $title2len) ;имя подключения
    $pos = WinGetPos($title2)
    $gui = GUICreate('Агент Radmin Viewer: ' & $name,345,85,$pos[0] + 20,$pos[1] + 20)
    GUICtrlCreateLabel( 'Введите пароль:', 35,18,93,16)
    $sData = IniReadSection($sIni, $name)
    If @error or not ($sData[0][0] = 1) Then
        Dim $sData[2][2]
        $sData[1][1] = ''
    Else
        $sData[1][1] = _StringEncrypt(0, $sData[1][1], $s_EncryptPassword)
        $auto = 1
    EndIf
    $myedit1 = GuiCtrlCreateInput ( $sData[1][1], 135,15,173,23, $ES_PASSWORD)
    $button1 = GUICtrlCreateButton ('OK', 90,50,75,23, $BS_DEFPUSHBUTTON)
    $button2 = GUICtrlCreateButton ('Отмена', 188,50,75,23)
    GUISetState()
    Do
        $msg = GUIGetMsg()
        Select
            Case $msg = $GUI_EVENT_CLOSE
                ExitLoop
             Case ($msg = $button1) or $auto
                $controlname = StringMid(ControlGetText($title2, '', 'Static1'),1,7)
                if ($controlname='Введите') then ;диалог радмин 2.0
                ControlFocus($title2, '', 'Edit1')
                ControlSetText($title2, '', 'Edit1', GUICtrlRead($myedit1))
                ControlClick ( $title2, '','Button1')
                else
                ControlFocus($title2, '', 'Edit1') ;диалог радмин 3.0
                ControlSetText($title2, '', 'Edit2', GUICtrlRead($myedit1))
                ControlClick ( $title2, '','Button2')
                EndIf
                if $auto Then
                    _checkPassword($name,1)
                Else
                    if _checkPassword($name) then
                        $sData = 'Password=' & _StringEncrypt(1, GUICtrlRead($myedit1), $s_EncryptPassword)
                        IniWriteSection($sIni, $name, $sData)
                    EndIf
                EndIf
                ExitLoop
            Case $msg = $button2
                ExitLoop
            Case Else
                Sleep(10)
        EndSelect
    Until Not WinExists($title2)
    GUIDelete()
EndFunc

Func _checkPassword($name,$delete = 0)
    If WinWait('Информация о соединении', 'Неверный пароль', 2) Then
        If $delete Then
            If MsgBox(1,$mytitle,'Удалить запись ' & $name & '?') = 1 Then
                IniDelete ($sIni,$name)
            EndIf
        EndIf
    Else
        Return 1
    EndIf
EndFunc

Func ShowInfo()
    Msgbox(64,$mytitle,'Версия 0.2' & @CRLF & 'Работает с ' & $version  & @CRLF & 'Ura, Pluscord, слегка chaus')
EndFunc


Func ExitScript()
    Exit
EndFunc
 


Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
j_onion
Вы на дату темы смотрели?!
Удивительный народ!

Скорблю и помню.




Оффлайн Vladimir02 [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
Вы на дату темы смотрели?!
Удивительный народ!
не. ну вы не правы. лучше поздно чем никогда.. мне сегодня понадобилась как раз таки такая штука для Радмина, даже свой костыль написал, но он не так изящен как предоставленный j_onion... так что j_onion огромное спасибо! :beer:

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
19 Ответов
23116 Просмотров
Последний ответ Ноябрь 03, 2015, 02:23:08
от Skif_off
11 Ответов
7040 Просмотров
Последний ответ Июль 27, 2012, 13:08:55
от AZJIO
5 Ответов
3097 Просмотров
Последний ответ Апрель 04, 2013, 18:58:36
от InnI
4 Ответов
1758 Просмотров
Последний ответ Июль 30, 2015, 21:13:32
от Ksaan
11 Ответов
3184 Просмотров
Последний ответ Декабрь 06, 2016, 21:16:00
от Anna
1 Ответов
1056 Просмотров
Последний ответ Январь 09, 2017, 18:47:43
от InnI
1 Ответов
600 Просмотров
Последний ответ Январь 19, 2017, 12:12:36
от InnI
11 Ответов
1083 Просмотров
Последний ответ Июль 06, 2017, 15:59:25
от ra4o
1 Ответов
538 Просмотров
Последний ответ Август 19, 2017, 12:27:06
от ra4o
7 Ответов
480 Просмотров
Последний ответ Февраль 14, 2018, 16:07:09
от InnI