вторник, 19 августа 2008 г.

Windows scripting: отправка электронной почты

К сожалению, в реальной жизни системному администратору приходится работать не только с unix-подобными системами. Иногда нужно решать задачи системного администрирования на плохо приспособленных и слабодокументированных операционных системах семейства windows. О таких хорошо зарекомендовавших себя инструментах как bash, perl или даже простой grep говорить не приходится. Что же мы имеем в наличии? Фактически имеется технология Windows Script Host с возможностью писать скрипты на языках JScript и VBScript. Мда, ну и выбор... и чтобы усугубить глубину собственного падения далее будем использовать язык VBScript.

Задача. Довольно часто встречается ситуация, когда скрипт должен уведомить администратора по электронной почте о наступлении какого-либо события или ситуации. Для примера напишем скрипт, посылающий уведомление о загрузке windows сервера.

Теория. Составной частью оперционных систем windows 2000/xp/2003 является динамическая библиотека сdosys.dll. Эта библиотека выдрана из почтового сервера MS Exchange и её функциональность сильно урезана. Тем не менее, с ее помощью можно сформировать сообщение электронной почты и отправить его внешнему почтовому серверу (MTA). Называется это счастье «CDO for Windows 2000», по ссылке доступна подробная документация из MSDN.

Решение. Исходный код скрипта email_notify.vbs:

Set email = CreateObject("CDO.Message")

With email.Configuration.Fields
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") _
        = "mail.localnet"
    .Update
End With

email.From = "robot@mycompany.ru"
email.To = "admins@mycompany.ru"

Set wshNetwork = WScript.CreateObject("WScript.Network")
email.Subject = wshNetwork.ComputerName & " включен"
email.Textbody = ""
email.TextBodyPart.charset = "koi8-r"

email.Send

Надеюсь, вам не составит труда пробится через синтаксис VBScript. Сам скрипт короткий и достаточно прозрачный для понимания. В основном используются методы объекта CDO.Message, они документированы по приведенной выше ссылке. Конечно, по сравнению с linux реализацией той же функциональности:

echo "" | mailx -s "`hostname` is up" admins@mycompany.ru

мы получили монстроподобного уродца, но тут уж ничего не поделаешь, такова участь несчастных администраторов windows.

На этом собственно задача отправки электронных писем из windows скриптов решена. По двойному клику на файле email_notify.vbs скрипт выполнится. Однако, нам еще осталось рассмотреть тонкий момент запуска скрипта при загрузке операционной системы. Ярлык на такой скрипт нельзя помещать в меню «Startup» («Автозагрузка»). Ведь такие ярлыки обрабатываются не при загрузке операционной системы, а при начале сеанса конкретного пользователя. По той же причине не подходят и прочие места автозапуска, которые в большом количестве могут быть обнаружены на просторах реестра windows. Некорректно такой скрипт запускать и как системную службу. Вот правильное решение:

  1. Выполняем команду «Start > Run...» и вводим магическую команду «gpedit.msc»:

  2. В открывшемся окне с заголовком «Group Policy Object Editor» выбираем ветку «Local Computer Policy > Computer Configuration > Windows Settings > Scripts (Startup/Shutdown)»:

  3. Дважды кликаем на элемент «Startup» в правой части окна и появляется диалоговое окно «Startup Properties»:

  4. Нажимаем кнопку «Add...». Во вновь отрывшемся диалоговом окне «Add a Script» задаем полный путь к нашему скрипту email_notify.vbs. Официально рекомендованный путь для размещения загрузочных скриптов — «C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup».

  5. Нажимаем кнопку «OK», чтобы закрыть диалоговое окно «Add a Script». В списке скриптов диалогового окна «Startup Properties» появляется новый скрипт автозапуска.

  6. Нажимаем кнопку «OK», чтобы закрыть диалоговое окно «Startup Properties». Закрываем программу «Group Policy Object Editor». Все, можно проверять запуск скрипта при загрузке.

Выводы. Не смотря на то, что вам придется писать уродливые скрипты на бейсике, а также не помешают навыки скоростного кликанья мышкой, операционная система windows худо-бедно поддается автоматизации системного администрирования.