Особенности запуска внешних команд из ASP-страниц::Журнал СА 9.2004
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
О журнале
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Магазин
Архив номеров
Вакансии
Контакты
   

  Опросы

Какие курсы вы бы выбрали для себя?  

Очные
Онлайновые
Платные
Бесплатные
Я и так все знаю

 Читать далее...

1001 и 1 книга  
20.12.2019г.
Просмотров: 1235
Комментарии: 0
Dr.Web: всё под контролем

 Читать далее...

04.12.2019г.
Просмотров: 1257
Комментарии: 0
Особенности сертификаций по этичному хакингу

 Читать далее...

28.05.2019г.
Просмотров: 3786
Комментарии: 2
Анализ вредоносных программ

 Читать далее...

28.05.2019г.
Просмотров: 4008
Комментарии: 1
Микросервисы и контейнеры Docker

 Читать далее...

28.05.2019г.
Просмотров: 3203
Комментарии: 0
Django 2 в примерах

 Читать далее...

Друзья сайта  

Форум системных администраторов  

sysadmins.ru

 Особенности запуска внешних команд из ASP-страниц

Архив номеров / 2004 / Выпуск №9 (22) / Особенности запуска внешних команд из ASP-страниц

Рубрика: Программирование /  Веб-программирование

Иван Коробко ИВАН КОРОБКО

Особенности запуска внешних команд
из 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

Рисунок 1

Пусть IIS имеет настройки по умолчанию. В этом случае при загрузке любой ASP-страницы она стартует от имени встроенного пользователя (см. рис. 2). Если страница работает с некими базами данных, например с Active Directory, то пользователь, запускающий данную страницу должен обладать правами администратора. Существует несколько способов выполнить эти условия. Первый – вместо учетной записи встроенного пользователя прописать имя учетной записи администратора сети. При таком раскладе любой пользователь в сети сможет посетить данную страницу, т.к. она будет запускаться от имени системного администратора. Этот способ предоставляет всем доступ к данной странице, что, согласитесь, неправильно. Это еще полбеды. Главное, что таким образом резко снижается безопасность всей системы. В случае ошибок на странице злоумышленник запросто запустит вредоносный код с правами администратора. Поэтому предлагается другой способ решения проблемы, с помощью которого можно ограничить доступ к ресурсам. В настройках IIS необходимо сбросить флажок (см. рис. 2) с Enable anonymous access и установить его напротив Basic Authentication. Также следует изменить права на файловую структуру используемого сайта, исключив оттуда группу Everyone и добавив соответствующую группу безопасности. При такой настройке IIS только системные администраторы получат доступ к данной странице. При попытке любого пользователя, не являющегося администратором сети, получить доступ к странице IIS будут запрошены имя и пароль пользователя.

Рисунок 2

Рисунок 2

Если необходимо расширить круг лиц, которым должен быть доступен данный сайт, и при этом пользователи не являются системными администраторами, то можно воспользоваться вариантом, являющимся синтезом двух ранее изложенных решений: ограничить доступ на сайт с помощью Basic Authentication и правами на файловую структуру, запускать скрипт, инкапсулированный в страницу с правами администратора.

Только что мы рассмотрели механизм взаимодействия первого и второго звена в трехзвенной системе. Первым звеном является рабочая станция пользователя, вторым – сервер, на котором установлен IIS. Взаимосвязь этих звеньев осуществляется с помощью одного пользователя. Между вторым и третьим звеном (сервер IIS, процессы, порождаемые из ASP) взаимодействие осуществляется с помощью другого пользователя. Рассмотрим взаимодействие второго и третьего звена подробнее.

При запуске из кода ASP-страницы какого-либо приложения осуществляется взаимодействие между вторым и третьим звеном. IIS порождает процесс, запускаемый от имени другого встроенного пользователя. Поскольку ASP-страница выполняется на сервере, то для запуска приложения необходимы соответствующие права. Управление этой учетной записью пользователя осуществляется в Application Tools (см. рис. 3).

Рисунок 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

Рисунок 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-страниц.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru