Часть 2
Алексей Барабанов
С базовым функционалом AutoIt вы уже познакомились в первой части статьи
и представляете, как использовать его для автоматизации простейших операций в
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 [1].

Рисунок 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-аутсорсинга.
Итак, самое главное в работе сисадмина-аутсорсера
– не переработать. Для практикующих этот тяжкий труд показатель успеха прямо
пропорционален числу одновременно обслуживаемых рабочих мест. Основным
регулирующим фактором становится скорость восстановления рабочих станций.
Именно восстановления, а не первоначальной установки. Поэтому будем
рассматривать деятельность системного администратора в непрерывном цикле. И в
первом приближении надо выполнить два условия.
Во-первых, следует максимально
снизить необходимость, как в локальном присутствии сисадмина, так и потребность
в удаленном управлении. Для этого дадим полную свободу пользователям в пределах
собственного рабочего места – сделаем их локальными администраторами. Скорее всего
услышим возражения: это не верно, правильно ограничить права локальных
пользователей, научитесь пользоваться политиками и т. д. Безусловно, такая
точка зрения имеет право быть. Безусловно, есть предприятия с развитой
корпоративной культурой. Но в массе, если речь идет об отечественной индустрии,
то сисадмину предоставляется на выбор: открыть курсы компьютерной грамотности
за свой счет или предоставить локальным пользователям максимальную свободу.
Выберем последнее. Поскольку это делает:
n локальных пользователей ответственными за
состояние собственного рабочего места;
n избавляет сисадмина от частых визитов по
пустякам;
n создает впечатление независимости деятельности
сотрудников обслуживаемого предприятия и избавляет от конфликтов, так как не
позволяет им переложить ответственность на сисадмина.
Во-вторых, необходимо обеспечить максимально
быстрый способ восстановления рабочих станций и создать условия для удаленного
управления локальными рабочими местами. Здесь должно быть все понятно:
предоставив пользователям видимость свободы, надо создать средство для
ликвидации последствий такой демократизации. Очень часто единственный
рациональный путь «лечения» рабочих станций на платформе 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, которую выберем в
качестве ОС для создания рабочих станций. Ведь именно этот процесс далее
предстоит автоматизировать.
Литература:
1. Барабанов
А. Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 1. – Журнал
«Системный администратор», №4, апрель 2005 г. – 11-15 с.