aiki
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Вот например про Autoit там может быть ========= С помощью связки Autoit + ThinApp можно решать массу интересных задач, которые иногда могут быть трудновыполнимы с помощью стандартного VB скриптинга. Самыми полезными задачами могут быть отслеживание виртуальных процессов, выгрузка их из памяти при выходе, вычисление зависших процессов (через сравнение списка окон и списка процессов), организация меню в трее, добавление пунктов в меню "Отправить" правой кнопки, перенос значимых каталогов (типа почты аутлука-тандерберда) из песочницы в папку с запускаемым файлом, защита от многократного запуска, Обычно такая связка активируется путем простой подмены запускного файла. Пример 1: Предположим что в нашем Package.ini имеются строчки Код: Source=%drive_C%\ProgFolder\File.exe Icon=%drive_C%\ProgFolder\File.exe | При этом в виртуальной файловой системе File.exe находится в папке C:\ProgFolder\File.exe Теперь мы можем написать простой скрипт на Autoit Код: #NoTrayIcon $confr = MsgBox(1,"Предупреждение", "Вы действительно хотите"&@CRLF&"запустить Название программы?") If $confr == 1 Then If Not ProcessExists("File.exe") Then Run ("C:\ProgFolder\File.exe") Else ToolTip("судя по всему File.exe уже запущен", 300, 300 ,"Извините, но",1,2) Sleep(2000) EndIf EndIf | скомпилировать его под именем Loader.exe, положить рядом с File.exe и изменить Package.ini Код: Source=%drive_C%\ProgFolder\Loader.exe Icon=%drive_C%\ProgFolder\File.exe | Теперь при запуске портативной программы, скрипт сначала спросит у пользователя действительно ли он хочет запустить эту программу, а потом проверит ее наличие в виртуальной памяти. Если процесс не обнаружится, то программа запустится, а если она уже запущена, то в точке с координатами 300 на 300 точек считая от верхнего левого угла экрана выведется сообщение об ошибке. Пример 2: Пишем свой аналог Process Killer Предположим теперь что во время своей работы программа File.exe может инициировать запуск других процессов. С помощью нашего Loader.exe можно это все отследить и придушить при выходе. Примерно вот так Код: $confr = MsgBox(1,"Предупреждение", "Вы действительно хотите"&@CRLF&"запустить File.exe?") If $confr == 1 Then If Not ProcessExists("File.exe") Then Run ("C:\ProgFolder\File.exe") Else ToolTip("судя по всему File.exe уже запущен", 300, 300 ,"Извините, но",1,2) Sleep(2000) EndIf EndIf ; 2 раза в секунду проверяем наличие в виртуальной памяти процесса File.exe While 1 If Not ProcessExists("File.exe") Then ExitLoop EndIf Sleep(500) EndIf ; Процесс пропал - выгружаем всю ветку $u = 0 While 1 $u += 1 $varu = RegEnumVal("HKEY_LOCAL_MACHINE\Software\Thinstall\ProcessList", $u) $keyu = StringRegExp(RegRead("HKEY_LOCAL_MACHINE\Software\Thinstall\ProcessList", $varu), ".+\\([^\\]+.exe)",1) If IsArray($keyu) > 0 Then If ProcessExists($keyu[0]) Then If $keyu[0] <> "Loader.exe" Then ;Не будем пытаться выгрузить сами себя :) ToolTip("Выгружается "&$keyu[0], 300, 300,"Подождите..",1,2) KillPr($varu) EndIf EndIf Else ExitLoop EndIf WEnd ToolTip("") ;Функция для настойчивой выгрузки процессов из памяти Func KillPr($PrNm) $i = 0 $j = 0 While $i < 17 $i = $i + 1 $j = $j + 1 If ProcessExists($PrNm) Then If $j > 0 Then ProcessClose($PrNm) Sleep(100) $j = -4 EndIf Else ExitLoop EndIf Sleep(100) WEnd EndFunc | Пример 3: Чтобы окончательно взорвать мозг - отследим зависнутость процессов в портативном офисе :) Для этой цели запустим с основным офисом еще и проверялку: Для этого в коде Loader.exe после запуска например Run ("C:\ProgFolder\Winword.exe") добавим If Not ProcessExists("_checker_.exe") Then Run ("_checker_.exe") EndIf и код _checker_.au3: Код: ;#NoTrayIcon ;координаты для тултипов $x = 300 $y = 200 ;позреваем что подозрительные процессы в системе не запущены $ctf = 1 $rdll = 1 $setp = 1 ;перечисляем компоненты Офиса $aName = StringSplit ("OIS.EXE,ONENOTE.EXE,INFOPATH.EXE,WINPROJ.EXE,MSACCESS.EXE,MSPUB.EXE,VISIO.EXE,OUTLOOK.EXE,POWERPNT.EXE,EXCEL.EXE,WINWORD.EXE", ",") $aMessage = StringSplit ("диспетчер рисунков,OneNote,InfoPath,Project,Access,Publisher,Visio,Outlook,PowerPoint,Excel,Word", ",") ; забиваем единички в список подозрительности $aWins = StringSplit("1,1,1,1,1,1,1,1,1,1,1", ",") ;засекаем состояние процессов, которорые может запустить офис If ProcessExists("ctfmon.exe") Then $ctf = 0 EndIf If ProcessExists("rundll32.exe") Then $rdll = 0 EndIf If ProcessExists("setup.exe") Then $set_up = 0 EndIf $h = 0 ; задаем условие выхода While 1 $h += 1 ; выйдем после 8-го пустого цикла $wins = WinList() ; создаем список окон For $b = 1 to 11 Step 1 ; пробегаемся по процессам офиса If ProcessExists($aName[$b]) Then ; процесс найден в памяти $h = 0 ; процесс найден - цикл не пустой и выходить рано $proc = ProcessExists($aName[$b]) ; получаем Pid процесса $aWins[$b] += 1 ; увеличиваем счетчик подозрительности для этого процесса For $i = 1 to $wins[0][0] ; пробегаем по списку If $wins[$i][0] <> "" AND _IsWinVisible($wins[$i][1]) Then ; окошко существует и видимо If WinGetProcess($wins[$i][0]) = $proc Then ; Pid окошка совпадает c Pid процесса $aWins[$b] = 1 ; окошко найдено - сбрасываем счетчик подозрительности EndIf EndIf Next EndIf Next For $b = 1 to 11 Step 1 ; пробегаемся по списку подозрительности If $aWins[$b] > 20 Then ; Процесс уже 20 секунд находится в памяти, а его окошка нет ;Спрашиваем совета у хозяина $confr = MsgBox(1,"Внимание", "Судя по всему "& $aMessage[$b] & " завис в памяти" &@CRLF&"Хотите завершить этот процесс?") If $confr == 1 Then ; Добро на уничтожение получено KillPr($aName[$b]) $aWins[$b] = 1 ; сбрасываем счетчик подозрительности EndIf EndIf Next Sleep(500) ; поспим полсекунды чтобы не грузить систему If $h > 8 Then ; уже 4 секунды в памяти нет ни одного офисного процесса - выходим ExitLoop EndIf WEnd Ending() ; подчищаем хвосты Func Ending() $u = 0 While 1 $u += 1 $varu = RegEnumVal("HKEY_LOCAL_MACHINE\Software\Thinstall\ProcessList", $u) $keyu = StringRegExp(RegRead("HKEY_LOCAL_MACHINE\Software\Thinstall\ProcessList", $varu), ".+\\([^\\]+.exe)",1) If IsArray($keyu) > 0 Then If ProcessExists($keyu[0]) Then If $keyu[0] <> @ScriptName Then ToolTip("Выгружается "&$keyu[0], $x, $y,"Подождите..",1,2) KillPr($varu) EndIf EndIf Else ExitLoop EndIf WEnd If ProcessExists("ctfmon.exe") Then If $ctf > 0 Then ToolTip("Выгружается подддержка альтеранативного ввода", $x, $y,"Подождите..",1,2) KillPr("ctfmon.exe") EndIf EndIf If ProcessExists("rundll32.exe") Then If $rdll > 0 Then ToolTip("Выгружается подддержка системных вызовов", $x, $y,"Подождите..",1,2) KillPr("rundll32.exe") EndIf EndIf If ProcessExists("setup.exe") Then If $set_up > 0 Then ToolTip("Отключается Setup Controller", $x, $y,"Подождите..",1,2) KillPr("Setup.exe") EndIf EndIf If ProcessExists("msiexec.exe") Then If $set_up > 0 Then ToolTip("Завершаются установочные процессы", $x, $y,"Подождите..",1,2) KillPr("msiexec.exe") EndIf EndIf EndFunc Func KillPr($PrNm) $i = 0 $j = 0 While $i < 17 $i = $i + 1 $j = $j + 1 If ProcessExists($PrNm) Then If $j > 0 Then ProcessClose($PrNm) Sleep(100) $j = -4 EndIf Else ExitLoop EndIf Sleep(100) WEnd EndFunc Func _IsWinVisible($handle) ;Is Window Visible If BitAnd( WinGetState($handle), 2 ) Then Return 1 Else Return 0 EndIf EndFunc |
| Всего записей: 678 | Зарегистр. 25-12-2002 | Отправлено: 12:07 02-08-2011 | Исправлено: aiki, 18:33 02-08-2011 |
|