Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)

Модерирует : gyra, Maz

gyra (23-01-2020 10:51): AutoIT (Часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
Описание:

Цитата:
AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя эмуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши, управление окнами и их визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
Умеет он очень и очень многое! Бесплатный.

 
  • Справки
  • Инструменты
  • Ресурсы, посвящённые AutoIt
  • Полезные советы новичкам и не только
  • Готовые решения
  • Скрипт раскраски кода AutoIt для публикации в форумах
     


     
    За шапкой следит ViSiToR / AZJIO  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 13:07 01-06-2010 | Исправлено: Maz, 12:29 10-01-2020
    KiLL



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может кому-то будет интересен один из кирпичиков полной автоматизации развертывания системы из образа. Знаюи что тема давно раскрыта, однако методы/способы/требования у меня свои, следовательно и инструменты тоже. Решения этого вопроса не нашел, поэтому набросал сам. В процессе написания использовал DeviceAPI.au3. Проверено на двух системах.
     

    Цитата:
    #include "DeviceAPI.au3"
     
    ;Смысл программы в том, чтобы закрывая окна Мастера Нового Оборудования,
    ; она считала количество таких закрытых окон и сравнивала это кол-во
    ; с текущим количеством неизвестных устройств, а когда кол-во последних
    ; будет равно количеству закрытых окон (система установит все что может
    ; установить), мы запустим установку неизвестных устройств.
    ;
    ;Можно конечно из окна Мастера нового оборудования из WindowText брать
    ; наименование конкретного неизвестного устройства, затем находить его в
    ; текущем массиве и выбивать из "обоймы", но это уже лишнее, хотя и точнее.
     
    $wcount = 0
     
    ;Перебирая окна, закрываем паразитные и ведем статистику
    Do
        $var = WinList()
        For $i = 1 to $var[0][0]
            If $var[$i][0] <> "" AND BitAnd( WinGetState($var[$i][1]), 2 ) Then
                Select
                    Case $var[$i][0] = "Изменение параметров системы"
                        WinClose("Изменение параметров системы")
                    Case $var[$i][0] = "Мастер нового оборудования"
                        WinClose("Мастер нового оборудования")
                        $wcount+=1
                EndSelect
            EndIf
        Next
    Until $wcount=GetCurrentUnknownDevicesCount()
     
    ;Если все сходится, то завершаем работу
    MsgBox(64,"","Неизвестных устройств: " & $wcount)
     
    ;=======================================================================
    ; Функция подсчета неизвестных устройств в данный момент
    ;=======================================================================
    Func GetCurrentUnknownDevicesCount()
     
        $i=0
     
        ;Строим список классов устройств
        _DeviceAPI_GetAllDevices()
     
        ;Просматривая устройства, считаем количество устройств с пустымы класом и идентификатором
        While _DeviceAPI_EnumDevices()
            $classname = _DeviceAPI_GetClassName(_DeviceAPI_GetDeviceRegistryProperty($SPDRP_CLASSGUID))
            $classGUID = _DeviceAPI_GetDeviceRegistryProperty($SPDRP_CLASSGUID)
            If $classname="" AND $classGUID="" Then $i+=1
        WEnd
     
        ;Очищаем за собой
        _DeviceAPI_DestroyDeviceInfoList()
     
        Return $i
     
    EndFunc

    Всего записей: 255 | Зарегистр. 04-05-2003 | Отправлено: 02:30 20-06-2010 | Исправлено: KiLL, 02:37 20-06-2010
    Orion_76



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот вроде нашел что надо,
    ТОлько не пойму, что она возвращает..
     

    Код:
    Func _GetFileSecurityDACL($sFile)
       
    If Not IsDeclared("DACL_SECURITY_INFORMATION") Then
    Const $DACL_SECURITY_INFORMATION  = 0x4
       
    Local $return
       
    Local $hAdvapi32 =
    DllOpen("advapi32.dll")
       
    If Not FileExists($sFile) Then Return SetError(1,0,0)
       
    $return =
    DllCall($hAdvapi32,"long","GetFileSecurity", _
                       
    "str",$sFile, _
                       
    "dword", $DACL_SECURITY_INFORMATION, _
                       
    "ptr",0, _  
                       
    "dword",0, _
                       
    "dword*",0)
       
    If Not $return[5] Then Return SetError(1,0,0)
       
    Local $strucSD =
    DllStructCreate("byte[" & $return[5] & "]")
       
    $return =
    DllCall($hAdvapi32,"long","GetFileSecurity", _
                       
    "str",$sFile, _
                       
    "dword", $DACL_SECURITY_INFORMATION, _
                       
    "ptr",
    DllStructGetPtr($strucSD), _  
                       
    "dword",
    DllStructGetSize($strucSD), _
                       
    "dword*",0)
       
    If Not $return[0] Then Return SetError(1,0,0)
       
    DllClose($hAdvapi32)
       
    Return
    DllStructGetData($strucSD,1)
    EndFunc
     ?  Код создан и опубликован с помощью SciTE-Ru[/more][no][/no]

    Всего записей: 386 | Зарегистр. 02-11-2007 | Отправлено: 14:05 20-06-2010
    Kar1son

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Orion_76
    так то что написал AZJIO как раз подходит  

    Всего записей: 187 | Зарегистр. 23-08-2006 | Отправлено: 09:04 21-06-2010
    Orion_76



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kar1son

    Код:
     
    Func _cacls()
        $accfncombo0 = GUICtrlRead($accfncombo)
        $access00 = GUICtrlRead($access)
        Switch $access00
            Case $access00 = "запрет"
                $access0 = "N"
            Case $access00 = "чтение"
                $access0 = "R"
            Case $access00 = "запись"
                $access0 = "W"
            Case $access00 = "изменение"
                $access0 = "C"
            Case $access00 = "полный"
                $access0 = "F"
            Case Else
                $access0 = "F"
        EndSwitch
        ShellExecute(@SystemDir & '\cacls.exe', '"' & $sTarget & '" /t /e /p "' & $accfncombo0 & '":' & $access0, '', '', @SW_HIDE)
    EndFunc   ;==>_cacls
     

     

    Цитата:
    Надо просто функцию, которая возвратила бы TRUE, если опрерация с файлом доступна пользователю, от имени которого выполняется скрипт.  

     
    И где она возвращает?

    Всего записей: 386 | Зарегистр. 02-11-2007 | Отправлено: 11:33 21-06-2010
    Kar1son

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Func _cacls()  
        $accfncombo0 = GUICtrlRead($accfncombo)  
        $access00 = GUICtrlRead($access)  
        Switch $access00  
            Case $access00 = "запрет"  
                $access0 = "N"  
            Case $access00 = "чтение"  
                $access0 = "R"  
            Case $access00 = "запись"  
                $access0 = "W"  
            Case $access00 = "изменение"  
                $access0 = "C"  
            Case $access00 = "полный"  
                $access0 = "F"  
            Case Else  
                $access0 = "F"  
        EndSwitch  
        ShellExecute(@SystemDir & '\cacls.exe', '"' & $sTarget & '" /t /e /p "' & $accfncombo0 & '":' & $access0, '', '', @SW_HIDE)  
    if  $access0 = "C" then  
    return True
    else
    return False
    endif

    EndFunc   ;==>_cacls

     
    а голова на что? принцип полностью показан, тут три строки дописать

    Всего записей: 187 | Зарегистр. 23-08-2006 | Отправлено: 12:14 21-06-2010
    Orion_76



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kar1son
     

    Цитата:
    а голова на что? принцип полностью показан, тут три строки дописать

     
    Прочтите внимательней код..
     
    $access0 - читается из ГУЯ
    Эта функция для УСТАНОВКИ разрешений
    А надо для ПРОВЕРКИ
     
    т.е что-то типа:
     
    $res=ФункцияПроверкиРазрешений($ИмяФайла,$ИмяПользователя)
    If $res==1 Then
    ...
    else
    ...
    EnfIF
     
    В принципе вроде нужную функцию нашел(в посте выше-Func _GetFileSecurityDACL($sFile)
    )
    Она возвращает какой-то секъюрити дескриптор (в WinApi не силен), т.е. шестнадцатиричную строку.
    Осталось только догадаться, как из него нужную инфу выдернуть.
     
     
     

    Всего записей: 386 | Зарегистр. 02-11-2007 | Отправлено: 12:45 21-06-2010
    Kar1son

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Orion_76 ладно убедил слепой дятел это все таки я

    Всего записей: 187 | Зарегистр. 23-08-2006 | Отправлено: 13:01 21-06-2010
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Решил занятся переводом справки UDF - UDFs3.chm

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 14:20 21-06-2010 | Исправлено: AZJIO, 18:25 21-06-2010
    vicbox777



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Orion_76 11:45 21-06-2010
    Цитата:
    Она возвращает какой-то секъюрити дескриптор (в WinApi не силен), т.е. шестнадцатиричную строку.  
     Осталось только догадаться, как из него нужную инфу выдернуть.


    Код:
    Func _CheckSecurityDescriptor($Descriptor)
       
    Local $strucSD =
    DllStructCreate("byte[" & (StringLen($Descriptor)/2)-1 & "]")
       
    DllStructSetData($strucSD,1,$Descriptor)
       
    Local $hAdvapi32 =
    DllOpen("advapi32.dll")
       
    Local $return =
    DllCall($hAdvapi32,"int","IsValidSecurityDescriptor", _
                               
    "ptr",
    DllStructGetPtr($strucSD))
       
    DllClose($hAdvapi32)
       
    If $return[0] = 0 Then Return SetError(1,0,0)
       
    Return 1
    EndFunc

    Всего записей: 165 | Зарегистр. 17-06-2008 | Отправлено: 14:29 21-06-2010
    Orion_76



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vicbox777

    Цитата:
    IsValidSecurityDescriptor

    Вроде просто определяет валидность структуры дескриптора?

    Всего записей: 386 | Зарегистр. 02-11-2007 | Отправлено: 17:09 21-06-2010
    vicbox777



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Вроде просто определяет валидность структуры дескриптора?

    Извиняюсь.

    Всего записей: 165 | Зарегистр. 17-06-2008 | Отправлено: 17:51 21-06-2010
    Orion_76



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vicbox777
    Бывает-))
     
    Блин...весь инет перерыл...
    Неужели это не актуально....?
    Есть примеры на  С и на VB...
    но там кода строк на 150...
    Можно конечно вывод cacls распарсить...или WMI
    Но это ненадежно или через Ж...

    Всего записей: 386 | Зарегистр. 02-11-2007 | Отправлено: 00:56 22-06-2010
    Cegpuk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как этот же скрипт можно написать лучше (в самом прямом смысле)?

    Код:
    HotKeySet("{numpaddot}", "Terminate")
    HotKeySet("{numpad1}", "LeftToggle")
    HotKeySet("{numpad3}", "RightToggle")
     
    Global $StartLeft
    Global $StartRight
     
    While 1=1
        While $StartLeft = True
            Left()
        WEnd
        While $StartRight = True
            Right()
        WEnd
        Sleep(10)
    WEnd
     
    Func Right()
        Send("{left down}")
        Sleep(150)
        Send("{left up}")
        Send("{right down}")
        Sleep(600)
        Send("{right up}")
        Send("{up down}")
        Sleep(50)
        Send("{up up}")
        Sleep(50)
    EndFunc
     
    Func Left()
        Send("{right down}")
        Sleep(150)
        Send("{right up}")
        Send("{left down}")
        Sleep(600)
        Send("{left up}")
        Send("{up down}")
        Sleep(50)
        Send("{up up}")
        Sleep(50)
    EndFunc
     
    Func LeftToggle()
        $StartLeft = NOT $StartLeft
    EndFunc
     
    Func RightToggle()
        $StartRight = Not $StartRight
    EndFunc
     
    Func Terminate()
        Exit 0
    EndFunc

    Всего записей: 287 | Зарегистр. 24-01-2007 | Отправлено: 02:39 22-06-2010
    degid



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Kar1son
     

    Цитата:
    а голова на что? принцип полностью показан, тут три строки дописать

     
    Прочтите внимательней код..
     
    $access0 - читается из ГУЯ
    Эта функция для УСТАНОВКИ разрешений
    А надо для ПРОВЕРКИ
     

    ну, как бы через XCACLS.vbs можно и узнать разрешения...  
     
    http://support.microsoft.com/kb/318754/ - там так и написано - "Использование программы Xcacls.exe для просмотра разрешений"

    Всего записей: 31 | Зарегистр. 26-10-2006 | Отправлено: 17:58 22-06-2010 | Исправлено: degid, 18:00 22-06-2010
    ringer

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    сделал скрипт(ехе) задача которого нажимать кнопки в окне приложения, и выбирать в списке(по типу списка диспетчера задач) указанные строки, сохранять инфу из окна в файл
    что делать при запуск определяется параметрами запуска
     
    сам запуск этого скрипта(ехе) производится через веб-панель т.е. через  PHP exec
    на локальной системе, где и апач и приложение запущены от одного юзера все работает без проблем
     
    на системе где апач запущен от SYSTEM, а приложение от моего юзера, этот скрипт(ехе) запускается, но не выдает инфы  видимо из-за того что он запускается от имени SYSTEM и просто не видит окно приложения
     
    сделал еще один скрипт(ехе), который запускает первый от того же юзера, от которого запущено приложение
    судя по диспетчеру задач он действительно стал запускаться от того же юзера что и приложение, но взять инфу из окна, или нажать кнопку так и не смог
     
    п.с. сделал тоже самое, только вместо своего скрипта подставил calc.exe
    в диспетчере задач calc.exe появился от моего имени, но самого окна на рабочем столе не появилось, может в этом проблема
    хотя в моем скрипте(ехе) нет гуи

    Всего записей: 108 | Зарегистр. 12-02-2004 | Отправлено: 20:22 22-06-2010 | Исправлено: ringer, 16:33 23-06-2010
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    degid
    а почему XCACLS? Я попробовал cacls, который уже есть в системе, с ним тоже выдаёт инфу, вот тест:

    Цитата:
    cacls C:\WINDOWS
    PAUSE
    с консоли прочитать и отдетектить регулярным выражением вроде не проблема.
     
     
    ringer
    А можно пример, хотя бы того же диспетчера задач, чтоб пытался нажать на нём кнопки, я бы у себя проверил.
    А почему не видно ожидание активного окна? Ведь скрипт явно не успеет его открыть, как все клики уже отработают...

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 23:50 22-06-2010 | Исправлено: AZJIO, 23:57 22-06-2010
    ringer

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    пробовал запускать скрипт вручную - т.е. даблклик по ехе шнику
    проблем с не успеванием не было

    Всего записей: 108 | Зарегистр. 12-02-2004 | Отправлено: 00:02 23-06-2010
    Orion_76



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Оно все понятно-))
    можно и через cacls.exe, можно и через WMI(что мне кажется проще и надежнее)...
    Но...как гриться...хоть совершенству нет предела...  но хочется через WinApi..-)))
    Вообще..ИМХО...должна БЫ быть udf-функция-)) с подобным функционалом...
     
    В принципе основная задумка такая:
    Есть отличный фриварный файл-менеджер  FreeCommander
    В нем можно настроить менюшки или хоткеии на запуск прог с передачей параметров (типа- путь к текущей папке, путь к выделенному файлу и т.д.)
    т.е. нам больше ничего и не надо.. передал скрипту(Autoit) имя нужного файла-папки... и делай с ним че хочешь (если права у тебя есть-))
    Вот сдесь и начинается самое интересно...
    Скрипт делает (hardlink,жесткая ссылка и т.д.)Символьную ссылку на выделенную папку или файл в нужном каталоге. Но функция , делающая этот линк возвращает только ПОЛУЧИЛОСЬ или НЕПОЛУЧИЛОСЬ, а почему не получилось -(( Х\З...
    толи к исходному файлу-папке доступ запрещен(занят, или прав нет) ,толи в конечную папку запись запрещена (занята. прав нет)...

    Всего записей: 386 | Зарегистр. 02-11-2007 | Отправлено: 01:31 23-06-2010
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ringer
    Так поставь мессагу, типа если найдено окно то выдать "Доступно", если не найдено, то "Недоступно", и далее заняться соответствующей проблемой. Заголовок и текст в окне обязательно с использованием Au3Info.exe, иногда там могуть быть символ &-амперсанд, который скрыт на кнопке, но из-за этого она не видна.
     

    Цитата:
    If WinExists($title) Then
        MsgBox(0, '+++++', 'Доступно '&$title)
    Else
        MsgBox(0, '--------', 'Не доступно '&$title)
    EndIf

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 10:22 23-06-2010 | Исправлено: AZJIO, 10:39 23-06-2010
    ringer

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    проблема именно из-за запуска приложения и скрипта от разных юзеров
    решил разбив на два скрипта
    апач дергает скрипт1, скрипт1 сохранят параметр запуска в файл
    скрипт2 висит процессах(запущен тем же пользователем что и приложение), и ждет когда появится процесс скрипта1
    как появился он читает файл и отрабатывает в зависимости от команды указанной в файле
     
    update
    поспешил я, видимо проблема вообще в другом крылась
    пока я слежу за скриптом через удаленный рабочий стол - все работает
    но как только выключаю удаленку, сркипт перестает работать
     
    т.е. если я не залоген, винда не рисует гуи, и окна просто нет
    полагаю можно не пробовать запустить и скрипт и приложение от  system т.к. там точно никакого гуи нет

    Всего записей: 108 | Зарегистр. 12-02-2004 | Отправлено: 16:33 23-06-2010 | Исправлено: ringer, 17:52 23-06-2010
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)
    gyra (23-01-2020 10:51): AutoIT (Часть 4)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru