Джим Тернер

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

Использование страниц HTML вполне позволяло решать мои задачи, но через некоторое время появились исправления для Microsoft Internet Explorer (IE) и пакеты обновлений Windows, которые нарушили привычный ход работы. После установки этих исправлений и пакетов обновлений мои сценарии стали не такими удобными, как раньше, когда можно было просто запустить сценарий двойным щелчком мыши и сразу начинать вводить данные. Теперь перед тем, как начать ввод, требовалось утвердительно ответить на серию приглашений системы безопасности, иначе страница отказывалась принимать вводимые пользователем данные. Надо было что-то предпринять с тем, что теперь именуется активным контентом - в основном, сценариями и компонентами ActiveX в коде HTML. Кроме того, моими сценариями пользовались и другие администраторы, и мне надоели звонки и электронные сообщения из-за подобных неувязок.

Решение этой проблемы пришло ко мне, когда я в первый раз запустил новый Scriptomatic 2.0. Одно из приложений меня очень заинтересовало. Оно было сделано очень стильно, но, главное, оно выполнялось без каких-либо вопросов со стороны подсистемы безопасности. Я был поражен, что можно сделать с помощью интерфейса HTA (HTML Application - приложение HTML).

Основы HTA

Сценарии HTA, появившиеся впервые в IE 5.0, были одно время достаточно популярными. Но, к сожалению, когда я начинал разрабатывать сценарии администрирования для Windows NT, я ничего не слышал и не читал о них. По сути, сценарий HTA представляет собой обычную страницу HTML с расширением .hta, но при этом сценарии HTA не подвержены строгим ограничениям и принудительным мерам безопасности, применяемым к страницам HTML.

Создание HTA требует определенных навыков написания сценариев. Как правило, программирование в HTML используется для создания экранных форм ввода, при этом программы на языке VBScript вставляются в код страницы HTML. Обычно все сводится к тому, чтобы ввести в форму ввода данных кнопку, которая генерирует событие onclick при щелчке по ней мышью. Другими словами, после того, как пользователь введет информацию и щелкнет по кнопке, код на языке VBScript должен сработать и выполнить определенное действие.

Если вы новичок в программировании на языке HTML (как вначале это было со мной), вам понадобится совершить некоторое исследование ресурсов MSDN (Microsoft Developer Network). Там имеется множество разнообразных примеров и ссылок, и, затратив несколько дней, вы сможете создавать действительно полезные сценарии HTA.

Хотя овчинка стоит выделки, раскапывание в MSDN нужных ссылок представляет собой непростую задачу, а потом придется еще потратить много времени и усилий для написания сценария HTA в редакторе Notepad. Сберечь время и продвинуться в обучении позволит инструментарий Web development package. Лично я воспользовался пробной версией Microsoft FrontPage, которую мне дали на каком-то мероприятии Microsoft, так что я установил эту версию и поработал с нею.

Написание кодов HTML вручную и с помощью специализированных средств разработки - это как ночь и день. Большая часть кода, а может и весь код, создается автоматически, как будто вы графически создаете свой экранный бланк для ввода. После создания формуляра надо вставить этот код в раздел сценария и сохранить полученный файл с расширением .hta.

Хочу сразу оговориться, я не рекламирую Microsoft FrontPage, просто в тот момент именно это средство оказалось у меня под рукой.

Обратите особое внимание: как любое приложение или сценарий, HTA может содержать потенциальную опасность, особенно, если приходит из неизвестного или ненадежного источника. Старайтесь придерживаться общего правила, что если вы получаете файлы из неизвестного источника, не открывайте их, а просто сразу же удаляйте. Я пользуюсь сценариями HTA только собственного производства и передаю их только людям, которых я знаю.

Анализируем сценарий HTA

На Рисунке 1 показан основной сценарий HTA, а на Листинге 1 - код, который создает этот сценарий. В коде HTML реализуется простая структура из элементов, определяемых тегами. Большинство тегов являются парными. Тег <имя тега> начинает элемент, а тег заканчивает этот элемент.

Как видно из Листинга 1, тег начинает HTA, тег является его окончанием. Далее следует первый элемент информации о документе. В этом примере заголовок формуляра для ввода и элементы окна находятся между тегами и . Элемент HTA:APPLICATION (приложение HTA), который показывает фрагмент A на Листинге 1, определяет вид формы для ввода данных. В этом случае настройки элемента HTA:APPLICATION задают окно пользовательского интерфейса, в котором используется тонкая граница, параметр стиль границы задается как sunken, кнопки Minimize и Maximize активизированы, и блокируются линейка прокрутки и значок приложения, поэтому они не появляются в панели задач.

При использовании атрибутов CAPTION и SYSMENU следует быть внимательным. Если установить их неправильно, то форму будет невозможно закрыть. Значение атрибута CAPTION равное No, исключает строку заголовка окна приложения. Если еще установить атрибут SYSMENU равным No, то будут исключены кнопки Minimize, Maximize и Close. Так что, решив установить атрибуты CAPTION или SYSMENU равными No, убедитесь в наличии кнопки Close на вашей странице.

При проверке этого сценария HTA я заметил, что если опустить все эти атрибуты HTA:APPLICATION и просто включить тег , то используются настройки по умолчанию, причем вид их вполне удовлетворительный. Если вы хотите придать форме ввода более привлекательный вид, то воспользуйтесь атрибутами HTA:APPLICATION, перечисленными в Таблице 1. В таблице приведены различные атрибуты, их возможные значения и значения по умолчанию.

Фрагмент B в Листинге 1 показывает элемент сценария HTA, который начинается тегом . Далее следует строка language= attribute, где attribute определяет язык для создания сценария, в рассматриваемом случае это VBScript. В этом примере HTA, элемент сценария содержит простую подпрограмму на языке VBScript, которая выполняется, когда пользователь щелкнет по кнопке для активизации сценария Push this button to run script. Больше ничего особенного, но можно скопировать любую часть этого кода VBScript, которая находится между тегами , и быстро получить работающий сценарий.

Последний раздел в Листинге 1 начинается тегом , а заканчивается тегом . Этот элемент содержит код HTML, который создает форму, куда пользователь вводит данные в поля и активизирует кнопки. В примере HTA на Рисунке 1 есть два поля для ввода данных: поле для ввода обычного текста и поле для ввода текста пароля, который скрывает любой текст, вводимый пользователем. Есть еще две кнопки: одна запускает код на языке VBScript, другая закрывает это приложение.

Рассмотрим внимательнее элемент body. Фрагмент C показывает код, который создает поле для обычного текста на Рисунке 1. Здесь тег

начинает новый параграф, а тег

заканчивает его. Теги и используются для задания начертания, размера и цвета текста. Если определение этих параметров не нужно, и вы хотите воспользоваться стилем текста по умолчанию, то это будет гарнитура Times New Roman, цвет черный, размер шрифта 3. Надо сказать, размеры шрифтов отличаются от обычных шрифтов, которые используются, например, в Microsoft Word. В HTML можно задать семь размеров (от 1 до 7) с помощью size= attribute, причем размер 1 будет самым маленьким, а размер 7 самым крупным. Даже если HTA использует размер по умолчанию, то код во фрагменте C устанавливает размер шрифта на 3 для слов в текстовом поле (Text box) и слов Use a text box for most any type of input (Воспользуйтесь текстовым полем для большинства типов ввода) для демонстрации.

Элемент ввода определяет поле ввода, куда пользователь может вводить данные. Равенство type= attribute определяет тип поля ввода (например, поле для обычного текста, поле для пароля, обычная кнопка, переключатель). В этом случае вы создаете поле для обычного текста (type="text"), которое имеет имя T1 (name="T1") и размер этого поля равен 20 символам (size="20"). Причем значение T1.value означает, как вы ссылаетесь на это текстовое поле в вашем коде на языке VBScript. В отличие от большинства тегов тег не имеет концевого тега.

Код для поля ввода текста пароля имеет тот же формат, что и код для поля ввода обычного текста. Однако в этом случае, вы указываете "password", а не "text" в равенстве type= attribute, в этом случае любой текст, вводимый пользователем, будет скрытым.

Фрагмент D показывает код, который создает кнопку Push this button to run script для запуска сценария и кнопку выхода Exit. Обе кнопки имеют тип ввода "button" (кнопка). Обе кнопки также имеют атрибут ввода, который называется onclick. Атрибут onclick устанавливается для имени подпрограммы, метода или другого кода, который должен активизироваться при щелчке мышью по кнопке. Для кнопки Push this button to run script, устанавливается onclick для подпрограммы showsetting (показать настройки) - см. фрагмент B в Листинге 1. Эта подпрограмма показывает текст, который пользователь вводит в поле Text box и в поле Password box. Текст, который пользователи вводят в поле Password, будет отображаться в незашифрованном тексте. Атрибут onclick кнопки выхода устанавливается на метод self.close (автоматического закрывания). Этот метод непосредственно закрывает HTA. Здесь Self относится к текущему открытому окну.

Возможности безграничны

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

Приложения HTML, HTA (HTML Applications) почти идеально подходят для создания форм ввода пользовательских данных.. Предлагаемый ниже сценарий HTA демонстрирует интересный пример практического использования HTA. Форма управления пользовательскими квотами User Quota Utility позволяет устанавливать и показывать квоты диска на локальном или удаленном компьютере, управляемом Windows Server 2003 или Windows XP. Даже если вы не пользуетесь квотами, эта форма позволяет продемонстрировать методы, используемые при создании административных утилит с помощью HTA и VBScript. Если вы используете Windows 2003 или XP, но не включили использование квот, то это можно сделать с помощью диалогового окна Properties (Свойства) на локальном компьютере, хотя бы чтобы опробовать предлагаемый сценарий HTA. Обратите внимание - не включайте флажок Deny disk space to users exceeding quota limit (не давать места на диске пользователям, превысившим предел по квотам), поскольку при этом пользователи не смогут записывать информацию на диск в случае превышения установленной квоты. Подробнее об использовании квот см. в статье Microsoft "Managing Disk Quotas in Windows Server 2003 and Windows XP" - управление квотами на диске в Windows Server 2003 и Windows XP - на сайте Microsoft http://www.microsoft.com/technet/scriptcenter/topics/win2003/quotas.mspx.

Структура HTA

Рисунок 2 показывает утилиту по квотам пользователя, User Quota Utility: Экран для ввода информации состоит из четырех полей для ввода информации, одного раскрывающегося списка, двух кнопок и двух текстовых полей. Рассмотрим эти компоненты и работу самой утилиты.

Поля для ввода информации (input box). Первое поле для ввода информации предназначено для ввода списка идентификаторов пользователей, ID, для учетных записей пользователей, для которых необходимо изменить квоты. Во втором поле для ввода информации пользователи вводят имя сервера или компьютера, на которые распространяются квоты. Если это поле остается пустым, то по умолчанию утилита действует на локальной машине. Если указанные идентификаторы пользователей представляют собой учетные записи на другом компьютере, то надо ввести домен или имя компьютера в третьем поле для ввода информации. Если это поле остается пустым, то по умолчанию утилита относится к локальной системе.

В четвертом поле для ввода информации пользователи вводят размер квоты в байтах. Как видно по Рисунку 1, я ввел по умолчанию размер 5368709120, т.е. 5 Гбайт, но вы можете установить размер, который считаете нужным. Если вы предпочитаете вводить размер квоты в байтах, мегабайтах или гигабайтах, то можно воспользоваться вторым HTA (UserQuotaUtility2.hta), в котором реализованы эти три возможности, как показано на Рисунке 3.

Раскрывающийся список (drop-down box). Раскрывающийся список находится прямо после второго текстового поля. Он позволяет пользователю выбрать букву накопителя для компьютера, на котором действуют квоты. Ниспадающее окно в этом примере HTA имеет довольно внушительный список букв накопителей. Значение по умолчанию в приведенном сценарии HTA - дисковод C:.

Кнопки. Когда пользователь щелкнет по первой кнопке Run Modify User Quotas (активизировать изменение квот пользователя), то утилита User Quota Utility попытается установить указанную квоту на выбранные системы. Это действие связано с подпрограммой RunMod в разделе VBScript в этом HTA, что показывает Листинг 2.

Вторая кнопка, Run Quota Query - активизировать запрос квоты, дает список квот для указанного сервера или накопителя. Это действие связано с подпрограммой RunQuery в разделе VBScript в этом HTA. Это приложение не фильтрует идентификаторы пользователей при запуске этой подпрограммы, оно перечисляет все настройки по квотам пользователей для указанного компьютера или накопителя. Даже если пользователь перечислил идентификаторы пользователей в первом поле для ввода информации, активизация кнопки Run Quota Query приведет к тому, что будет получена информация обо всех учетных записях на указанной системе, а не только о записях, перечисленных в списке.

Текстовые поля. Первое текстовое поле, Status Box - поле состояния, показывает статус (successful или unsuccessful) для самого последнего действия. Второе текстовое поле, Application Information - информация о приложении, представляет собой краткое изложение этого приложения, включая инструкцию. Эти два поля представляют собой одинаковые типы текстовых полей, которые утилита использует для ввода, они декларируются как ReadOnly (только чтение), что не позволяет пользователям вводить текст. Вы можете изменить программно содержание этих текстовых областей, устанавливая различное значение в коде fieldnames.value в сценарии HTA.

Анализ HTA

HTA начинается с основных настроек приложения HTA. Весь сценарий HTA увидтеь в Листинге 3. Для просмотра сценария откройте файл HTA в блокноте Notepad.

После настроек приложения, HTA включает раздел VBScript, см. Листинг 2. Этот раздел содержит три подпрограммы: Window_Onload, RunMod и RunQuery.

Подпрограмма Window_Onload. Подпрограмма Window_Onload выполняется автоматически при активизации этого приложения. Сначала подпрограмма использует self.Focus() для запуска окна приложения впереди всех других открытых окон. Затем подпрограмма настраивает размеры окна приложения и устанавливает размер квоты по умолчанию (qlimit.value).

Подпрограмма RunMod. Подпрограмма RunMod, которая ассоциирована с кнопкой Run Modify User Quotas, содержит код для изменения квот пользователя. Помимо очистки значения поля Status (с помощью оператора statval.value = "") этот код проверяет наличие символов «возврат каретки» или «перевод строки» в конце поля для ввода идентификатора пользователя, User ID. Символ «возврат каретки» или «перевод строки» нужен для получения окончания идентификатора, поэтому если его нет, то код его добавляет. Подпрограмма RunMod использует функцию Split с разделителем vbcrlf для построения массива идентификаторов пользователей, который позже использует HTA для установления этих квот.

Этот сценарий приписывает значения из формы для ввода информации HTA переменным, которые используются в сценарии. Этот сценарий использует GetObject для поиска экземпляра класса. Он использует классWin32_DiskQuota как для подпрограммы RunMod, так и для RunQuery, и использует класс Win32_ComputerSystem для поиска имени локального компьютера, когда пользователь оставляет поле ввода домена пустым.

Вся подпрограмма RunMod дана во фрагменте A кода в Листинге 2. Здесь подпрограмма обрабатывает в цикле идентификаторы пользователей, ID. Для каждого ID подпрограмма находит специальную квоту пользователя, устанавливает и фиксирует предельное значение по методу objQuota.Put_.

Подпрограмма RunQuery. Подпрограмма RunQuery, которая ассоциирована с кнопкой Run Query Quota button, начинает с установки параметров для ввода значений. Затем RunQuery устанавливает константы wbemFlagForwardOnly и wbemFlagReturnImmediately. Константа wbemFlagForwardOnly вызывает сценарий для получения однонаправленного счетчика, такие счетчики обычно работают намного быстрее и используют меньше памяти, чем в случае обычных счетчиков. Константа wbemFlagReturnImmediately делает вызов для непосредственного возврата.

Затем подпрограмма RunQuery подключается через Windows Management Instrumentation (WMI) к серверу или компьютеру, который указал пользователь, если это поле осталось пустым, то сценарий подключает к локальному компьютеру. Затем подпрограмма использует запрос на языке WQL (WMI Query Language) для получения имеющейся информации о квоте, как показывает код фрагмента B. В этом запросе сценарий определяет константы wbemFlagForwardOnly и wbemFlagReturnImmediately. Если вы хотите уменьшить число строк в коде, то можно совместить значения этих констант и задать их десятичное значение равным 48 - пример этой более короткой версии во фрагменте A кода.

В запросе WQL параметр WQL необязательный. Фрагмент B кода использует этот параметр, но если вы его не включаете, надо поставить две запятые, между которыми ничего нет, как показывает оператор Set colItems фрагмента A. Лучше все же указывать WQL, потому что его наличие вносит ясность, что это - оператор Select для использования WMI.

После того, как RunQuery получает данные о существующих квотах, RunQuery показывает все полученные данные в крупноформатной таблице Microsoft Excel. Заметьте, что поскольку для класса Win32_DiskQuota нет свойства типа счетчик, подпрограмма помещает инициализацию Excel в цикл For Next и устанавливает на метку do_once. Если бы свойство счетчика было бы доступно, подпрограмма могла бы просто выполнять проверку по условию «значение больше нуля», тогда не надо было бы инициализировать Excel и цикл For Next, если бы не было результатов возврата по запросу.

Завершение кода. Раздел на языке VBScript в HTA также содержит функцию ConvStatus, как показано во фрагменте C. Эта функция преобразует статус квоты из численного представления 0, 1 или 2 в значения OK, Warning или Exceeded, соответственно. Обратите внимание, что код проверяет ошибки в ключевых блоках программы VBScript. Этот код использует err.description для обнаружения генерированных системой ошибок и затем показывает их в поле Status Box для HTA. После раздела на языке VBScript файл HTA включает код для окна ввода.

Пишите свои сценарии HTA.

Вы можете просмотреть и отредактировать файл HTA — например, чтобы изменить предельные значения квот — с помощью редактора Notepad. Если вы хотите создать свои интерфейсы HTA и вы не против написания HTML, которые вы устанавливаете, то можете создать собственные экранные формы для ввода информации в редакторе Notepad и после переименовать файл с расширением .hta. Однако если вы не знаете HTML, я предлагаю использовать приложение для разработки веб-узлов, например, Microsoft Office FrontPage 2003. Такие приложения намного облегчают изучение HTML, и вы сможете создать работающее приложение и сберечь свое время и усилия, которые надо было бы на это потратить.


Листинг 1. Код для примера HTA на Рисунке 1


Simple HTA Sample






Text box Use a text box for most any type of input

Password box This provides Masked input


Листинг 2. Фрагмент утилиты User Quota Utility

Листинг 3. htaexample.hta



User Quota Utility



Modify or Query User Quotas on Server 2003 & XP

Modify Quotas for these User Accounts On Computer  Drive

If accounts are from a Domain or another Computer ... enter Computer or Domain name

Set to this Limit (bytes)

To acquire a Quota listing, enter Computer & Drive info only.




Листинг 4. htaexample2.hta



User Quota Utility




Modify or Query User Quotas on Server 2003 & XP

Modify Quotas for these User Accounts On Computer  Drive

If accounts are from a Domain or another Computer ... enter Computer or Domain name

Set to this Limit (bytes)     Mb    Gb

To acquire a Quota listing, enter Computer & Drive info only.




Таблица 1: Доступные Атрибуты приложения HTA: APPLICATION Attributes
Атрибут ОписаниеВозможные значения (если применимы)Имя приложения APPLICATIONNAMEУстанавливает или находит имя HTA
Граница BORDERУстанавливает или находит тип границы окна Dialog
thick
thin
none
Стиль границы BORDERSTYLE Устанавливает или находит набор стилей для границы контента в окне HTA обычная (по умолчанию): обычная граница
выпуклая: выпуклая 3-D граница
утопленная : утопленная 3-D граница
сложная: выпуклая и утопленная граница
static: 3-D граница обычно используется для окон, которые не принимают ввод пользователя
Заголовок CAPTIONУстанавливает или находит логическое значение, которое указывает, будет ли окно содержать строку заголовка или заголовок да (по умолчанию): строка заголовка отображается
нет: строка заголовка не отображается
Контекстное меню CONTEXTMENUУстанавливает или находит логическое значение, которое указывает, будет ли размещаться контекстное меню при нажатии правой кнопки мыши да (по умолчанию): контекстные меню отображаются
нет: контекстные меню не отображаются
Иконка ICONУстанавливает или находит имя и местонахождение иконки, указанной в HTA  
Внутренняя граница INNERBORDERУстанавливает или находит логическое значение, которое указывает, будет ли показываться внутренняя 3D-граница да (по умолчанию): внутренняя 3D-граница отображается
нет: внутренняя 3D-граница не отображается
Кнопка MAXIMIZE MAXIMIZEBUTTONУстанавливает или находит логическое значение, которое указывает, будет ли в строке заголовка отображаться кнопка Maximize да (по умолчанию): кнопка Maximize отображается
нет: кнопка Maximize не отображается
Кнопка MINIMIZE MINIMIZEBUTTONУстанавливает или находит логическое значение, которое указывает, будет ли в строке заголовка отображаться кнопка Minimize да (по умолчанию): кнопка Minimize отображается
нет: кнопка Minimize не отображается
NAVIGABLEУстанавливает или находит логическое значение, которое указывает, будут ли загружаться прилинкованные документы в главном окне HTA или будет загружаться новое окно браузера да: ссылки в главном окне HTA будут загружаться
нет (по умолчанию): ссылки в главном окне HTA будут загружаться в новое окно браузера
Прокрутка SCROLLУстанавливает или находит, будут ли отображаться полосы прокрутки да (по умолчанию): полосы прокрутки отображаются
нет: полосы прокрутки не отображаются
auto: полосы прокрутки отображаются только, когда контент больше, чем место, отведенное пользователю
SCROLLFLATУстанавливает или находит логическое значение, которое указывает, будет ли полоса прокрутки трехмерной или плоской да: полосы прокрутки плоские
нет (по умолчанию): полосы прокрутки трехмерные
Выбор SELECTIONУстанавливает или находит, как можно выбирать контент - с помощью мыши или клавиатуры да (по умолчанию): контент может выделяться с помощью мыши или клавиатуры
нет: контент не может выделяться с помощью мыши или клавиатуры
Показывать внутреннюю панель задач SHOWINTASKBARУстанавливает или находит логическое значение, которое указывает, будет ли HTA отображаться на панели задач Windows да (по умолчанию): HTA размещается в панели задач Windows
нет: HTA не размещается в панели задач Windows
Один пример SINGLEINSTANCEУстанавливает или находит логическое значение, которое указывает, будет ли запускаться только один пример указанного HTA одновременно да: только один экземпляр указанного HTA может выполняться одновременно
нет (по умолчанию): одновременно могут выполняться несколько экземпляров указанного HTA
SYSMENUУстанавливает или находит логическое значение, которое указывает, будет ли отображаться системное меню да (по умолчанию): системное меню отображается
нет: системное меню не отображается
Состояние окна WINDOWSTATEУстанавливает или находит начальный размер окна HTA minimize - минимизировать: окно не отображается при запуске; зато появляется заголовок минимизированного приложения в панели задач
maximize - сделать максимальным: окно заполняет весь экран