Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #107, НОЯБРЬ 2007 г.

Пусть он все сделает сам!

Степан «Step »Ильин

Хакер, номер #107, стр. 107-042-1

(step@gameland.ru)

Автоматизируем любые процессы на компьютере

Несмотря на то что многие вещи можно сделать проще или вообще автоматизировать, мы упорно продолжаем усложнять себе жизнь, по старинке выполняя все вручную. Только представь, сколько экономилось бы времени, если бы компьютер делал все сам и лишь иногда запрашивал у нас помощи. Как оказывается, наладить автоматику реально практически для чего угодно!

Как ни крути, но у каждого есть то, что можно автоматизировать. Но даже не смотря на то, что некоторые моментов невероятно назойливые, ты откладываешь решение проблемы в долгий ящик и со временем просто привыкаешь к ним. Вот, например, для того, чтобы забрать почту из Outlook, подключившись удаленно к Exchange-серверу, приходится каждый раз вводить свой логин и пароль во всплывающем окошке. Да еще и добавлять название домена перед именем пользователя – это до кучи. Почему нет возможности сохранить его раз и навсегда, я долгое время не задумывался и упорно продолжал вводить эти данные вручную… ровно до тех пор, пока мне это окончательно не надоело.

Долой стандартный планировщик!

Впрочем, отложим пока мои заморочки с Outlook’ом и обратимся к очевидному инструменту для автоматического выполнения каких-либо действий – планировщику задач. Конечно, при большом желании приложение, процесс или на худой конец BAT-файл с последовательностью команд можно по расписанию выполнить и через стандартную тулзу Винды. Но в том-то и проблема, что только… выполнить. Ни шага в сторону: только временные параметры, исполняемый файл и параметры для запуска — все. О каком решении задач может идти речь, если стандартный планировщик Винды даже не в состоянии выгрузить приложение по расписанию? Мало этого, для выполнения любой задачи нужно обязательно ввести имя пользователя (с правами которого она будет выполняться) и пароль, причем даже в том случае, если его нет! Поэтому хочешь ли ты того или нет, но пароль для пользователя тебе придется поставить обязательно. Ну или навсегда забыть о стандартном планировщике, установив замечательную утилиту nnCron (www.nncron.ru). Вот лишь малая часть того, что предлагает эта программа:

  • запускать произвольные программы как сервисы;
  • запускать задачи «от имени» указанных юзеров;
  • отслеживать и перезапускать просроченные задачи и напоминалки;
  • выключать или «усыплять» компьютер в заданное время, «будить» компьютер, чтобы запустить задачу;
  • отображать, скрывать, закрывать, убивать, сворачивать, разворачивать и прятать в системный трей заданные окна, добавлять в трей произвольные иконки;
  • менять размер и местоположение окон, а также варьировать их прозрачность;
  • выводить на экран и в лог-файл любые сообщения, в том числе и запросы на выполнение указанных действий;
  • работать с клипбордом, файлами и реестром;
  • эмулировать клавиатурный ввод и операции с мышкой;
  • синхронизировать системное время;
  • присваивать процессам указанный приоритет и прерывать работу любых запущенных процессов.

Время выполнения заданий задается с помощью crontab-файла, а действия описываются на специальном скриптовом языке Forth! Разберемся с ними по порядку.

Что такое crontab-файл

Cron — как известно, стандартный планировщик никсов, который считывает параметры заданий из специального файла crontab и работает как часы, за что и уважается многотысячной армией пользователей *nix-систем. Файл crontab, разумеется, имеет строго определенный формат, очень доступный и удобный, и именно его использует для своей работы наш nnCron. Традиционный (унаследованный из мира UNIX) cron-формат состоит из пяти полей, разделенных пробелами. Его и рассмотрим:

<Минуты> <Часы> <Дни_месяца> <Месяцы> <Дни_недели>

Любое из шести полей может содержать символ «*» в качестве значения. Он указывает на полный диапазон возможных значений, например каждая минута, каждый час и т.д. Любое из полей может содержать список значений, разделенных запятыми (например, 1,3,7), или интервал (поддиапазон) значений, задаваемый дефисом (например, 1-5). После звездочки (*) или интервала с помощью символа «/» указывается шаг значений. Например, 0-23/2 может использоваться в поле «Часы» для указания того, что действие должно происходить каждые два часа. Чтобы стало окончательно ясно, приведу несколько примеров с пояснениями:

* * * * * * - выполнение каждую минуту;

45 17 7 6 * * - каждый год 7 июня в 17:45;

0 9 1-7 * 1 * - первый понедельник каждого месяца в 9 утра.

Пишем свою первую задачу

Любая работа, которую будет выполнять nnCron, задается с помощью специальной синтаксической конструкции – задачи. В рамках задачи описывается как сама работа (запуск программ, операции с файлами, демонстрация сообщений на экране и т.д.), так и разнообразные условия, при соблюдении которых эта работа должна быть произведена (время, наличие/отсутствие указанных файлов, наличие/отсутствие носителя в дисководе и т.д.). В общем случае простая задача выглядит следующим образом:

#( имя_задач

Time: спецификатор времени в формате cron

Action: описание выполняемых действий

)#

Следовательно, для того чтобы, например, запускать приложение каждые 15 минут по рабочим дням с обычным приоритетом, необходимо написать такой скриптик:

#( 1st_task

Time: */15 * * * 1-5 *

ShowMinimized NormalPriority

Action:

START-APP: C:Program FilesInternet Explorernotepad.exe

#

Впрочем, прописывать что-либо руками необязательно и можно наладить запуск приложения через GUI-оболочку. Но в этом случае придется ограничиться выполнением задач по расписанию. Зато использование скриптов позволяет задействовать в качестве условия буквально любое событие. nnCron способен отслеживать файлы, флаги, окна, процессы, движения мыши, время простоя компьютера, клавиатурные шорткаты, выход в онлайн/оффлайн, появление диска в драйве, наличие хоста в сети (пинг), изменение удаленного ресурса по http-протоколу, количество свободного места на диске, загруженность оперативной памяти и многое другое… Специально, чтобы точно не потерять никакие данные, при при достижении критического уровня заряда аккумулятора у меня создается бэкап всех важных данных. Отслеживается такое событие так же, как и все остальные. Приведу пример:

#( test_battery

WatchBatteryLow

Action:

MSG: "Создаю бэкап"

действия по выполнению бэкапа

)#

Разрешение на выполнение действий можно запросить у пользователя.

#( kill_all_process

выводим запрос и прерываем по очереди

все найденные процессы «ИЭксплорера»

NoActive

Action:

FOR-PROCS: "iexplore.exe"

QUERY: "Прервать процесс %FOUND-PROC%?"

IF

KILL: "%FOUND-PID%"

THEN

;FOR-PROCS

)#

Эти примеры я привел лишь для того, чтобы ты понял, насколько удобно и быстро можно создавать практически любые сценарии и реагировать на самые незначительные события в системе. К сожалению, в рамках статьи я не смогу обозначить даже малую часть всего того, что еще возможно реализовать с помощью nnCron. Но зато программа поставляется с отличнейшей документацией с кучей примеров на русском языке. Замечу только, что в nnCron встроено несколько дополнительных инструментов, которые еще больше расширяют его возможности.

Эмулируем работу пользователя

Несмотря на то что nnCron предоставляет несравнимо большие возможности, чем просто планировщик задач, я все же использую его исключительно для автоматизации строго определенных последовательностей действий. По расписанию или же в случае наступления заданных событий. И не потому, что он справляется со всем остальным (например, эмуляцией присутствия пользователя) хуже, просто для остальных целей мне больше приглянулся другой, западный и никак не менее мощный инструмент AutoIT 3 (www.autoitscript.com/autoit3). Этот продукт специально заточен под ту работу, которую ты мог бы выполнить сам, но не хочешь, поскольку ее легко автоматизировать. Искусственное присутствие пользователя описывается с помощью простого языка сценариев, похожего на BASIC. Что с его помощью можно сделать? Да все что угодно: эмулировать ввод любых последовательностей клавиш, движений мышки, манипуляции с окнами и какими-либо еще элементами Винды. Но самое прикольное – это то, что AutoIT 3 позволяет создавать оболочки для управления хозяйством! Скажем, у тебя есть три утилиты, которые ты последовательно используешь для оцифровки DVD. Забудь про то, что их нужно запускать вручную и вводить для каждой из них параметры. Благодаря Auto IT ты за часок сможешь составить графическую оболочку для управления всеми тремя сразу!

Примеры скриптов

Как выглядят скрипты? Как и в случае с nnCron, я не буду приводить описание синтаксиса и особенности, тем более что это практически чистый Visual Basic. Вот, например, простой скрипт для того, чтобы проверить, запущено ли какое-либо приложение:

$ProcessName = "Notepad.exe"

If ProcessExists($ProcessName) Then

MsgBox(0,"Running",$ProcessName & " is running.")

Else

MsgBox(0,"Not Running",$ProcessName & " is not running.")

EndIf

В зависимости от результата проверки выполняется определенное действие. В данном случае происходит вывод информационного окна. Запиши его в файл ProcessRunning.au3 и запусти с помощью AutoIT, чтобы посмотреть на то, что получится. Вот здесь можно ознакомиться с использованием наиболее типичных конструкций скриптов: www.dailycupoftech.com/useful-autoit-scriptlets.

Подключаем готовые библиотеки

Возможность использования BASIC–скриптов дают большой простор для действий, но писать некоторые вещи с нуля очень глупо. Многое уже сделано до тебя, и прежде чем приступать к реализации своей гениальной идеи, посмотри, не входит ли она в это число. Основным источником скриптов (UDF, или User Defined Functions) является форум разработчика программы, а также специальный wiki-ресурс www.autoitscript.com/wiki/index.php?title=UDF_List.

Рассмотрим простой пример. Тебе нужно заходить на ту или иную веб-станичку, отправлять через форму какие-то данные и обрабатывать результат. Допустим, ты ищешь уязвимые форумы по ключевым словам через Google. Так вот ты сэкономишь массу времени, если возьмешь сторонние заготовки для работы с HTTP (www.dailycupoftech.com/?page_id=86).

#include <HTTP.au3>

$host = "www.google.com"

$page = "/search"

$vars = "hl=en&tab=wi&q="

$searchterm = "bbForum"

$url = $page&"?"&_HTTPEncodeString($vars&$searchstring)

$socket = _HTTPConnect($host)

$get = _HTTPGet($host,$url,$socket)

$recv = _HTTPRead($socket,1)

ConsoleWrite("Data received:"&@CRLF$recv[4]&@CRLF)

Заготовки - это замечательно, но для еще большего удобства рекомендую использовать редактор с подсветкой синтаксиса AutoIt. Наибольшей популярностью пользуется SciTe (www.autoitscript.com/autoit3/scite/), который также умеет проверять правильность кода и приводить его в порядок.

Примечательно, что любой скрипт легко скомпилировать в независимое standalone-приложение, которое можно запустить на любом компьютере (даже без установленного AutoIt). Если кликнуть по любому au3-скрипту правой кнопкой мыши, то среди прочих пунктов меню будет нужный – Compile Script. На случай, когда требуется не просто создать готовое приложение, но и задать для него некоторые параметры (например, установить для него иконку или добавить возможность обратной декомпиляции), существует специальная утилита: «Пуск -> AutoIt v3 -> Script CompilerConvert .au3 to .exe».

Пример автоматизации приложения

Перейдем к самому главному. Как эмулировать действия пользователя в конкретных приложениях? Разберем пример, предложенный разработчиками. Пусть наш скрипт будет самостоятельно открывать блокнот, вводить там некоторый текст, после чего закрывать программу без сохранения изменений. Обычным планировщикам и уж тем более стандартным средствам Винды подобное не под силу, в отличие от AutoIt.

Создаем с помощью SciTe новый и файл и называем его, скажем, notepad.au3. Первое действие - запуск программы. Для этого необходимо вызвать команду run и в качестве аргумента указать название исполняемого файла программы. Итак, первая строчка нашего скрипта:

Run("notepad.exe")

Далее, следующий пункт – скрипт должен дождаться, когда откроется и станет активным окно приложения. Для этого предусмотрена функция WinWaitActive, которой в качестве параметра необходимо передать точное название окна и обязательно с учетом регистра. В случае с блокнотом все просто - названием будет «Безымянный – Блокнот». Но для того чтобы, во-первых, не набирать название вручную и, во-вторых, не ошибиться в более сложных ситуациях, в пакет AutoIt входит чрезвычайно полезный инструмент. Утилита AutoIt Info Tool, о которой идет речь, выдаст полную информацию об открытом окне. Можешь выделить соответствующее поле, в котором обозначено название окна, и скопировать значение в реестр, чтобы позже вставить в скрипте:

WinWaitActive("Безымянный – Блокнот")

Убедившись, что окно приложения активно, можно передать ему текст (как если бы пользователь сам набирал его на клавиатуре) с помощью функции Send:

Send("Я читаю «Хакер»")

В принципе, половина скрипта уже готова, и ты можешь попробовать, что у нас получилось, сохранив скрипт и дважды кликнув по нему мышкой. Работает? Двигаемся дальше. Для того чтобы закрыть программу, обычно используется функция WinClose, которой в качестве параметра также передается имя окна:

WinClose("Безымянный – Блокнот")

В момент попытки закрытия окна блокнота возникает сообщение с предложением сохранить файл. Его также необходимо обработать, благо выполнить этого проще простого. Для этого изучим всплывающее окошко с помощью уже знакомой утилиты AutoIt Window Info и увидим, что у кнопки «Нет» есть горячая клавиша <n>. Поэтому ждем появления окна с названием «Блокнот» и кнопкой «Нет», после чего отправляем приложению комбинацию клавиш <ALT-N>. Последние две строчки скрипта будут выглядеть следующим образом, хотя можно было поступить иначе и проэмулировать клик по нужной кнопке мышью:

WinWaitActive("Notepad", "&Save")

Send("!n")

Теперь все готово! Сразу после запуска скрипта ты увидишь, как открывается окно Notepad, на экране появляется текст, а затем блокнот закрывается без сохранения изменений. Домашнее задание – сделать так, чтобы текст сохранялся в файл. Хотя, впрочем, на фиг надо! Ведь аналогичным образом можно автоматизировать практически любое приложение! Любое!

WWW

INFO

Для регистрации nnCron необходимо в командной строке ввести tm.exe xReg, а в появившемся окошке - «xUSSR регистрация» в качестве имени и текущий день недели (по-русски) вместо пароля. Скажем спасибо разработчику - нашему соотечественнику.

DVD

На диске ты найдешь полные версии AutoIt, nnCron, полезные сниппеты, скрипты и примеры использования этих замечательных программ.

Vistumbler (http://techidiots.net/autoit-scripts/vistumbler) – программа, аналогичная Netstumbler’у, разработанная для Vista, - один из многочисленных примеров того, что с помощью AutoIt можно создать практически любое приложение.

INFO

У nnCron есть вспомогательные утилиты. WinSpy позволяет узнать текущие координаты мыши, выяснить класс объекта, над которым находится мышь, получить информацию о координатах основного и дочернего окна. А Console является средством интерактивного общения с nnCron для работы со скриптовым языком и незаменимым помощником для всех, кто только начинает его изучение.

Содержание
ttfb: 7.0350170135498 ms