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

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 [?]

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

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




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


 

Похожие темы

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