Рубрика:
Программирование /
Веб-программирование
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
ИВАН КОРОБКО
Особенности запуска внешних команд из ASP-страниц
Создавая приложения на ASP, предназначенные для облегчения управления различными сервисами сети, программисты часто сталкиваются с необходимостью запускать из них приложения (BAT, VBS, EXE и т. д.). Читая документацию компании Microsoft, понимаешь, что решить задачку не представляет никакой сложности. Но существует ряд тонкостей в запуске приложений из ASP-страниц, которые почему-то не описаны в документации. На практике сталкиваешься с тем, что сценарий должен работать, поскольку все написано правильно и встроенный обработчик ошибок сообщает об отсутствии таковых, однако требуемый результат не достигается. Эта статья посвящена запуску различных типов приложений из ASP-страниц.
Active Server Pages
ASP-страницы – это сценарии, программный код которых выполняется при их запросе. Результатом действия скрипта является HTML/DHTML-страница, которая отображается у клиента. Структура документа на ASP очень проста. В первой строке всегда указывается язык, с помощью которого созданы скриптовые вставки ASP-страница. Таким языком программирования может быть один из двух, поддерживаемый всеми браузерами: Jscript или VBScript. Во всех примерах в данной статье будет использоваться VBScript, поскольку он наиболее симпатичен автору. Каждый из этих примеров легко переписать на Jscript. Итак, первая строка любого из сценариев на ASP выглядит следующим образом:
<%Script Language=”VBScript”%>
или
<%Script Language=”JScript”%>
Программный код, находящийся между <% и %>, выполняется на сервере и подчинен синтаксису одного из выбранных языков. Весь остальной код представляет собой HTML-страницу в явном виде.
Листинг типовой ASP-страницы выглядит следующим образом:
Пример 1:
<%@ Language=VBScript CODEPAGE=1251%>
<HTML>
<TITLE> Заголовок страницы </TITLE>
<HEAD>
<LINK href="../style.css" type=text/css rel=stylesheet>
<meta http-equiv="Content-Type" content="text/html" charset=windows-1251>
</HEAD> <BODY>
<FONT FACE="Arial">
…
<%
…
Response.write variable ‘ отображение на экране содержимого переменной
%>
После обработки интерпретатором IIS программного кода и преобразования результатов его работы в HTML/DHTML необходимо дать команду на отображение страницы в браузере клиента. Такой командой является Response.Write q, где q – имя переменной, содержащей фрагмент HTML-кода.
Методы запуска приложений из VBS
Рассмотрим вызов приложений непосредственно из файла VBS, для этого можно использовать один из методов – Run или Exec. Необходимо отметить, что в VBScript не существует функции, с помощью которой можно запустить приложения, однако она существует в WSH, который поддерживает VBSscipt и JScript . Создание экземпляра объекта WSH осуществляется с помощью команды Create Object(“WScript.Shell”).
Пример 2:
Set Wshell = CreateObject("Wscript.shell")
Set Proc = Wshell.Exec("application.exe")
" Ждать, пока не завершится выполнение программы
Do While Proc.Status = 0
WScript.Sleep 100
Loop
Set Wshell = Nothing
MsgBox Proc.StdOut.ReadAll
Пример 3:
Set Wshell = CreateObject("Wscript.shell")
Set Proc = Wshell.Run("application.exe")
Set Wshell = Nothing
MsgBox Proc
По своей сути оба варианта равнозначны, однако отображаемая в CMD-консоли информация (касается command-line-утилит) может быть прочитана только в первом из приведенных примеров. Во втором примере можно считать только статус завершения дочернего процесса (код ошибки): 0 – команда успешно выполнена, 1 – нет.
Для успешного запуска различных приложений из ASP-страницы необходимо учитывать некоторые особенности, о которых речь пойдет ниже. Все приложения можно условно разделить на несколько групп:
- приложения с графическим интерфейсом;
- приложения, работающие из командной строки (command lines utilities);
- скрипты на VBS/Jscript (хотя скрипты на VBS относятся к приложениям, запускаемым из командной строки, выделим их в отдельную группу).
Первая особенность: поскольку код ASP-страниц исполняется на сервере, и только результат в виде HTML-страницы пересылается на клиентскую машину, то для успешного запуска приложения на сервере, пользователь должен обладать соответствующими правами. IIS представляет собой трехзвенную систему.
Рисунок 1
Пусть IIS имеет настройки по умолчанию. В этом случае при загрузке любой ASP-страницы она стартует от имени встроенного пользователя (см. рис. 2). Если страница работает с некими базами данных, например с Active Directory, то пользователь, запускающий данную страницу должен обладать правами администратора. Существует несколько способов выполнить эти условия. Первый – вместо учетной записи встроенного пользователя прописать имя учетной записи администратора сети. При таком раскладе любой пользователь в сети сможет посетить данную страницу, т.к. она будет запускаться от имени системного администратора. Этот способ предоставляет всем доступ к данной странице, что, согласитесь, неправильно. Это еще полбеды. Главное, что таким образом резко снижается безопасность всей системы. В случае ошибок на странице злоумышленник запросто запустит вредоносный код с правами администратора. Поэтому предлагается другой способ решения проблемы, с помощью которого можно ограничить доступ к ресурсам. В настройках IIS необходимо сбросить флажок (см. рис. 2) с Enable anonymous access и установить его напротив Basic Authentication. Также следует изменить права на файловую структуру используемого сайта, исключив оттуда группу Everyone и добавив соответствующую группу безопасности. При такой настройке IIS только системные администраторы получат доступ к данной странице. При попытке любого пользователя, не являющегося администратором сети, получить доступ к странице IIS будут запрошены имя и пароль пользователя.
Рисунок 2
Если необходимо расширить круг лиц, которым должен быть доступен данный сайт, и при этом пользователи не являются системными администраторами, то можно воспользоваться вариантом, являющимся синтезом двух ранее изложенных решений: ограничить доступ на сайт с помощью Basic Authentication и правами на файловую структуру, запускать скрипт, инкапсулированный в страницу с правами администратора.
Только что мы рассмотрели механизм взаимодействия первого и второго звена в трехзвенной системе. Первым звеном является рабочая станция пользователя, вторым – сервер, на котором установлен IIS. Взаимосвязь этих звеньев осуществляется с помощью одного пользователя. Между вторым и третьим звеном (сервер IIS, процессы, порождаемые из ASP) взаимодействие осуществляется с помощью другого пользователя. Рассмотрим взаимодействие второго и третьего звена подробнее.
При запуске из кода ASP-страницы какого-либо приложения осуществляется взаимодействие между вторым и третьим звеном. IIS порождает процесс, запускаемый от имени другого встроенного пользователя. Поскольку ASP-страница выполняется на сервере, то для запуска приложения необходимы соответствующие права. Управление этой учетной записью пользователя осуществляется в Application Tools (см. рис. 3).
Рисунок 3
Такова первая особенность, касающаяся абсолютно всех приложений. Существует вторая, также характерная для всех приложений.
С помощью ASP-страниц можно вызывать приложения, находящиеся на удаленном компьютере. Некоторые приложения не могут быть запущены на другой платформе. Например, некоторые утилиты, успешно запускающиеся в Windows 2000, выдают сообщение об ошибке на Windows 2003, аналогичная ситуация может возникнуть с приложениями Windows 98, запускаемыми на Windows 2k.
Запуск приложения c графическим интерфейсом
Запуск приложения осуществляется с использованием одного из вышеописанных методов (см. примеры 2, 3). Единственной особенностью является необходимость указывать полный путь к запускаемому приложению. Путь может быть как локальным, например, C:Folder1..., так и сетевым: ServerC$Folder1...
Запуск приложения из командной строки (command line utility)
В качестве приложения может быть программа, запускаемая из командной строки (command-line utility), приложение для Windows (файл с расширением EXE).
Рассмотрим особенности запуска command-line-приложений из ASP-страниц. Синтаксис команды запуска утилиты из командной строки следующий:
%comspec% /c cmd_util.exe
Префикс %comspec% /c является обязательным. Переменная окружения %comspec% указывает на C:Windows System32cmd.exe. Поскольку при запуске внешней команды порождается процесс CMD, то после отработки команды его необходимо закрыть. Эта процедура осуществляется с помощью ключа /c. Если процессы не закрывать, то в конце концов возникнет недостаток памяти на сервере, что приведет к существенному снижению скорости его работы, а впоследствии к отказу функционирования различных служб компонентов. Путь к утилите также необходимо писать полностью. Допускается использование сетевых имен в формате UNC (ServerShare...).
Запуск скриптов
Запуск скриптов имеет ряд особенностей. Рассмотрим два вида скриптов, которые, на взгляд автора, используются наиболее часто в данной ситуации: VBS-скрипты и BAT-файлы.
Запуск VBS-файлов из скрипта
Бывают ситуации, когда необходимо из ASP-страницы запустить внешний VBS-скрипт. Как правило, он запускается с параметрами. Рассмотрим кусок листинга VBS-скрипта, касающийся чтения его внешних параметров.
Чтение параметров основано на использовании свойства Arguments объекта WScript WSH. Приведем пример, который определяет, с какими параметрами был запущен скрипт:
Пример 4:
Set objArgs=Wscript.Arguments
t=”Количество заданных параметров - ” & Wscript.Arguments.Count & chr(13) & “Параметры:” & chr(13)
For Each arg in objArgs
t = t & arg & chr(13)
Next
MsgBox t
Рисунок 4
Чтение значений элементов массива, содержащего аргументы скрипта, можно осуществлять другим способом. Оба варианта дают один и тот же результат.
Поэтому его выбор зависит от пристрастий программиста. Отметим лишь, что первый вариант компактнее. Однако, если необходимо использовать нумерацию объектов, то второй вариант окажется удачнее, поскольку в первом придется вводить дополнительно счетчик:
Пример 5:
Set objArgs=Wscript.Arguments
Coun = Wscript.Arguments.Count
t="Количество заданных параметров - " & Coun & chr(13) & "Параметры:" & chr(13)
For i=0 to Coun-1
t = t & i+1 & ": "& objArgs(i) & chr(13)
Next
MsgBox t
Иногда необходимо получить значение определенного аргумента. Это проиллюстрировано в примере 6. Необходимо помнить, что нумерация элементов начинается с 0:
Пример 6:
Set objArgs=Wscript.Arguments
Msgbox objArgs(2) " Чтение третьего аргумента.
Приведенный пример не является образцом программирования, поскольку в примере отсутствует обработчик ошибок.
Предугадывание возможных ошибок, имитация простейшего интеллекта у программы является хорошим тоном в программировании. Поэтому создадим для этого примера обработчик ошибок. В данной ситуации ошибка возникает в том случае, если осуществляется чтение несуществующих параметров.
Пример 7:
Set objArgs=Wscript.Arguments
Coun = Wscript.Arguments.Count
q = InputBox (“Введите номер считываемого аргумента”, “Чтение номера аргумента”)-1
t = ””
if q> Coun then
t= objArgs(q)
else
t=”ERROR”
End if
Msgbox t
Запуск BAT-файлов
При использовании BAT-файлов необходимо помнить, что отдельный процесс порождается не только в момент запуска такого типа файлов, но и при выполнении каждой из команд, находящихся внутри него. По той же самой причине не стоит выполнять взаимосвязанные команды, поскольку может сложиться ситуация, когда первая еще не успела отработать, а вторая, содержащаяся в следующей строке и использующая результат работы первой команды, уже начала выполняться. В результате произойдет ошибка. Чтобы избежать этого, вызывайте команды из кода ASP-страницы и осуществляйте проверку результата отработанной команды.
Подводя итог, кратко отметим, что при работе с внешними файлами из ASP-страниц необходимо учитывать особенности работы IIS. Надеюсь, что прочитав эту статью, у программистов не будет проблем с запуском приложений из ASP-страниц.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|