Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Закрытая тема
Настройки темы
[Архив - Часть 1.3] AutoIt скрипты

Старожил


Сообщения: 250
Благодарности: 16

Профиль | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 25-01-2008
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.

Помогите пожалуйста. Нужен маленький скриптик для решения некоторых рутинных задачь.
Вот что нужно сделать последовательно:

1) в папке DIR1 находим и удаляем файлы в названии которых присутствует text_1
2) в папке DIR2 находим xxx.sif и удаляем строки, в которых присутствует text_1
3) в папке DIR3 находим xxx.inf и добавляем в его секцию [XXX] несколько строчкек (text_2, text_3, ..., text_n)
4) в папке DIR4 находим yyy.inf ищем в его секции [YYY] text_4 и заменяем его на text_5
5) сохраняем все изменения и выводим отчёт о проделанной работе :-)

Заранее благодарен.

Отправлено: 05:05, 03-12-2006

 

Пользователь


Сообщения: 135
Благодарности: 32

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
При первом запуске выдаёт два совпадения и что скрипт уже запущен, хотя это не так.
У меня всё нормально, хотя если запускать его из редактора то обнаруживается лишнее "совпадение".
Цитата:
Кстати, а можно ли как то получить список скрытых процессов?
Думаю, что процесс будет скрыт только от "Диспетчера задач Windows" и подобных ему, т.е. от WMI он не скроется.

amel27
Цитата:
к сожалению он полезен только в учебных целях...
Действительно к сожалению...
Наверное что-то вроде этого я и искал, но не ожидал что это будет работать именно так...
В любом случае, Спасибо!
Цитата:
все остальные способы будут оффтопом для этой ветки.
Любой способ который можно использовать в AutoIT, или который имеет прямое отношение к скрипту AutoIT, разве это оффтоп? Хотя...

Скажем, я хочу знать какие программы запускали на моём компьютере в моё отсутствие.
Проблема в том, что более опытный юзер может легко обнаружить и завершить мой "шпионский" процесс.
У меня возникла идея не скрывать, а просто сделать невозможным его завершение, т.е. скомпилировать скрипт и назвать его к примеру lsass.exe.
Хотя и примитивно - зато надёжно.


Отправлено: 11:39, 29-04-2007 | #351



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 135
Благодарности: 32

Профиль | Отправить PM | Цитировать


Creat0R
Я понял почему обнаруживается совпадение. Если открыть скрипт в редакторе (даже незапускать) то командная строка редактора будет содержать путь к скрипту, а это уже одно "совпадение".
Попробуй закрыть редактор и запустить скрипт снова.

Отправлено: 13:40, 29-04-2007 | #352


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Diamond
Цитата:
если запускать его из редактора то обнаруживается лишнее "совпадение"
Я запускал сам скрипт, редактор вовсе не открывал (с браузера сразу скрипт пишется на рабочий стол - кстати если интересно, могу выложить тут небольшой код). Но как я упоминул, скрипт именуется как test.au3, при другом имени всё вроде ок, даже и не знаю почему так (может у меня уже запущен подобный скрипт, и он не виден в диспетчере задач ).




Есть у меня один вопрос - как можно проверить определённое окно, на наличие ControlID, но способ нужен надёжный, я написиал вот такую функцию (см. далее), но она не везде срабатывает, к примеру в браузере Opera, возвращаются не все ControlID, хотя в Au3Info.exe нужные (мне, для проверки) ControlID видны:

Код: Выделить весь код
Func _ControlIDIsExists($hWnd, $ControlID)
    If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd)
    If Not WinExists($hWnd) Then Return SetError(1, 0, 0)
    Local $ClassesArr = StringSplit(WinGetClassList($hWnd), @LF)
    If IsArray($ClassesArr) Then
        For $i = 1 To UBound($ClassesArr)-1
            If $ClassesArr[$i] = $ControlID Then Return True
        Next
    EndIf
    Return False
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 15:25, 29-04-2007 | #353


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Diamond
Цитата:
Скажем, я хочу знать какие программы запускали на моём компьютере в моё отсутствие.
Проблема в том, что более опытный юзер может легко обнаружить и завершить мой "шпионский" процесс.
У меня возникла идея не скрывать, а просто сделать невозможным его завершение, т.е. скомпилировать скрипт и назвать его к примеру lsass.exe.
угу, типичное поведение трояна... Проблема в том, что "мимикрия", хуки и прочие фокусы могут конфликтовать с настройками безопасности системы, а также перехватываться антивирусами и файерволами. На самом деле задача регистрации запускаемых файлов решается штатными средствами администрирования, без привлечения программ-шпионов и прочих ухищрений - прежде всего это средства аудита файловой системы, кроме того можно оформить подписку на любые системные WMI-события... никаких "левых" процессов при этом не создается, т.к. все выполняется средствами системы. Именно это я и имел ввиду говоря про оффтоп...

Creat0R
Цитата:
Есть у меня один вопрос - как можно проверить определённое окно, на наличие ControlID
ControlGetHandle() не устраивает? Кстати, почему именно ControlID?.. а если скажем ClassName?

Отправлено: 18:06, 29-04-2007 | #354


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27
Цитата:
ControlGetHandle() не устраивает?
Я не уверен что понял... ControlGetHandle() вернёт hWnd, а мне нужно проверить наличие Control.

Цитата:
почему именно ControlID?.. а если скажем ClassName?
Мне не важно, мне нужно проверить существование Control...
Дело в том, что в разных версиях определённой программы (в этом случае браузер Opera), меняются постоянно(?) ClassNameNN/ControlID, вот мне нужно как то проверить, существует ли в текущей версии определённый Control, если нет, то я буду перебирать их последовательность (обычно меняется только цифра).
К примеру вот такой класс - "OperaWindowClass14" - нужно проверить, есть ли он в программе (в окне), не смистился ли.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 22:18, 29-04-2007 | #355


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
Я не уверен что понял... ControlGetHandle() вернёт hWnd, а мне нужно проверить наличие Control.
…ну, в смысле если контрола нет, то и не вернет hwid... Зачем тянуть весь список, если нужно проверить только один?

Цитата:
Мне не важно, мне нужно проверить существование Control...
есть такой фокус, когда для поиска контролов используется функция поиска окон... так как контрол по сути то же окно, только дочернее. К сожалению штатный "AutoIt Window Info" не показывает информацию о "хозяине" для дочерних окон, я использовал HwndSpy... жаль он шароварный.
Код: Выделить весь код
; Поиск Control по его классу (аналогично можно сделать и по заголовку)
; штатными средствами и через API, на примере CsiTE4

$WinClass = "SciTEWindow"          ; Класс головного окна
$CtrlClass1 = "SciTEWindowContent" ; Класс дочернего окна 1-го уровня
$CtrlClass2 = "Scintilla"          ; Класс дочернего окна 2-го уровня

; Поиск средствами API
$hAPI0 = DLLCall ("user32.dll", "hwnd", "FindWindow", _
    "str", $WinClass, _
    "int", 0 )
$hAPI1 = DllCall ("user32.dll", "hwnd", "FindWindowEx", _
    "hwnd", $hAPI0 [0], _
    "int", 0 , _
    "str", $CtrlClass1, _
    "int", 0 )
$hAPI2 = DllCall ("user32.dll", "hwnd", "FindWindowEx", _
    "hwnd", $hAPI1 [0], _
    "int", 0 , _
    "str", $CtrlClass2, _
    "int", 0 )

; Поиск штатными средствами AutoIT через поиск контрола
$BakWTM = Opt ("WinTitleMatchMode", 4) ; Включаем поиск по классам
$hCtrl = ControlGetHandle("classname=" & $WinClass, '', 350)

; Поиск штатными средствами AutoIT через поиск окна
$BakWSC = Opt ("WinSearchChildren", 1) ; Включаем поиск по вложенным окнам
$hWind = WinGetHandle ("classname=" & $CtrlClass2)

; Вывод результата:
MsgBox (0, 'Test',  'WinAPI:' & @TAB & 'ClassName' & @TAB & $hAPI2 [0] & @CRLF & _
                    'AutoIT:' & @TAB & 'ControlID ' & @TAB & $hCtrl & @CRLF & _
                    'AutoIT:' & @TAB & 'ClassName'  & @TAB & $hWind & @CRLF )
; Возвращаем настройки
Opt ("WinTitleMatchMode", $BakWTM)
Opt ("WinSearchChildren", $BakWSC)
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:52, 30-04-2007 | #356


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27
Цитата:
…ну, в смысле если контрола нет, то и не вернет hwid... Зачем тянуть весь список, если нужно проверить только один?
Хм, а я как то не подумал в эту сторону (видимо нужно раньше ложиться спать ), спасибо!

Цитата:
есть такой фокус, когда для поиска контролов используется функция поиска окон... так как контрол по сути то же окно, только дочернее.
Вот за эту инфу тоже спасибо, не знал что контроли могут распознваться используя функции поиска окон, и также не знал (из самой функции) что можно подбирать ControlID через classname=....

Цитата:
я использовал HwndSpy... жаль он шароварный.
Есть WinSpy... бесплатный вроде, но не уверен что он отдаёт нужную инфу.

Спасибо ещё раз большое за пример/инфу, буду пробовать это использовать .

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 06:28, 30-04-2007 | #357


Пользователь


Сообщения: 135
Благодарности: 32

Профиль | Отправить PM | Цитировать


Creat0R
Процесс в котором обнаруживается совпадение, скорее всего виден в Диспетчере задач.
Попробуй индифицировать его по параметрам командной строки:
Код: Выделить весь код
$CommandString='Test.au3'

;~ Соединяемся с WMI
$objService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
;~ Задаём параметры объекта
$colProc = $objService.ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE '%" & $CommandString & "%'")
;~ Цикл по элементам объекта-коллекции
For $Proc In $colProc
Msgbox(0+48,"Обнаружен процесс: " & $Proc.name,"Командная строка запуска:" & @CR & $Proc.CommandLine)
Next

Последний раз редактировалось Diamond, 30-04-2007 в 08:12.


Отправлено: 07:48, 30-04-2007 | #358


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R

Краткий (промежуточный) отчет о самопальных _FileSelectFolder и подобных функций… На время их активности действительно прерывается любая работа AutoIT-скрипта, причем отключаются все механизмы диспетчеризации вызовов, включая AdLib и GUIRegisterMsg. Впрочем, это вполне логично, так как управление полностью передается системной функции. Отсюда становится понятно, почему разработчики не внесли функциональность HWID в свои функции выбора… просто они не стали заморачиваться разработкой своих функций, а взяли те же системные API-функции (aka wrapper).

Особенность _FileSelectFolder (и аналогичных) в том, что ее поведение управляется набором специальных сообщений SendMessage, которые:
- функция может инициализировать себе сама через вызов специальной (CallBack) функции,
- окно выбора может получить извне.

Первый случай не реализуем средствами AutoIT по причине отсутствия поддержки указателей на функцию. Это ограничение можно обойти подключением внешних DLL, содержащих требуемые функции и способных возвращать их указатели. Одна из таких реализаций предложена на форуме оффсайта, к сожалению, она не подходит для нашего случая по указанным ранее причинам, так как опирается на механизм GUIRegisterMsg… Поэтому потребуется писать свою специфическую DLL, либо расширить функциональность предложенной – в любом случае это придется делать на чем-то другом, отличном от AutoIT - способном компилировать DLL, дружить с GUI и обязательно фриварном.

Второй случай в принципе можно реализовать на AutoIT, но потребуется дополнительный скрипт, управляющий поведением основного на время выполнения системных функций выбора… при этом придется решить ряд вопросов по синхронизации этих процессов. Кроме того, этот вариант очень ограничен по функциональности, так как управляющий скрипт не будет получать информации о состоянии окна главного скрипта (оперативные сообщения). Например, можно попытаться задать начальную папку или текст статусной строки, но управлять кнопкой «Ok» или реагировать на ошибки ввода не получится.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:44, 30-04-2007 | #359


Новый участник


Сообщения: 38
Благодарности: 2

Профиль | Отправить PM | Цитировать


Creat0R
Взял на себя смелость собрать дистрибутив этой проги (выглядит он точно так же), чтобы ты его у себя на сайте обновил. В коде ничего не мнеял. Только опечатки убрал:
Код: Выделить весь код
#cs
;~ Toogle Hidden folders and files program - This is AutoIt source code (AutoIt vesrion 3.2.2.0).
;~ Author: G.Sandler a.k.a CreatoR - http://creator-lab.ucoz.ru
;~ ICQ: 5607655
#ce

#NoTrayIcon

$RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
If RegRead($RegKey, "Hidden") = 1 Then
	RegWrite($RegKey, "Hidden", "REG_DWORD", 2)
Else
	RegWrite($RegKey, "Hidden", "REG_DWORD", 1)
EndIf

UpdateExplorer()

Func _UpdateExplorer()
    ;Устанавливаем параметр, отвечающий за метод распознавания заголовок окон (4 - самый чувствительный),
    ;и помещаем в переменную $OldOpt исходное значение этого параметра.
    Local $OldOpt = Opt("WinTitleMatchMode", 4)
     ;Получаем массив, содержащий заголовки окон проводника Windows (включая Рабочего стола), по средствам функции _ExplWinGetList.
    Local $WinExpListArr = _ExplWinGetList()
    ;Если возвратился массив (а значит найдены заголовки окон),
     ;то перебираем весь массив, с целью обновления каждого окна (по его hWnd из элементов массива).
    If IsArray($WinExpListArr) Then
        For $iWin = 1 To $WinExpListArr[0]
            ;Вызов функции для обновления текущего окна
            ;(по уникальному идентификатору, который содержится в текущем элементе массива).
            DllCall("user32.dll", "long", "SendMessage", "hwnd", $WinExpListArr[$iWin], "int", 0x111, "int", 28931, "int", 0)
        Next
    Else
        ;Если не вернулся массив (значит не были найдены окна проводника), тогда обновляем только Рабочий стол
        ;(переменная $WinExpListArr теперь содержит только один уникальный идентификатор Рабочего стола).
        DllCall("user32.dll", "long", "SendMessage", "hwnd", $WinExpListArr, "int", 0x111, "int", 28931, "int", 0)
    EndIf
    ;Устанавливаем исходное значение (заданное значение при входе в функцию) параметра,
    ;отвечающего за метод распознавания заголовок окон.
    Opt("WinTitleMatchMode", $OldOpt)
EndFunc

Func _ExplWinGetList()
    ;Получаем массив, содержащий список существующих заголовок окон проводника Windows (Explorer),
    ;и их уникальный идентификатор (hWnd).
    Local $WinList = WinList("classname=CabinetWClass")
    ;Если вернулся массив (а значит найдено одно или более окон), тогда делаем перебор по массиву,
    ;в целях отсеивания только уникальных идентификаторов существующих окон (проводника Windows).
    If IsArray($WinList) Then
        ;Объявляем массив, который будет содержать список уникальных идентификаторов существующих окон.
        Local $WinListArr[UBound($WinList)+1]
        ;Перебираем полученный массив $WinList, и отсеиваем в новый массив $WinListArr
        ;только уникальные идентификаторы окон Explorer.
        For $iW = 1 To $WinList[0][0]
            $WinListArr[$iW] = $WinList[$iW][1]
        Next
        ;Присваиваем нулевому элементу нового массива ($WinListArr), значение ровняющееся общему количеству элементов в этом массиве.
        $WinListArr[0] = UBound($WinListArr)-1
        ;Присваиваем последнему элементу этого же массива, уникальный идентификатор (основываясь на "Classname") Рабочего стола.
        $WinListArr[$WinListArr[0]] = WinGetHandle("classname=Progman")
        ;Возвращаем массив, содержащий список идентификаторов всех существующих окон проводника (включая Рабочего стола) и
        ;общее кол-во элементов в этом массиве
        Return $WinListArr
    Else
        ;Если функция WinList() не "вернула" массив (а значит не было найдено окон проводника),
        ;тогда возвращаем только один уникальный идентификатор Рабочего стола.
        Return WinGetHandle("classname=Progman")
    EndIf
EndFunc
Вот ссылка: http://ifolder.ru/1856047

P.S. Единственное, что я не смог изменить, это информацию о файле (вкладка "Версия"). Одна программа при изменении коверкает, другая не хочет сохранять.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:59, 30-04-2007 | #360



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход