Что нового

[Автоматизация] Радмин, автоввод данных в разных окнах разных данных

All2khoff

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


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


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

killbond

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

Код:
$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:
Код:
While Not $bFirstCompleted AND Not $bSecondCompleted


Маленькая поправка: наобарот, если требуется, то OR, если не требуется - то AND :whistle:
 
Автор
All2khoff

All2khoff

Продвинутый
Сообщения
376
Репутация
68
Код:
$bFirstCompleted = 0
$bSecondCompleted = 0
Кто это?
не могу понять зачем тут
Код:
WinActivate ( $sFirstWnd )
что мы собираемся тут включать?? надо дождаться когда окно появится.
также не могу понять что делает это)
Код:
While (Not $bFirstCompleted) or (Not $bSecondCompleted)
    If ( WinExists ( $sFirstWnd ) ) And ( $bFirstCompleted ) Then

и совсем лишнее
Код:
run("pasword.exe")
run("pasword2.exe")
 

killbond

Осваивающий
Сообщения
96
Репутация
32
Код:
$bFirstCompleted = 0
$bSecondCompleted = 0

Кто это?

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

не могу понять зачем тут
Код:
WinActivate ( $sFirstWnd )
что мы собираемся тут включать?? надо дождаться когда окно появится.

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

также не могу понять что делает это)
Код:
While (Not $bFirstCompleted) or (Not $bSecondCompleted)
    If ( WinExists ( $sFirstWnd ) ) And ( $bFirstCompleted ) Then

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

и совсем лишнее
Код:
run("pasword.exe")
run("pasword2.exe")

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

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

All2khoff

Продвинутый
Сообщения
376
Репутация
68
Спасибо большое, все заробило, а
Код:
run("pasword.exe")
самый первый способ перезапуска скрипта)) ну и польлзую по привычке))
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Код:
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


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

All2khoff

Продвинутый
Сообщения
376
Репутация
68
Второй вариант лучше, ибо не выжирает весь процессор))) и не требует доработок)
killbond спасибо за мысль про ControlSend подумаю)
 
Автор
All2khoff

All2khoff

Продвинутый
Сообщения
376
Репутация
68
Код:
$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


вот слегка скрестил оба скрипта , теперь он не жрет камень) и работает)
 

killbond

Осваивающий
Сообщения
96
Репутация
32
В таком случае нормального завершения скрипта не будет, и вообще, его можно оптимизировать так:
Код:
$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 мс и процессор был бы менее загружен:
Код:
$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")                                      
        $bFirstCompleted = Not $bFirstCompleted                        
        ContinueLoop                                                    
    ElseIf ( WinExists ( $sSecondWnd ) ) And ( Not $bSecondCompleted ) then    
        WinActivate ( $sSecondWnd )                                                                                                       
        Sleep(1000)                                                       
        Send ("Логин2{TAB}Пароль2")                                       
        $bSecondCompleted = Not $bSecondCompleted                    
        ContinueLoop                                 
    EndIf 
	Sleep (250)
Wend
Exit
 
Автор
All2khoff

All2khoff

Продвинутый
Сообщения
376
Репутация
68
Код:
$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")
			Exit                                                   
    ElseIf ( WinExists ( $sSecondWnd ) ) And ( Not $bSecondCompleted ) then    
        WinActivate ( $sSecondWnd )                                                                                                       
        Sleep(500)                                                       
        Send ("Логин2{TAB}Пароль2")
        $bSecondCompleted = Not $bSecondCompleted                    
        ContinueLoop   
			Run("Pass2.exe")
			Exit	                              
    EndIf 
    Sleep (250)
Wend
Exit

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


Добавлено:
Сообщение автоматически объединено:

killbond сказал(а):
В таком случае нормального завершения скрипта не будет, и вообще, его можно оптимизировать так:
Код:
$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


это да, я уже позже заметил несколько странное поведение скрипта))
 

j_onion

Новичок
Сообщения
1
Репутация
0
Не помню уже где, когдато нашел вот такой скрипт. Ники программеров в конце, я лишь слегка его доработал (убрал проверку на запущенный radmin, потому что некоторые соединения запускаю с ярлыка, без запуска самого виевера, и добавил нормальную обработку окна ввода пароля при подключении к серверу радмина второй версии. Все это сделано при аутентификации радмин, так как виндовой не пользуюсь, ее не менял.
Код:
#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

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
j_onion
Вы на дату темы смотрели?!
Удивительный народ!
 

Vladimir02

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