АЛЕКСЕЙ БАРАБАНОВ
Автоматизация MS Windows, или AutoIt как мечта эникейщика
Часть 2
С базовым функционалом AutoIt вы уже познакомились в первой части статьи (см. №4 за 2005 г.) и представляете, как использовать его для автоматизации простейших операций в MS Windows. Расcмотрим применение AutoIt при решении практических задач администрирования.
Локализации
Отправляйте срочную почту ЗАГЛАВHЫМИ БУКВАМИ.
Hаш почтовый сервер ее распознает и отправит быстрее всего!
Отдельно рассмотрим вопрос о приложениях с кириллическими текстами внутри окон. Проиллюстрируем решение этой проблемы на примере установки русифицированной программы. Выберем почтовый клиент Mozilla Thunderbird. Как и в первом случае (см. начало статьи [1]), процедура разработки заключается в том, что запускается специальный перехватчик данных. В версии 3 он называется «AutoIt v3 Active Window Info». За основу разработки берем любой из аналогичных текстов, рассмотренных в [1], из которого в процессе редактирования выкидываем всё лишнее (не забывайте, добродетель сисадмина – лень). Затем устанавливаем наше приложение. Дождавшись первого вопроса к оператору, анализируем, как можно «поймать» это окно в AutoIt. В отношении кириллических текстов есть такая подсказка, что надо пользоваться процедурой «cut-and-paste» для получения правильной кодировки. Но, к сожалению, это не срабатывает. Как видно на рис. 1, попытка перенести текст из «перехватчика» окон в редактор с программой приводит к появлению нечитаемого набора символов. Предположение, что так и должно быть, не выдерживает элементарной проверки.
Рисунок 1
Может быть, стоит сменить редактор? Ведь секрет в том, что надо записать в текст скрипта требуемую фразу в оригинальной кодировке. То есть редактор должен позволять точно указывать кодировку документа при сохранении. Из находящихся под рукой подходит MS Word. При этом, как и ожидалось, «cut-and-paste» тоже не приводит к появлению текста в правильной кодировке. Но текст, введенный «вручную», можно сохранить в нужной кодировке. В данном случае предполагаем, что заголовок окна установщика Mozilla Thunderbird написан в cp1251, и поэтому сохраняем текст в кириллице (Windows). Все описанное продемонстрировано на рис. 2.
Рисунок 2
В конце первого этапа разработки получаем следующий текст:
AutoItSetOption ( "WinTitleMatchMode", 2 )
AutoItSetOption ( "WinDetectHiddenText", 1 )
WinMinimizeAll ( )
Sleep ( 1000 )
Run ( 'Thunderbird_Setup_1.0.exe' )
WinWait ( 'Mozilla Thunderbird Установка' )
Send ( '{ENTER}' )
MsgBox ( 0, 'AutoIt', 'Done' )
Exit
После запуска эта программа приводит нас к следующему этапу разработки, смотрите рис. 3. Далее все делается аналогично тому, как создавалась программа для установки AutoIt v3.
Рисунок 3
Вот что должно получиться в конце концов:
AutoItSetOption ( "WinTitleMatchMode", 2 )
AutoItSetOption ( "WinDetectHiddenText", 1 )
; open free desktop
WinMinimizeAll ( )
Sleep ( 1000 )
Run ( 'Thunderbird_Setup_1.0.exe' )
;Run ( $CmdLine[1] )
WinWait ( 'Mozilla Thunderbird Установка' )
Send ( '{ENTER}' )
WinWait ( 'Установка Thunderbird - Лицензионное соглашение' )
Send ( '{TAB}{SPACE}{ENTER}' )
WinWait ( 'Установка Thunderbird - Тип установки' )
Send ( '{ENTER}' )
WinWait ( 'Выбор компонентов' )
Send ( '{ENTER}' )
; 'Установка Mozilla Thunderbird- Начало установки'
WinWait ( 'Установка Mozilla Thunderbird- Завершение' )
Send ( '{SPACE}{ENTER}' )
;MsgBox ( 0, 'AutoIt', 'Done' )
Exit
Обратите внимание, в итоговом тексте заменяем прямой вызов установщика Mozilla Thunderbird из текста программы на запуск программы, имя и путь до которой переданы, как параметр в командной строке. Так как последнее упростит использование полученного автоматического установщика в рабочих процедурах, где его можно вызывать из командной строки. И блокируем завершающее окно. Еще одно замечание касательно пропущенного окна «Установка Mozilla Thunderbird -> Начало установки». Окно сопровождает процесс непосредственного разворачивания приложения. И можно, конечно, в программе дождаться его завершения, но разумнее просто «поймать» появление следующего окна. Что и было сделано.
Если кодировка кириллицы на экране совпадает с основной кодировкой по умолчанию в MS Windows, то есть cp1251, то можно снова вернуться к использованию Notepad как редактора программ на AutoIt. Кстати сказать, использование точно такого же приема для детектирования окон с текстами в кодировке koi8-r, например, от браузера Интернета, не приводит к успеху. То есть такие окна надо определять по косвенным признакам.
AutoIt – это бот сисадмина
Если сисадмин ест на своем рабочем месте, выложите ему все свои проблемы и ждите немедленного ответа.
Мы существуем, чтобы служить другим, и всегда готовы подумать о починке компьютеров.
Сфера применимости AutoIt не ограничена только автоматизацией установки прикладных программ. Очень эффективно с помощью него программировать наборы стандартных действий в графической среде MS Windows. Многие такие действия инициируются с использованием внутренней команды MS Windows – rundll32. В Сети есть ряд ресурсов, посвященных разгадыванию и коллекционированию информации об этой слабо документированной команде. Начиная с официального описания http://support.microsoft.com/default.aspx?scid=KB;EN-US;q164787& и продолжая существенно более информативным http://www.dx21.com/SCRIPTING. Для примера решим задачу автоматической настройки подключения к VPN. Эта задача интересна тем, что ее приходится выполнять не на внутренней рабочей станции, которая так или иначе доступна для сисадмина, а на приватном компьютере пользователя, который желает получить доступ к офисным ресурсам.
В ручном режиме эти настройки осуществляются с помощью «Мастера сетевых подключений». Последовательность разработки программы, автоматизирующей эту операцию, начинается с поиска на указанных ресурсах способа запустить нужный мастер. Потом, как и ранее, с помощью «перехватчика» окон определяется достаточная для детектирования строка и создается управляющий диалог. Здесь продемонстрируем, как можно воспользоваться параметром, задающим таймаут в секундах. Если WinWaitActive успевает обнаружить нужное окно до истечения таймаута, то возвращает «1», в противном случае – «0». Это позволит в случае ошибочной ситуации просто завершить скрипт. На рис. 4 изображена начальная стадия разработки.
Рисунок 4
Вот таким образом, шаг за шагом, напишем маленькую программку, которая создаст нужное соединение и поместит его иконку на рабочий стол. Далее приведен ее текст, где «Office VPN» – это название соединения, а «office.enter-prise.domain» – доменное имя сервера PPtP, доступное из Интернета. Если сервер VPN не зарегистрирован в DNS, то нужно указать его IP-адрес.
AutoItSetOption ( "WinTitleMatchMode", 2 )
AutoItSetOption ( "WinDetectHiddenText", 1 )
AutoItSetOption ( "SendAttachMode", 1 )
; open free desktop
WinMinimizeAll ( )
Sleep ( '1000' )
; network connection wizard
Run ( @ComSpec & " /c rundll32.exe netshell.dll,StartNCW" )
; 1
If WinWaitActive ( 'Мастер новых подключений','','10' ) == 0 Then
Exit
EndIf
Send ( '{ENTER}' )
; 2
WinWaitActive ( 'Мастер новых подключений', 'Подключить к Интернету','5' )
Send ( '{DOWN}{ENTER}' )
; 3
WinWaitActive ( 'Мастер новых подключений', 'Создать подключение:','5' )
Send ( '{DOWN}{ENTER}' )
; 4
WinWaitActive ( 'Мастер новых подключений', 'Введите в следующем поле имя для этого подключения','5' )
$pptpname = 'Office VPN'
Send ( $pptpname & '{ENTER}' )
; 5
WinWaitActive ( 'Мастер новых подключений', 'Введите имя узла или','5' )
$pptphost = 'office.enterprise.domain'
Send ( $pptphost & '{ENTER}' )
; 6
If WinWaitActive ( 'Мастер новых подключений', 'Успешно завершено создание следующего подключения:', '5' ) == 1 Then
Send ( '{SPACE}{ENTER}' )
EndIf
Exit
Программка записывается в файл setup_pptp.au3 и затем из нее создается исполняемый файл setup_pptp.exe. Теперь надо позаботиться о передаче этой программы конечному пользователю. Далее будем исходить из условия, что сервер VPN и почтовый сервер созданы на платформе GNU/Linux, а не MS Windows. Это очевидно, учитывая необходимость его работы на открытом для доступа из Интернета сетевом соединении. Предположим, все административные скрипты и данные записываются в /root/bin. Сперва полученная программа упаковывается в архив и копируется в ту же папку:
# zip -9 setup_pptp.exe.zip setup_pptp.exe
adding: setup_pptp.exe (deflated 4%) |
# cp setup_pptp.exe.zip ~/bin
Затем создается простенький скрипт. При настройке логина VPN он будет отсылать осчастливленному пользователю локальное электронное сообщение об этом вместе с присоединенным архивом программы автонастройки. Такой способ передачи позволяет доставить аутентификационные данные безопасным образом. Заодно и архив с программой помещается в почтовый ящик пользователя в обход антивирусных средств, фильтрующих smtp-почту. Поль-зователь должен сохранить письмо и архив на дискете или USB Flash-диске и принести его таким образом на компьютер, где нужно настроить подключение к офисному VPN. Далее останется лишь запустить разархивированную программу, которая настроит соединение, и при подключении указать логин и пароль из текста письма. После выполнения всех манипуляций дискету или USB Flash диск придется уничтожить... Шутка, конечно, но позаботиться об уничтожении информации надо обязательно!
Поскольку сервер VPN сделан на GNU/Linux, то скрипт, который настраивает пользовательский логин на сервере, можно написать на языке интерпретатора bash. Например, так:
#!/bin/sh
FCHAP=/etc/ppp/chap-secrets
UNAME=$1
UIP=$2
( [ "$UNAME" != "" ] && [ "$UIP" != "" ] ) || {
echo "Use as : $SELF <user-name> <ip>"; exit -1 ; }
D=`cat $FCHAP | grep -e "^$UNAME[[:space:]]"`
[ "$D" == "" ] || {
echo "User \"$UNAME\" already in database"; exit -1 ; }
T=`getent passwd | grep ^$UNAME:`
[ "$T" != "" ] || {
echo "Chosed <user-name>=$UNAME not found in passwd"; exit -1 ; }
PSW=`pwgen -c -n 9 1`
H="officepptp"
echo -e "$UNAME\t\"$H\"\t$PSW\t\"$UIP\"" >> $FCHAP
SRV=office.enterprice.domain
cat <<EOT | \
biabam /root/bin/setup_pptp.exe.zip \
-s "Extern login for pptp vpn access." $UNAME@localhost
Dear user.
IT staff has prepared extern login to enterprise network using
PPtP VPN for you personally. Tweak PPtP client on workstation
to connect on extern IP-address or FQDN $SRV.
You must login as "$UNAME" with passphrase "$PSW".
Dont forget or loss passphrase ! If this case you must inform
IT staff urgently ! After correction we will send new passphrase
to you by local e-mail.
IT staff.
EOT
exit
Перед вами очень простой скрипт. Он запускается с двумя параметрами – пользовательский логин и адрес, который выделяется для удаленного компьютера при создании криптованного туннеля. Если этот скрипт запускается на компьютере, где создаются VPN-бюджеты для нелокальных пользователей, то проверку «getent passwd» надо исключить. Применение описанной технологии позволяет избежать проблем в тех случаях, когда в ответ на радостное сообщение сисадмина о выделении пользователю логина VPN следует вопрос, «как это настроить», а визит к пользователю домой не входит в планы сисадмина.
Автоматизируем службу поддержки
Если вы столкнулись с сисадмином в выходной день в гастрономе, задайте ему компьютерный вопрос.
Мы работаем 24 часа в сутки 7 дней в неделю, даже в гастрономе в выходной день.
Вплотную к вопросам настройки удаленных подключений примыкают вопросы, точнее, подозрения пользователей о исправности их рабочих станций. Зачастую, когда эти вопросы на самом деле вызваны какими-то проблемами и у сисадмина совершенно нет возможности провести диагностику удаленно, приходится долго втолковывать пользователям по телефону, что и как надо открыть, запустить и посмотреть. Но ведь можно заранее подготовить программу, которая проделает все манипуляции, проверит ответы и напишет резюме. Что нам потребуется, если придется провести удаленную диагностику? Правильно – исправность сети! Именно это и надо проверить автономно и без участия сисадмина. Далее приведен вариант такой программы:
AutoItSetOption ( "WinTitleMatchMode", 2 )
AutoItSetOption ( "WinDetectHiddenText", 1 )
AutoItSetOption ( "SendAttachMode", 1 )
; open free desktop
WinMinimizeAll ( )
Sleep ( '1000' )
; обновим dhcp-адреса
RunWait ( @ComSpec & " /c ipconfig /renew" )
If StringLeft( @IPAddress1, 3 ) == '127' Then
MsgBox ( 0, 'Network Status',--перенос строки--
'Неисправен сетевой адаптер или кабель не подключен', 100 )
Else
If StringLeft( @IPAddress1, 3 ) == '169' Then
MsgBox ( 0, 'Network Status',--перенос строки--
'Недоступен сервер или не подключен сетевой кабель', 100 )
Else
If StringLeft( @IPAddress1, 10 ) == '192.168.0.' Then
;------ address OK
$i = URLDownloadToFile ( 'http://www.localservernet/'--перенос строки-
, @MyDocumentsDir & '\tmp.html' )
FileDelete ( @MyDocumentsDir & '\tmp.html' )
If $i == 1 Then
$j = URLDownloadToFile ( 'http://www.google.com/' ,--перенос строки-
@MyDocumentsDir & '\tmp.html' )
FileDelete ( @MyDocumentsDir & '\tmp.html' )
If $i == 1 Then
MsgBox ( 0, 'Network Status', 'Сервер исправен.--перенос строки--
Доступ в Интернет разрешен', 100 )
Else
MsgBox ( 0, 'Network Status', 'Сервер исправен.--перенос строки--
Интернет недоступен', 100 )
EndIf
Else
MsgBox ( 0, 'Network Status', 'Сервер не отвечает', 100 )
EndIf
;------
Else
MsgBox ( 0, 'Network Status',--перенос строки--
'Неизвестный адресный диапазон', 100 )
EndIf
EndIf
EndIf
Exit
Программа заставляет компьютер заново запросить динамический адрес и по установившемуся значению диагностирует состояние сети. Здесь предполагается, что правильный адрес выдается DHCP из диапазона 192.168.0.0/24. Далее, если локальная сеть работает, делается попытка подключиться к тестовому внутреннему http-ресурсу и затем еще к аналогичному внешнему. Так определяется, «жив» ли внутренний сервер и есть ли доступ к исходящему каналу в Интернет. Число тестов можно расширить. Например, если запрос http://domain.name не проходит, но удовлетворяется запрос по IP-адресу, то можно сделать вывод о проблемах с DNS. Для того чтобы воспользоваться приведенной программой, надо скомпилировать ee в исполняемый файл. Затем поместить результат, например, в директорию, содержащую общий рабочий стол. Таким образом, она будет доступна всем пользователям компьютера. Либо можно поместить ее в персональный рабочий стол в профилях прямо на сервере, что приведет к размножению ее копий по локальным копиям профилей после следующей же перезагрузки. Теперь остается приучить всех пользователей перед истеричным звонком сисадмину запускать эту программу. В первую очередь они должны будут руководствоваться результатами теста, а уже потом эмоциями и предположениями.
Практический пример
Если сисадмин сказал, что придет прямо сейчас, выйдите из сети и отправляйтесь пить кофе
Для нас не проблема запомнить 2700 сетевых паролей.
Ну что ж, установка программ и выполнение стандартных действий автоматизирована. Как это поможет вам в практической работе? Рассмотрим случай из практики IT-аутсорсинга.
Итак, самое главное в работе сисадмина-аутсорсера – не переработать. Для практикующих этот тяжкий труд показатель успеха прямо пропорционален числу одновременно обслуживаемых рабочих мест. Основным регулирующим фактором становится скорость восстановления рабочих станций. Именно восстановления, а не первоначальной установки. Поэтому будем рассматривать деятельность системного администратора в непрерывном цикле. И в первом приближении надо выполнить два условия.
Во-первых, следует максимально снизить необходимость, как в локальном присутствии сисадмина, так и потребность в удаленном управлении. Для этого дадим полную свободу пользователям в пределах собственного рабочего места – сделаем их локальными администраторами. Скорее всего услышим возражения: это не верно, правильно ограничить права локальных пользователей, научитесь пользоваться политиками и т. д. Безусловно, такая точка зрения имеет право быть. Безусловно, есть предприятия с развитой корпоративной культурой. Но в массе, если речь идет об отечественной индустрии, то сисадмину предоставляется на выбор: открыть курсы компьютерной грамотности за свой счет или предоставить локальным пользователям максимальную свободу. Выберем последнее. Поскольку это делает:
- локальных пользователей ответственными за состояние собственного рабочего места;
- избавляет сисадмина от частых визитов по пустякам;
- создает впечатление независимости деятельности сотрудников обслуживаемого предприятия и избавляет от конфликтов, так как не позволяет им переложить ответственность на сисадмина.
Во-вторых, необходимо обеспечить максимально быстрый способ восстановления рабочих станций и создать условия для удаленного управления локальными рабочими местами. Здесь должно быть все понятно: предоставив пользователям видимость свободы, надо создать средство для ликвидации последствий такой демократизации. Очень часто единственный рациональный путь «лечения» рабочих станций на платформе MS Windows заключается в полной повторной переустановке. Конечно, надо обеспечить сохранение пользовательского окружения, т.е. профиля. Настройка внутренней сети для работы в составе домена Microsoft с перемещаемыми профилями полностью решает задачу сохранения пользовательского окружения и даже позволяет в случае возникновения проблем с некоторыми рабочими местами воспользоваться другими компьютерами взамен поврежденных, как временной мерой.
Получается, что ключевой вопрос – это автоматизированная установка рабочей станции, включая операционную систему и все необходимое для работы прикладное программное обеспечение. Итак, в результате задача свелась к выбору способа автоустановки MS Windows и программ в этой ОС. Почему к «выбору», а не «поиску» или «созданию». Да потому, что автоустановка является штатным свойством этой операционной системы. И ничего тут не надо сочинять и изобретать, ну разве что надо угадывать, так как документация путаная, а многочисленные описания процесса противоречат друг другу. «Выбор» заключается в определении места размещения дистрибутива. Рассмотрим подробнее.
Способы размещения определяются используемым дистрибутивным носителем. Носителей информации ровно столько, сколько предоставляет современная технология. Автору представляется очень изящным решением установка с сетевого носителя, например с tftp, вместе с сетевой загрузкой. Многие системные администраторы практикуют этот способ. На этом экономится как минимум 15-20 у.е. стоимости каждого рабочего места – столько же стоит CD-ROM. Но мы рассматриваем не просто абстрактное администрирование, а аутсорсинг. Здесь нельзя полагаться на какие-то внешние средства, кроме тех, что включены в состав рабочей станции. А вдруг непредвиденное повреждение рабочего места и было связано с проблемами локальной сети. Кроме того, существует совершенно рядовая для современного офиса ситуация, когда надо обеспечить удаленный доступ к внутренним ресурсам не только для сисадмина, но и для других сотрудников. А это значит, что надо, точно так же, как и в офисе, произвести установку типового программного обеспечения и на их персональные компьютеры. Безусловно, приватные визиты могут внести разнообразие в монотонную жизнь системного администратора, но скорее всего включение приватных компьютеров в число оплачиваемых будет отрицательно воспринято заказчиком. Поэтому, выбор в качестве дистрибутивного носителя CD-ROM представляется разумным деловым компромиссом. Тем более что в перспективе можно без излишних проблем перейти на DVD-ROM, значительно увеличив тем самым число устанавливаемых программ. Теперь рассмотрим подробнее процесс установки MS Windows XP Professional SP2 Rus, которую выберем в качестве ОС для создания рабочих станций. Ведь именно этот процесс далее предстоит автоматизировать.
Итак, в следующей части рассмотрим подробнее процесс установки MS Windows XP Professional SP2 Rus, которую выберем в качестве ОС для создания рабочих станций. Ведь именно этот процесс далее предстоит автоматизировать.
Литература:
- Барабанов А. Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 1. – Журнал «Системный администратор», №4, апрель 2005 г. – 11-15 с.