Что такое код asp movehere

Содержание

Парсинг ссылок с сайта, и добавление их в ArrayList

но почему-то не работает.
кто нибудь может подсказать, как это сделать?
заранее спасибо!

UPD: да, забыл сказать, каждый день количество ссылок вначале страницы меняется, так что вручную их удалить не вариант.

09.03.2013, 20:16

Парсинг ссылок с сайта
Собственно как зайти на данный сайт программно? https://csgojackpot.com/ А потом спарсить в.

Парсинг ссылок сайта
есть парсер для сайта который берет вакансии с сайта http://www.work.ua/jobs/?category=1 каким.

Парсинг ссылок сайта
Здравствуйте. Хочу получить из страницы сайта все ссылки на его новости (их 10 штук). Пишу такой.

Вывод структуры сайта. Парсинг ссылок
Доброго времени суток, уважаемые программисты. ———- Я столкнулся с такой проблемой.

Добавление ссылок на картинки без ссылок
Здравствуйте. На форуме вставляются картинки любого размера, и что бы они не растягивались за.

Почему ASP.NET не используют в крупных компаниях?

В настоящий момент С# (asp.net) имеет целый ряд преимуществ над тем, что нам дает Java (в плане удобства и синтаксиса языка). Это правда!

Проблема заключается в том, что Java появился раньше, Java был открытым для использования на Linux. В итоге под сервера на Java написали огромный список уникальных решений, которые сейчас используют топовые команды (посмотри, что такое хадуп, например). В итоге, компании либо не видели смысла переписывать все на C#, так как уже имели билды на Java, либо не хотели тратить время на разработку того, что уже есть на Java.

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

Что такое код asp movehere

Этот текст предназначен для тех, кто никогда не имел дела с ASP и вообще смутно себе представляет возможности программирования на стороне сервера. Я ставил себе задачу создать у читателя общее представление о предмете. Отдельные неточности при этом менее важны — пожалуйста, громко не ругайтесь.

Общие сведения

ASP (Active Server Pages) – это мощная технология от Microsoft, позволяющая легко разрабатывать приложения для WWW. ASP работает на платформе Windows NT и IIS (Internet Information Server), начиная с версии 3, хотя вроде есть реализации на других платформах. ASP – это не язык программирования, это внутренняя технология, позволяющая подключать программы к Web-страницам. Основа успеха ASP – простой скриптовый язык (Visual Basic Script или Java Script) и возможность использования внешних COM-компонент.

Как это все происходит?

Вы пишете программу и складываете в файл на сервере. Браузер клиента запрашивает файл. Файл сначала интерпретируется сервером, на выходе производится HTML-код. Этот HTML посылается клиенту. Файлы с программами имеют расширение .asp. Файлы asp – это обычные текстовые файлы, содержащие исходные тексты программ. Файлы делаются с помощью любого текстового редактора. Каталог, в котором размещены файлы asp должен иметь права на выполнение, так как сервер исполняет эти файлы, когда браузер их запрашивает. Собственно программы пишутся на любом скриптовом языке, который установлен в системе. По умолчанию поддерживаются VBScript и JavaScript. Можно доустановить другие (например, Perl). Если ничего специально не указывать используется VBScript. В дальнейшем будем ссылаться только на него. Программные фрагменты заключаются в скобки . Можно ставить открывающую скобку в начале файла, закрывающую – в конце, все что между ними – программа на Visual Basic’е.

Какие средства есть для программирования?

Web – нормальная среда программирования, если правильно понять, что есть что. В VBScript есть все нормальные конструкции структурного программирования (if, while, case, etc). Есть переменные (описывать не обязательно, тип явно не задается). Поддерживаются объекты. Работа с ними обычная – Object.Property, Object.Method. Есть ряд встроенных объектов (Request, Response, Session, Server, Connection, Recordset). Можно доустанавливать другие компоненты (скачивать, покупать, программировать), например для работы с электронной почтой.

Вывод

Понятия «экран», куда можно выводить данные нет. Все, что надо показать пользователю, выбрасывается в выходной поток на языке HTML. Браузер пользователя интерпретирует этот HTML. Для упрощения вывода существует объект Response . Вывод осуществляется с помощью метода Write .

Так производится запись во внутренний буфер объекта Response. Когда скрипт заканчивает работу, весь буфер выдается клиенту. Надо заметить, что клиент получает «чистый» HTML, таким образом программы на ASP не зависят от клиентского ПО, что очень важно. Если внутри выводимой строки нужно использовать кавычку, кавычка удваивается. Другие методы и свойства Response позволяют управлять выводом. Так Response.Buffer регулирует, получает ли клиент данные по мере из записи в Response, или все сразу по завершении исполнения страницы. Метод Response.Redirect перенаправляет браузер на другую страницу. Чтобы им пользоваться, нельзя до него на странице использовать Response.Write.

Программа на ASP не может явно спросить пользователя о чем-то. Она получает данные из других страниц, либо через URL. Передаваемые параметры помещаются во входной поток и доступны через объект Request . Чтобы передать переменную var в программу test.asp , надо написать:

Чтобы из программы получить значение этой переменной, надо написать:

Несколько переменных разделяется знаком &:

Кроме того, чтобы задавать параметры в URL, можно воспользоваться формами HTML. В вызывающей странице пишем так:

Так это выглядит:

При этом пользователь увидит форму из одного поля ввода (var1), в нем будет значение по умолчанию «default». Второе поле (var2) будет невидимо и будет передавать всегда фиксированное значение «var2value». Кнопка «Submit Form» завершает заполнение формы и передает все переменные на test.asp (action). Если method=»get», переменные передаются через URL (test.asp?var1=default&var2=var2value). Если method=»post», передаются вместе с запросом так, что внешне передача переменных не заметна. В вызываемой программе безразлично, какой метод изпользовался (почти). Если у вас нет специальных аргументов за метод GET, используйте метод POST.

Формы

Формы HTML используются для организации диалога с пользователем. Поддерживаются стандартные элементы управления. Все многообразие задается немногими тэгами:

  • INPUT (с параметром TYPE=)
  • SELECT
  • TEXTAREA

Описание – в документации по HTML.

Взаимосвязь между отдельными страницами

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

Один из методов решения этой проблемы — cookies . Пользователю при первом обращении выдается специальный идентификатор, после этого браузер пользователя предъявляет этот идентификатор при каждом обращении, и сервер может распознать, что это тот же самый пользователь. Пользователь может отключить cookies, в этом случае этот метод не работает.

ASP, используя cookies, предоставляет программисту более простое средство — объект Session (сессия). Сессия стартует, когда новый пользователь обращается к любому asp-файлу приложения. Сессия заканчивается при отсутствии активности пользователя в течение 20 минут, либо по явной команде. Специальный объект Session хранит состояние сессии. Туда можно записывать переменные, которые доступны из любой страницы в этой сессии. Записать данные в этот объект можно просто:

Считать потом еще проще:

Сессия, таким образом, – это еще один метод передачи данных между страницами. Одна страница пишет данные в сессию, другая – берет потом оттуда.

Наряду с объектом Session существует объект Application . Если сессия создается для каждого нового пользователя, до Application существует в единственном экземпляре, и может использоваться всеми страницами приложения.

Управление приложением

Программисту предоставляется возможность реагировать на 4 события: старт/стоп приложения и старт/стоп каждой сессии. Для реализации этих событий предназначен файл global.asa , который должен располагаться в корневом каталоге приложения. Вот его примерный скелет:

Нужно «просто» вписать Ваш код на соответствующее место. Нужно заметить, что отлаживать код для global.asa довольно непросто, так как он выполняется при очень специфических обстоятельствах (к примеру при старте или остановке сервера).

Использование внешних компонент

Если на сервере установлены дополнительные компоненты, их можно использовать из ASP. Стандартные объекты (например из библиотек ADO (Connection и Recordset) и Scripting (Dictionary, FileSystemObject)) доступны всегда. Установка новой компоненты обычно состоит в копировании dll-файла в каталог на сервере и ее регистрации с помощью программы regsvr32.exe. [В COM+ используется своя процедура инсталляции объектов, это однако не влияет на использования объектов.]

Создать экземпляр объекта можно так:

Class.Object указываются в документации на компоненту. В переменной var запоминается ссылка на созданный экземпляр объекта. Когда объект не нужен, ссылку нужно обнулить с помощью команды:

Пожалуйста всегда обнуляйте все ссылки на объекты, когда они больше не нужны. Теоретически это должно происходить автоматически при завершении процедуры/страницы, однако в стандартной сборке мусора есть определенные «проблемы».

В остальном использование компоненты зависит от самой этой компоненты.

Работа с базами данных

Из ASP можно легко и просто работать с любыми базами данных. Это делается через две промежуточные технологии: ODBC и ADO.

ODBC позволяет организовать доступ к любым базам данных через унифицированный интерфейс с помощью языка SQL. Специфика конкретных СУБД учитывается при помощи специальных драйверов БД. Такие драйверы существуют для всевозможных СУБД (в частности SQL Server, Oracle, Access, FoxPro). Поддержка ODBC обеспечивается на уровне операционной системы Windows (NT). Настройка – через Control Panel/ODBC. Базовым понятием является источник данных или data source. Источник данных – это совокупность сведений о базе данных, включая ее драйвер, имя компьютера и файла, параметры. Чтобы пользоваться базой надо создать источник данных для нее. Важно, чтобы источник данных был «системным», в отличии от «пользовательского». После этого надо лишь знать имя источника данных. [В настоящее время ODBC отступает перед натиском технологии OLE DB. На практике это однако практически ничего не изменяет. Вместо имени источника данных нужно использовать Connection String, в которой указывается имя ODBC-драйвера и все его параметры.]

ADO – это совокупность объектов, доступных из ASP, позволяющих обращаться к источнику данных ODBC [или OLE DB]. Фактически нужны лишь 2 объекта – Connection , представляющий соединение с базой данных и Recordset , представляющий набор записей, полученный от источника. Сначала необходимо открыть соединение, потом к нему привязать Recordset, потом, пользуясь методами Recordset’а, обрабатывать данные. Вот пример:

Если команда SQL не возвращает данных, recordset не нужен, надо пользоваться методом Conn. Execute (SQL_COMMAND).

Если Вы хотите вызывать хранимые процедуры сервера БД с параметрами, нужно воспользоваться объектом Command , который в свою очеред содержит объекты Parameter .

Методики программирования, советы


Описание переменных

VBScript — очень нетребовательный к программисту язык. Так он не требует описывать переменные и не содержит явных типов данных. Все переменные принадлежат одному типу Variant . Из-за отсутствия описаний могут произойти очень трудно обнаруживаемые ошибки. Одна опечатка может стоить полдня поисков.

Однако, есть возможность явно потребовать описания переменных. Для этого первой строкой в ASP-файле нужно написать Option Explicit . После этого обращение к переменной, которая не была объявлена с помощью Dim , вызывает ошибку с указанием номера строки.

Кстати, где расположены описания Dim в процедуре — совершенно не важно. Они могут стоять как до использования переменной, так и после, и даже в цикле. Видимо они отрабатываются препроцессором. Явно задать тип переменной с помощью Dim Var as Typ , как в Visual Basic, все равно нельзя.

Чередование ASP/HTML

Если нужно выдать большой кусок HTML, можно не пользоваться Response.Write. Если в asp-файле встречается кусок текста вне скобок , он трактуется просто как HTML, который надо вывести. Пример:

Обработка ошибок

Для отслеживания ошибок используется специальный объект Err . Он устанавливается в ненулевое значение, если предыдущая команда породила ошибку. Ее можно проверять с помощью If, и таким образом реагировать на ошибки. Чтобы из-за ошибки не прерывалось выполнение программы, в начале нужно включить команду

Включение других файлов

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

Важно: все includes в тексте отрабатываются до исполнения файла. Т.е. даже если include стоит внутри if, то сначала будут включены все includes во всех ветках, и только потом, во время исполнения, будет принятно решение, какую ветку выполнять. Т.е. следующий код не дает условного включения файлов:

Обработка форм

Если надо что-то спросить у пользователя и на основании этого что-то сделать, в простейшем случае создается два файла: один с формой, второй – с ее обработчиком. Обработчик выполняет все действия. Пример:

Рекурсивная обработка форм

Удобный метод состоит в том, чтобы сбор данных и обработку осуществлял один и тот же файл. Для этого пишется asp, в котором есть разные разделы. Специальная переменная отвечает за выбор раздела при запуске. Пример:

Переменные HTTP

Запрос от браузера, кроме запрашиваемой страницы несет еще некоторые данные. Эти данные, например, IP-адрес клиента, доступны через специальные переменные объекта Request. IP-адрес – Request(«REMOTE_ADDR»). Другие — см.документацию (ASPSamp\Samples\srvvar.asp).

Переадресация

Очень легко написать на ASP скрипт, который будет производить некоторые расчеты, и в зависимости от результатов переадресовывать браузер на разные URL (например, подставлять нужный баннер). Делается это так:

Только надо следить, чтобы до выполнения команды redirect ничего не было записано в Response (даже коментарии HTML).

Электронная почта

Одна из часто встречающихся задач – отправить электронную почту с Web-страницы. На первый взгляд, можно просто написать

Но это приводит к тому, что при отправке формы делается попытка на клиентской машине запустить почтовую программу и создать новое сообщение с данными формы. Если это не получается (почтовая программа не настроена, пользователь не отправил почту, и т.д.) — письмо и не будет отправлено. Гораздо надежнее работает серверное решение.

Для этого существуют внешние компоненты, есть и бесплатные. Например, компонента Jmail от Dimac. Все, что для нее нужно – это адрес SMTP-сервера. Вот пример ее использования:

Что такое код asp movehere

все.. я разобрался.. надо так делать

Cont := GetObject(‘LDAP://CN=Users,DC=dom,DC=local’) as IADsContainer;
Usr := Cont.MoveHere(‘LDAP://CN=Администратор Сайта,CN=Users,DC=dom,DC=local’, ‘CN=Администратор Сайта 1’) as IADsUser;

  • Помечено в качестве ответа Vasily Gusev Moderator 14 октября 2009 г. 9:16

Все ответы

set cont = GetObject(«LDAP://dc=dom,dc=com»)
set newobj = cont.MoveHere(«LDAP://cn=Jeff Smith,dc=dom,dc=com», «cn=Denise Smith»)

PS Вот такой скрипт работает

  • Помечено в качестве ответа Vasily Gusev Moderator 14 октября 2009 г. 9:16

а что потом нужно делать с newobj?

и тип для cont должен быть IADsContainer?

и какого типа должен быть newobj?

Хотя и пишу скрипты, но не являюсь специалистом в программировании. Знаю ответ только на второй вопрос — да, это IADsContainer. Посмотрите статью по применению данного метода:

вот так переименовывает нормально, но переносит запись из Users в корневую папку.. а если писать так

то выдает ошибку «Произошло нарушение именования»

как правильно переименовать, чтоб запись осталась в том же OU, в котором и была?

все.. я разобрался.. надо так делать

Cont := GetObject(‘LDAP://CN=Users,DC=dom,DC=local’) as IADsContainer;
Usr := Cont.MoveHere(‘LDAP://CN=Администратор Сайта,CN=Users,DC=dom,DC=local’, ‘CN=Администратор Сайта 1’) as IADsUser;

  • Помечено в качестве ответа Vasily Gusev Moderator 14 октября 2009 г. 9:16

У меня похожая проблема. надо переименовать пользователя ( поле fullname в AD), скрипт VBS .
Скрипт переименовывает и поле display name, в соответствии с форматом «Фамилия имя».

Set oTargetOU = GetObject(«LDAP://»&strTargetOU) //- strTargetOu берет данные из командной строки
oTargetOU.Filter = Array(«user»)

For each usr in oTargetOU
if instr(usr.SamAccountName, «$») = 0 then
if instr(usr.displayName, «,») = 0 then
vTempName = usr.get(«displayName»)
astrWords = split(vTempName)
CountWords = UBound(astrWords) — LBound(astrWords) +1
if CountWords = 2 then
vFirst = astrWords(0)
vLast = astrWords(1)
vFullname = vLast + » » + vFirst
usr.put «Sn», vLast
usr.put «GivenName», vFirst
end if
if CountWords = 3 then
vFirst = astrWords(0)
vM > vLast = astrWords(2)
vFullname = vLast + » » + vFirst + » » + vMiddle
usr.get(«displayName»)
usr.put «Sn», vLast
usr.put «GivenName», vFirst
usr.put «middleName», vMiddle
usr.put «cn», vFullName // вот с этим проблемы — Служба каталогов не может выполнить операцию на RDN-атрибуте объекта
end if
usr.put «displayName», vFullName
usr.setinfo
wscript.echo vFullName
end if
end if
—————————————————————————

Без попытки переименовать cn все работает.
Если писать как в примере

, подставляя свои cn=full name пользователя, ou, dc , потом cn=»правильное имя пользователя»,
тоже работает, только один раз.

и не получается написать так, чтобы cn пользователя изменялось, выбираясь из всех пользователей, находящихся в OU и заменялось их же displayname . Какие только переменные не подставляю :

Если кому-то не сложно, подскажите пожалуйста, как еще можно решить эту проблему ?

Сценарии для Active Directory. Часть 2

Еще два интерфейса Active Directory Scripting Interfaces, которые необходимо знать специалистам по AD.

В первой части статьи я рассказал о том, что при создании сценария для Active Directory (AD) для выполнения 80% задач из более 50 программных интерфейсов Active Directory Scripting Interfaces (ADSI) необходимо использовать только 3. В частности, рассматривался один из трех основных интерфейсов IADsOpenDSObject. Напомню, что интерфейс IADsOpenDSObject содержит метод OpenDSObject, который применяется для аутентификации при соединении с AD. В первой части также была описана терминология AD, ADSI и составных имен (DN). Во второй части я расскажу о двух оставшихся интерфейсах — IADs и IADsContainer.

Ключи к сценарию

Прежде чем подробно рассматривать интерфейсы IADs и IADsContainer, надо сказать несколько слов о той роли, которую они играют. Даже простые задачи при написании сценариев ADSI невозможно решить без использования хотя бы одного из этих интерфейсов. Свойства и методы, которые обеспечивают IADs и IADsContainer, используются для создания, удаления и изменения почти каждого объекта AD. Поэтому тем, кто хочет заниматься написанием ADSI-сценариев, рекомендую запомнить эти два интерфейса. Они включают только полдюжины свойств интерфейсов и с десяток методов, поэтому задача не так сложна, как может показаться на первый взгляд.

Интерфейс IADs

Интерфейс IADs реализуется всеми объектами AD одинаково. Он содержит шесть свойств и семь методов. Шесть свойств IADs, которые перечислены в Таблице 1, дают нам важную информацию об объекте.

Рассмотрим несколько сценариев, в которых будут использоваться свойства IADs. Допустим, требуется использовать ADSI-поставщика OLEDB/ADO и запрос к AD, а затем модифицировать объекты, возвращенные в результатах запроса. Однако записи набора, который возвращает ADSI-поставщик OLEDB/ADO, являются записями только для чтения, поэтому необходимо осуществлять привязку к каждому объекту из результатов запроса, чтобы иметь возможность модифицировать данный объект. Чтобы это сделать, необходимо иметь действительный ADsPath для выполнения операции связывания. Так как каждый объект предоставляет свой ADsPath через интерфейс IADs, можно идентифицировать ADsPath как одно из значений, возвращаемых в результатах запроса. Такой метод рекомендуется применять всякий раз при запросе AD.

Можно использовать свойство Class для определения схемы класса объекта (например, компьютер, организационная единица (OU), группа, пользователь), которая применяется для операций фильтрации. Допустим, при обработке списка вложенных групп можно использовать свойство Class внутри цикла, чтобы отследить момент, когда вместо группы появляется пользователь, и соответственно отреагировать.

Глобальный уникальный идентификатор (GUID) — это единственное свойство объекта, которое никогда не изменяется. Свойство GUID используется для привязки к объекту способом, который не зависит от его перемещения и переименования. Свойство Name — это относительное составное имя (RDN); оно представляет собой первичное имя объекта и уникально идентифицирует объект в текущем контейнере. Можно использовать свойства Parent вместе со свойствами ADsPath и Schema, работая с двоичным информационным деревом Directory Information Tree (DIT).

Листинг 1. Свойства схемы через IADs.

Свойство Schema нужно применять для создания ссылки на схему класса объекта для определения обязательных и дополнительных свойств этого объекта, как показано в Листинге 1. После связывания с целевым объектом я вывожу значения шести свойств IADs (см. Листинг 1, метка A). Меткой B в Листинге 1 я пометил путь, с помощью которого свойство Schema объекта обеспечивает связывание с классом схемы объекта. В ответ я получил ссылку на описание пользовательского класса схемы, базирующегося на типе объекта, который отражен в первой строке Листинга 1. Получив ссылку, я отразил содержимое атрибутов must-Contain и mayContain пользовательского класса. На Экране 1 показана часть результатов исполнения Листинга 1.

Экран 1. Частичный вывод на консоль из Листинга 1.

Семь методов IADs, показанных в Таблице 2, обеспечивают механизмы, которые используются для добавления, изменения и удаления данных объекта. Хотя методы IADs просты в применении, некоторые сценарии бывают весьма коварны. Но прежде, чем я расскажу о них, необходимо понять, что такое кэш свойств ADSI.

Кэш свойств ADSI — это локальный буфер памяти, который временно хранит значения атрибутов, пока сценарий их создает, модифицирует или читает. Кэш позволяет уменьшить число запросов к сети, поступающих при управлении большим числом объектов и атрибутов. Кэш объединяет многочисленные операции чтения и записи в одну или несколько сетевых транзакций, выполняющих эту задачу. Такой процесс обеспечивает исполнение большинства операций чтения и записи в сценарии на рабочей станции клиента (компьютере, на котором запущен сценарий).

Кэш свойств является адресным пространством объекта, которое ADSI выделяет в тот момент, когда происходит связывание с объектом. Однако сначала кэш пуст. Методы IADs используются для инициализации и взаимодействия со значениями в локальном кэше свойств и нижележащей базой каталога, как показано на Рисунке 1.

Из семи методов IADs только GetInfo, GetInfoEx и SetInfo непосредственно взаимодействуют с базовым каталогом. Get, GetEx, Put и PutEx взаимодействуют только со значениями в кэше свойств, с одним исключением, о котором чуть позже. Процесс, используемый в работе с данными объекта и кэшем свойств, зависит от конкретной задачи. Например, при создании объекта и инициализации его свойств необходимо использовать следующие методы и функции.

  1. Функцию GetObject VBScript — для связывания с целевым контейнером, который будет содержать новый объект (сетевой трафик).
  2. Метод Create IADsContainer — для создания нового объекта в локальном кэше свойств (нет сетевого трафика).
  3. Метод Put или PutEx IADs или оба вместе — для установки новых обязательных и дополнительных свойств объекта в локальном кэше свойств (нет сетевого трафика).
  4. Метод IADs SetInfo — для фиксации (записи) нового объекта или соответствующих свойств в кэше свойств в базе службы каталога (сетевой трафик).

При чтении или модификации существующих свойств объекта требуется выполнить следующие шесть шагов.

  1. Использовать функцию GetObject VBScript для связывания с целевым объектом (сетевой трафик).
  2. Использовать методы GetInfo или GetInfoEx IADs для извлечения свойств объекта из базы службы каталога, чтобы наполнить (инициализировать) локальный кэш свойств (сетевой трафик).
  3. Использовать методы Get или GetEx IADs или оба вместе для чтения свойств в локальном кэше свойств (нет сетевого трафика).
  4. Использовать методы Put или Put-Ex IADs или оба вместе для модификации свойств в локальном кэше свойств (нет сетевого трафика).
  5. Использовать метод IADs SetInfo для фиксации (записи) модифицированных свойств в кэше свойств в базе службы каталога (сетевой трафик).
  6. Использовать методы GetInfo или GetInfoEx IADs для реинициализации локального кэша свойств, чтобы отразить изменения, которые были сделаны на пятом шаге (сетевой трафик).

Теперь применим приобретенные знания для изменения версии сценария easyadsi.vbs, о котором шла речь в первой части статьи. Я использую код Листинга 2 как основу для дальнейшего обсуждения. Мы не будем проходить по сценарию построчно. Я объясню каждый метод IADs, затем приведу пример метода в Листинге 2. Однако я не показываю все доступные методы IADs, поскольку Листинг 2 можно использовать на практике, а некоторые методы IADs применяются редко.

GetInfo. Метод GetInfo извлекает свойства объекта из AD и загружает значения свойства в локальный кэш свойств, инициализируя его. Метод GetInfo загружает в кэш только те свойства, которые содержат значения.

В Листинге 2 метод GetInfo не используется по двум причинам. Во-первых, я создал новый объект пользователя (см. Листинг 2, метка А), поэтому не могу вызвать GetInfo для объекта, которого еще не существует. И хотя я обновил несколько свойств в метке B Листинга 2, я не затрагивал предыдущие значения свойств. Не нужно инициализировать кэш с существующими значениями, если планируется перезаписать значения (если только не требуется по какой-либо причине сохранить старые значения, к примеру, для фиксации изменений в управлении).

Использовать GetInfo в Листинге 2 нужно только в том случае, если требуется проверить новые значения, установленные в метке B. Чтобы это сделать, нужно вызвать GetInfo после вызова SetInfo и обновить значения в кэше. Если вызвать GetInfo перед SetInfo (и после Put-предложений), GetInfo перезапишет кэшированные значения (которые использовали Put и PutEx для модификации) оригинальными или старыми значениями из базы каталога, и изменения не сохранятся.

Хотя использование GetInfo — неплохой метод обновления кэша, он не считается самым эффективным. Например, я обновил три свойства в метке B Листинга 2. Вызов GetInfo после метки B извлекает все значения для более 50 свойств в метке A Листинга 2. Вместо GetInfo лучше применить GetInfoEx.

GetInfoEx. Метод GetInfoEx также инициализирует локальный кэш свойств, извлекая свойства объекта из AD и загружая значения свойства в кэш. Однако GetInfoEx загружает только свойства, перечисленные в массиве свойств, который является первым параметром GetInfoEx. Следовательно, метод GetInfoEx более эффективен для восстановления обновленных значений. Однако, как и в случае с GetInfo, перед вызовом GetInfoEx с именем обновленного свойства следует вызывать SetInfo.

Для проверки существующего значения метод GetInfoEx также более эффективен. Например, если нужно проверить значение одного свойства в AD, лучше использовать GetInfoEx. Вместо того чтобы выполнять явный вызов GetInfo или использовать Get для неявного вызова GetInfo, следует передать GetInfoEx массив, содержащий один элемент, который идентифицирует подлежащее проверке свойство.

Еще одна ситуация, в которой требуется GetInfoEx, связана с тем, что вызовы ADSI не загружают рабочие атрибуты (например, стандартное canonicalName) в кэш. Необходимо использовать GetInfoEx в запросе рабочего атрибута перед его прочтением, как, например, в коде, показанном на Рисунке 2. В противном случае система выдает сообщение об ошибке: «The Active Directory property cannot be found in the cache.»

Рисунок 2. Кэш свойств ADSI.

Get и GetEx. Get и GetEx обеспечивают похожие функции, так как оба считывают заданные значения из локального кэша свойств. Эти методы также запускают неявный вызов GetInfo, когда кэш свойств не инициализирован. Следовательно, GetInfoEx можно использовать для уменьшения сетевого трафика, если нужно только извлекать подмножества значений. После того как кэш свойств инициализирован явным или неявным образом, использовать Get или GetEx для обновления кэша нельзя.

Get возвращает однозначные свойства как скалярные переменные и многозначные свойства как переменные массивы. Метод GetEx возвращает все значения свойств как переменные массивы, поэтому он возвращает однозначное свойство в одноэлементном массиве.

Метод Get более эффективен в том случае, если известно, какое из двух целевых свойств является однозначным или многозначным. Однако Get может подвести, когда значение неизвестно, а кроме того, придется проверить тип результата Get и убедиться, что тип данных определен правильно. В противном случае сценарий будет выдавать ошибку при исполнении, если оперировать скаляром как массивом или наоборот. Еще больше запутывает дело то, что Get возвращает многозначный атрибут, содержащий единственное значение, как скалярную переменную, а не как одноэлементный массив. Метод GetEx использовать немного проще, поскольку можно применить один и тот же принцип для работы с любыми данными свойства. Тип результата проверять не нужно, так как GetEx возвращает все данные в массиве.

Код в Листинге 2 не вызывает Get или GetEx потому, что в возможностях этих методов нет необходимости в силу особенностей сценария, и сам сценарий не производит вывод на консоль или в файл. Если мне нужно отобразить значения свойства, я должен вставить соответствующее предложение вывода, придерживающееся такого же синтаксиса «объект.метод_свойства» (object.propertymet-hod), который использовался для установки значений свойства в метке A Листинга 2. Код на Рисунке 2 представляет собой пример синтаксиса object.propertymethod, который используется совместно с предложением Wscript.Echo.

Put и PutEx. Метод Put применяется для записи однозначных свойств в кэш свойств, а PutEx — для добавления, модификации, замены и очищения многозначных свойств в кэше свойств. Put и PutEx записывают и модифицируют значения только в кэше свойств. Для записи изменений из кэша в AD необходимо ввести SetInfo. Хотя Put можно использовать для модификации многозначных свойств, этот метод не позволяет управлять свойствами имеющихся данных. Put будет вслепую заменять все существующие многозначные данные так же, как он заменял однозначные свойства. Используйте метод PutEx в ситуациях, когда необходимо сохранить существующие данные в многозначном свойстве.

Как показано в Таблице 2, PutEx использует управляющий код для передачи типа выполняемого обновления. По ADS_PROPERTY_APPEND добавляется новое значение в то время, как существующие значения сохра-няются. ADS_PROPERTY_DELETE удаляет определенное значение и оставляет другие значения нетронутыми. Подобно Put, ADS_PROPERTY_UPDATE заменяет все существующие значения новыми, а ADS_PROPERTY_CLEAR удаляет все значения, очищая свойство.

Метка B Листинга 2 указывает на пример использования Put и PutEx. В случае с PutEx я добавил новое значение атрибуту otherHomePhone (замечу, что управлять порядком величин в многозначных свойствах нельзя).

SetInfo. Метод SetInfo записывает новые или модифицирует существующие значения свойства из кэша в AD. Метод SetInfo всегда вызывается явно; когда кэш свойств не инициализирован, SetInfo никогда не активизируется неявным образом, как это происходит в случае с Get или GetEx, вызывающими GetInfo. Любые изменения значений свойства, сделанные Put или PutEx, теряются при вызове GetInfo или, может быть, перед вызовом SetInfo. Можно использовать один вызов SetInfo для внесения целого ряда изменений, но необходимо понимать, что SetInfo — это бескомпромиссная операция типа «все или ничего». Т. е. SetInfo записывает все изменения, сделанные до вызова SetInfo, в базу каталога или не вносит изменений, если происходит ошибка (например, при нарушении требований системы безопасности).

Синтаксические соглашения object.pro-pertymethod. Синтаксис object.propertymethod — это соглашение, которое OLE-клиенты могут использовать вместо Get или Put. Синтаксис позволяет программистам на Visual Basic (VB) и VBScript использовать привычную нотацию dotMethodOrPro-pertyName. Синтаксис состоит из двух частей, отделенных точкой (.). Имя слева от точки является объектной ссылкой; имя справа от нее — это отображаемое имя атрибута, извлекаемого или записываемого в кэш, написанное по правилам Lightweight Directory Access Protocol (LDAP). Использование синтаксиса object.propertymethod в правой части оператора присваивания или выражении эквивалентно Get. Использование этого синтаксиса в левой стороне оператора присваивания эквивалентно Put. Требования к поведению синтаксиса object.propertymethod — те же самые, что и к Get и Put (т. е. те же типы возвращаемых Get результатов и ограничения на Put при обновлении многозначных свойств).

Я использовал object синтаксис .propertymethod в метке A Листинга 2 для установки исходных значений как для однозначных, так и многозначных свойств. В метке B Листинга 2 я задействовал Put и PutEx, поскольку обновил многозначное свойство под именем otherHomePhone.

Интерфейс IADsContainer

Интерфейс IADsContainer служит для управления жизненным циклом объектов AD. Контейнерные объекты создают иерархию и образуют организацию DIT. Каждый контейнерный объект в AD реализует IADs Container. IADsContainer имеет четыре свойства, которые перечислены в Таблице 3, и пять методов, указанных в Таблице 4.

Из четырех свойств IADsContainer два доступны через провайдера LDAP. Тем не менее можно использовать непосредственно и VBScript, вызвав только одно свойство: Filter. Имя говорит само за себя, свойство Filter позволяет применять фильтр к контейнеру и выбирать отдельные типы объекта. Например, при привязке к OU, когда нужно выбрать только группу объектов, входящих в OU, к OU применяется Group Filter, как показано на Рисунке 3.

Можно добавить в массив другие типы объектов, проводя фильтрацию по различным типам объектов. Например, Array («Group», «Computer») перечисляет все объекты типа Group и Computer. Кроме того, можно еще раз применить фильтр с другими типами объектов и получить совершенно другой перечень. Однако если используется свойство Filter для фильтрации объектов User, то в перечне появятся как объект User, так и Computer, потому что Computer является дочерним по отношению к User в иерархии классов AD. Чтобы избежать такой ситуации, можно применить фильтр для объектов Computer, запомнив список только объектов Computer. Далее создается второй список для фильтра по User, сравниваются два списка, и из списка пользователей удаляются позиции из списка компьютеров. Или же можно полностью заменить фильтр запросом ADO.

Другое свойство IADsContainer, применяемое к провайдеру LDAP, называется NewEnum. Однако непосредственно NewEnum не вызывается; предложение For Each из VBScript осуществляет просмотр контейнера и неявным образом вызывает NewEnum, как показано на Рисунке 3.

Из пяти методов IADsContainer к методам Create, Delete, GetObject и MoveHere нельзя получить доступ с помощью провайдера LDAP. Вместе все четыре метода обеспечивают первичные механизмы управления жизненным циклом объектов AD.

Create. Метод Create применяется для создания новых объектов AD (например, User, OU, Group, Com-puter, Site). Код, показанный меткой A в Листинге 2, осуществляет привязку к соответствующему контейнеру и вызывает Create для создания нового объекта. Некоторых общих ошибок при использовании метода Create можно избежать, если не пропускать установку новых обязательных свойств объекта перед вызовом SetInfo или не забывать указывать «key=» как часть относительного имени RDN объекта. Можно использовать сценарий, подобный приведенному в Листинге 1, для определения обязательных (must-Containe) и дополнительных (may-Containe) свойств объекта.

Система сама присваивает значения большинству обязательных свойств (например, objectClass, objectCategory, objectSid, ntSecurityDescriptor, instanceType). Из семи обязательных свойств пользователя, которые показаны на Экране 1, приходится иметь дело только с cn и sAMAccountName. Установка свойства cn происходит как часть вызова метода Create, а Put используется для установки sAMAc-countName. Обычно обязательные свойства, которые обрабатывает система, не инициализируются.

Delete. Метод Delete несложен (см Листинг 2 метка D). Сначала происходит привязка к родительскому контейнеру объекта, который нужно удалить. Далее вызывается метод Delete контейнера и идентифицируется целевой дочерний объект для удаления. Как и в случае с методом Create, требуется указание соответствующего «key=», как части имени RDN целевого объекта.

Удаление объекта — действие необратимое. Но Delete не может удалить контейнеры, в которых хранятся объекты. Сначала необходимо рекурсивно удалить все дочерние объекты, затем, если требуется использовать метод Delete для удаления целого сегмента дерева каталога, также рекурсивно удалить вложенные контейнерные объекты. Если очевидно, что нужно отрезать целую ветвь дерева каталога, используется метод DeleteObject, предоставляемый интерфейсом IADs-De-leteOps, который обеспечивает удаление контейнера и всех его объектов.

GetObject. Метод GetObject из IADs-Container подобен функции GetObject из VBScript тем, что GetObject из IADs-Container создает ссылку на объект программирования ADSI. Различие между ними заключается в том, что метод GetObject из IADsContainer позволяет привязываться только к дочерним объектам в контейнере ADSI. Это объясняет, почему сигнатуры методов (т. е. списки параметров) двух методов с одним и тем же названием различны. Функции GetObject из VBScript предоставляется ADsPath, в то время как методу GetObject из IADsContainer требуется имя класса и RDN целевого объекта в текущем контейнере. Последний метод обеспечивает легкость просмотра контейнера и привязки к каждому дочернему объекту из списка.

MoveHere. MoveHere используется для переноса объекта из одного контейнера в другой, что происходит при перемещении между доменами или переименовании объекта. Из рассматриваемых четырех методов пользователи чаще всего совершают ошибки с MoveHere. Ошибкой является непонимание того, что MoveHere — это механизм, который используется для переименования объектов AD. Нельзя изменить обязательное свойство cn объекта или эквивалентное ему (например, ou в случае OU), чтобы переименовать объект AD, как это обычно делается при изменении других атрибутов. Нужно использовать MoveHere. Другая общая ошибка — это попытка создать ADsPath для перемещения или переименования объекта. Для решения этой задачи лучше использовать свойство IADs::ADs Path или переменные, пример показан в Листинге 2, метка С.

При использовании MoveHere всегда происходит привязка к целевому контейнеру, который может быть текущим родительским контейнером объекта. При перемещении объекта происходит привязка к целевому контейнеру; при переименовании объекта — к родительскому контейнеру объекта. Если объект и перемещается и переименовывается, осуществляется привязка к целевому контейнеру. После получения интерфейса целевого или родительского контейнера можно вызывать MoveHere. Первый параметр MoveHere — ADsPath объекта для перемещения или переименования — всегда один и тот же, он не зависит от типа операции. Второй параметр — это одно из двух возможных значений. При переименовании объекта вторым параметром является новое имя RDN объекта. Если объект не переименовывается, то вторым параметром будет текущее RDN объекта.

Дополнительные интерфейсы в ADSI

Хотя я рассказал только о трех базовых интерфейсах ADSI, несомненно, для решения различных административных задач используются и другие программные интерфейсы. Перечислим некоторые из них:

  • методы SetPassword и ChangePas-sword, которые интерфейс IADsUser предоставляет для управления паролями пользователей, как показано в Листинге 2, метка А;
  • метод Group, который интерфейс IADsUser предоставляет для перечисления групп, принадлежащих пользователю;
  • методы Members, IsMember, Add и Remove, которые предоставляет интерфейс IADsGroup для управления членством в группах;
  • интерфейсы системы защиты IADs-SecurityDescriptor, IADsAccessCont-rolList и IADsAccessControlEntry для управления безопасностью объектов AD.

Чтобы понять, какой интерфейс, отличный от IADs или IADsContainer, необходимо применить, нужно сделать следующее.

  1. Идентифицировать тип объекта, с которым вы работаете (например, объекты Computer, Group, User).
  2. Обратиться к документации по ADSI и выяснить, существует ли интерфейс для такого типа объекта. Названия интерфейсов начинаются с IADs, затем идет имя типа объекта (например, IADsComputer, IADsGro-up, IADsOU, IADsUser). Найти полный список интерфейсов можно в Microsoft Developer Network (MSDN) Online Library.
  3. Если интерфейс в ADSI существует, нужно оценить те свойства и методы, которые он предоставляет, чтобы найти подходящий метод или свойство.

. Часть 1

Интерфейс к базе данных с помощью ASP

Постановка задачи

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

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

Я почти уверен, что подобная задача актуальна применительно практически к любому сайту, тем более что подобным образом (разве что без возможностей поиска, сортировки и удаления) работает большинство гостевых книг (guestbook).

Что нам понадобится

Для реализации вышеизложенной задачи нам потребуется персональный компьютер с Microsoft Windows NT или Windows 2000 (можно и Workstation, и Server), установленный IIS (Internet Information Server), какой-нибудь HTML-редактор (советую использовать Macromedia Dreamweaver), Microsoft Access (версии 95, 97 или 2000) и самый обычный текстовый редактор.

Создание и подготовка базы данных

Прежде всего создадим базу данных статей, для чего:

  • запустим приложение Microsoft Access;
  • любым из известных способов создадим новую базу данных. Назовем ее «Articles»;
  • в созданной базе данных создадим таблицу с именем, например «Articles»;
  • пользуясь инструментом «Конструктор», определим поля нашей таблицы и типы принимаемых ими значений (рис. 1);
  • заполним таблицу несколькими статьями в соответствии с созданными полями (рис. 2);
  • сохраним базу данных в файле «ArticlesDB.mdb».

Далее необходимо прописать нашу базу данных в соответствующем разделе источников данных системы, для этого:

  • запустим программу-конфигуратор источников данных (Data Sources ODBC) — Start->Settings->Control Panel->Administrative Tools->Data Sources ODBC;
  • перейдем во вкладку «System DSN» и создадим новый источник данных, нажав на «Add…»;
  • в появившемся списке драйверов выберем драйвер баз данных Microsoft Access — «Microsoft Access Driver (*.mdb)» и нажмем на «Finish»;
  • в строке «Data Source Name» зададим имя нашей базы данных, например «Articles» (это то имя, по которому мы в дальнейшем будем обращаться к ней);
  • нажмем на «Select…», выберем подготовленный нами файл «ArticlesDB.mdb» и нажмем «OK».

В результате в списке источников данных в вашей системе появится строка, представленная на рис. 3.

Оформляем главную страницу (index.asp)

С ASP работать очень просто. Для этого надо всего лишь вставить текст скрипта ASP в пару тэгов . В остальном ASP-файл ничем не отличается от HTML-файла (за исключением, пожалуй, расширения). Комментарии в HTML, как известно, вставляются в пару тэгов , в ASP же закомментировать строку можно при помощи символа ‘ (апостроф) в ее начале.

Теперь давайте разберемся. Во-первых, как вы наверняка заметили, ASP-код легко сочетается с HTML-тэгами; в этом его достоинство. Так, к примеру, строка Response.Write Link & «
» отображает на экране браузера клиента подготовленное сервером значение переменной Link и HTML-тэг
, то есть перевод строки. Особый интерес вызывает переменная rs. Для искушенных программистов сразу скажу — это указатель. Однако в ASP с целью облегчения работы начинающих указатели маскируются. Здесь не встретишь громоздких С’шных конструкций, типа «я знаю, что ты знаешь, что я знаю», или, выражаясь программистским языком, указатель на указатель… Однако сделано это так искусно, что гибкость программирования при этом не теряется, нет лишь прямой работы с указателями, а только работа с помощью специальных функций, скрывающих от программиста рутину и защищающих указатели от некорректных действий. Таким образом, выражение rs.Fields («Article»).value означает значение поля «Article» текущего значения указателя на элемент базы данных (в нашем случае статей) и содержит текст статьи, которая соответствует текущей позиции указателя на все статьи. Переход к следующему элементу базы (смещение указателя) выполняется с помощью инструкции Rs.MoveNext. В приведенном выше примере это не делается, а попросту формируется ссылка на текст статьи в виде ее названия и отображается комментарий самой первой статьи, соответствующей результату запроса. Давайте попробуем отобразить все статьи нашей базы данных на главной странице в виде HTML. И еще, обратите особое внимание на директиву:

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

Первая строчка скрипта шаблона HTML присваивает переменной TheID значение, переданное ссылкой с использованием метода Request.QueryString. Далее открывается база данных, из которой читается статья (запись), соответствующая идентификатору, переданному из главного скрипта (index.asp).

Создаем главную страницу

Таким образом в таблицу в цикле будут добавляться ряды со ссылками на статьи и с аннотациями, пока не будут отображены все статьи из базы данных. Следует обратить внимание на переменную Cnt. По окончании цикла она будет содержать число обработанных статей (рядов таблицы).

Язык структурированных запросов — SQL

Настала пора разобраться с тем, что таится за строчками:

По сути, именно за этими двумя строчками кроется работа с нашей базой данных: первая представляет собой текстовую строку с запросом к базе данных (текстовые строки в ASP записываются в двойных кавычках); вторая — содержит директиву выполнения этого запроса с одновременным присвоением результата переменной (указателю на записи в базе данных). В рамках настоящей статьи мы не будем рассматривать SQL (Structured Query Language) во всех деталях, а остановимся лишь на тех его операторах, без понимания которых дальнейшая работа будет невозможна. Для тех, кому этого покажется недостаточным, советую посетить отобранные мною сайты с детальной документацией по SQL.

Для полноценной работы нам необходимо познакомиться с четырьмя операторами этого мощного языка, предназначенного специально для работы с базами данных.

DELETE удаляет те ряды из «Имя Таблицы», которые удовлетворяют условию, определенному в «Определении», и возвращает число удаленных рядов. Если выполнить команду DELETE без условия WHERE, то все ряды указанной таблицы будут удалены. В этом случае DELETE возвратит 0. Ключевое слово LOW_PRIORITY откладывает выполнение операции DELETE до завершения работы чтения из таблицы других клиентов.

SELECT используется для извлечения рядов (записей) из одной или более таблиц. Выражение_Select определяет столбцы таблицы, значения которых необходимо извлечь. Все ключевые поля должны быть заданы в строгой последовательности. К примеру, выражение HAVING должно следовать за любым выражением GROUP BY и до любого выражения ORDER BY.

Выражение_Select можно заменить псевдонимом (alias) с помощью ключевого слова AS. Псевдоним используется в качестве идентификатора имени столбца и может быть использован наряду с ключевыми словами ORDER BY или HAVING.

Выражение HAVING может относиться к любому столбцу или псевдониму в Выражении_Select. Оно применяется к запросу в последнюю очередь, непосредственно перед посылкой данных клиенту. SELECT . INTO OUTFILE ‘имя_файла’ заносит отобранные записи в файл. Файл создается непосредственно на сервере и не может «уже существовать» (одна из основных причин такого механизма заключается в предотвращении случайного «затирания» различных важных файлов).

INSERT используется для добавления новых записей в существующую таблицу. Допустимо две формы использования INSERT.

Первая форма — INSERT . VALUES — вставляет ряды на основании заданных значений. Вторая форма — INSERT . SELECT — вставляет ряды, выбранные из другой таблицы.

Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Ключевое слово IGNORE в команде INSERT позволяет избегать вставки повторяющихся строк (используется в сочетании с ключевыми словами PRIMARY или UNIQUE). Для второй формы INSERT INTO . SELECT операция не может содержать выражения ORDER BY. Таблица, в которую производится добавление записей, не может присутствовать в выражении FROM части SELECT запроса потому, что запрещено производить выделение из той же самой таблицы, в которую производится вставка.

REPLACE служит для редактирования содержимого таблицы и работает в точности как INSERT, за исключением того, что если старая запись в таблице имеет то же значение, что и записываемая, то старая запись удаляется прежде, чем добавляется новая.

UPDATE обновляет поля существующей таблицы новыми значениями. Выражение SET показывает, какие поля (столбцы) должны быть изменены, и значения, которые должны быть им присвоены. Выражение WHERE, если оно есть, указывает, какие ряды должны быть обновлены. В противном случае операция применяется ко всем рядам таблицы. Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Выражения UPDATE выполняются слева направо.

Обновляет значение поля Password в таблице WAPassword, записывая в поле, чей идентификатор ID равен 1 значение ‘passw’.

Увеличивает значение поля counter таблицы Счетчик на 1.

Удваивает поле age, а затем прибавляет 1 к его значению в таблице persondata.

Что такое Global.asa

Global.asa позволяет выполнять определенные скрипты в начале работы клиентской сессии или при инициализации IIS. Примером тому может служить простейший счетчик числа посещений сайта. Более того, допустимо использовать множественные файлы Global.asa. Однако следует помнить, что ASP-скрипт ищет самый близкий (расположенный в том же каталоге) файл Global.asa и использует именно его.

По сути, этот файл может содержать четыре скрипта: первый будет выполняться при инициализации службы IIS/PWS (Application_OnStart), второй — при остановке службы IIS/PWS (Application_OnEnd) (обычно эти первые два скрипта отрабатывают в процессе перезагрузки компьютера), и еще два скрипта выполняются дополнительно при инициализации сессии пользователя (Session_OnStart) и по ее окончании (Session_OnEnd). Данная схема очень сильно напоминает пары «конструктор-деструктор». Неспроста всякая переменная, которая должна быть использована (например, в текущей сессии), может быть инициализирована в Session_OnStart с тем, чтобы быть использованной в процессе работы сессии, она же уничтожается (обнуляется) в Session_OnEnd.

Global.asa не может содержать тэгов HTML. Недопустимо использование JavaScript. Не рекомендуется писать файл Global.asa с помощью каких-либо HTML-редакторов, для этого гораздо лучше использовать NotePad. И еще один совет: прежде чем вставлять скрипт в файл Global.asa, попробуйте его в работе в обычном ASP-файле.

Пример файла Global.asa

Добавляем новую статью (UploadForm.asp и Upload2DBS.asp)

Теперь, когда мы разобрались с SQL, можно приступать к добавлению новой статьи, причем делать мы это будем прямо с сайта, а если быть точнее — непосредственно с HTML-формы. Для этого сначала создадим файл с самой формой и определим скрипт-реакцию на подтверждение (кнопку «Publish the article!»). (Предполагается, что читатель знаком с азами построения HTML-форм, поэтому мы рассмотрим этот процесс, не вдаваясь в детали построения форм.)

Прежде всего следует уточнить задачу на этом этапе. Итак, очевидно следующее:

  • на загрузку статьи с сайта должен иметь право не каждый (следовательно, желательно предусмотреть пароль для доступа к этой функции);
  • у каждой статьи есть определенная тема (рубрика), причем она не может быть произвольной, а должна выбираться из списка;
  • список можно хранить непосредственно в HTML-файле и, каждый раз изменяя его, изменять сам файл. Это самый простой и быстрый способ;
  • однако для того, чтобы позволить динамически изменять и пополнять этот список, рекомендуется держать его в базе данных. Это позволит пользователям произвольным образом изменять его содержимое и не потребует переделки формы. Для простоты сначала рассмотрим вариант со встроенным («жестко прошитым») рубрикатором.

Как видим, передача управления осуществляется благодаря директиве ACTION=»http://localhost/Upload2DBS.asp»> в тэге формы. Тем самым указывается скрипт-ответ на реакцию пользователя после нажатия на кнопку «Publish the article!». Теперь остановимся на селекторе рубрик. Как уже отмечалось, желательно перевести его содержимое в базу данных. Для этого в нашей базе данных (файл ArticlesDB.mdb) создадим новую таблицу с именем, к примеру «Topics», в которой с помощью конструктора определим всего одно поле — «Topic» типа «текст». Далее заполним эту таблицу произвольными значениями нашего рубрикатора и отсортируем полученный список в алфавитном порядке. После чего следует заменить тэг

Теперь давайте разберемся с самой сутью дальнейшей работы. Что же должен делать наш скрипт-реакция?

Во-первых, следует позаботиться о том, чтобы все обязательные поля (а они отмечены звездочкой) были введены. Наиболее правильным способом проверки этого является скрипт, написанный на любом языке описания скриптов (например, JavaScript), который будет проверять, введены ли значения обязательных полей. Для этого достаточно добавить в определение тэга формы параметр onsubmit=»preprocess();», где preprocess() — имя функции-скрипта, который и будет осуществлять проверку. Здесь как нельзя кстати видно преимущество языков описания сценариев (JavaScript, Jscript, VBScript) перед ASP. ASP выполняется на стороне сервера, а перегружать связь «клиент-сервер» простой проверкой типа «введены ли значения», согласитесь, неправильно. Однако специально в целях обучения мы будем делать это с помощью ASP.

И еще. Прежде чем приступить к выполнению нашей задачи, следует сказать еще об одной небольшой проблеме: когда мы будем вставлять в ячейку базы данных текст, его форматирование (даже самое простое) не сохранится, и в дальнейшем его невозможно будет корректно отобразить на HTML-странице, поскольку поле Memo хранит неформатированную строку текста. Чтобы избежать этого, следует написать функцию, которая позволит производить примитивное HTML-форматирование введенного текста статьи, перед тем как записать его в базу данных. Другими словами, в самом примитивном случае (хотя бы для того, чтобы сохранить исходную разбивку на строки) функция должна вставлять символы конца строки там, где во входном потоке имеются символы переноса строк.

Удаляем статью (RemoveForm.asp и Rem.asp)

Было бы неплохо предусмотреть возможность удаления статьи с нашего сайта: во-первых, она может устареть, а во-вторых, в процессе ее подготовки не исключены ошибки или опечатки. Останавливаться на форме удаления статьи не будем, скажем лишь, что она содержит единственные элементы с запросом пароля и кнопкой удаления (см. файл RemoveForm.asp), и сразу перейдем к рассмотрению непосредственно процесса удаления:

Особое внимание следует уделить первым двум строкам. Они получают значение глобальной переменной текущего сеанса (сессии) работы со значением идентификатора текущей статьи (в нашем случае удаляемой), которая была инициализирована (файл ArtTmp.htm) следующей строкой:

Таким образом, в текущий скрипт передается в качестве параметра сеансовая переменная с идентификатором текущей статьи, которую необходимо удалить. Имеется в виду, что ссылка на удаление присутствует в странице с шаблоном (файл ArtTmp.htm) и удаляемая статья является текущей.

Организуем поиск (SearchForm.asp и SearchDBS.asp)

Как известно, без поиска навигация в сколь-нибудь солидной базе данных невозможна в принципе. Попробуем организовать поиск статьи по ее реквизитам, причем постараемся организовать булев (логический) поиск, соединяя отдельные значения критериев поиска с помощью логики «И/ИЛИ».

Опять же не заостряя внимание на поисковой форме (файл SearchForm.asp), перейдем непосредственно к самому процессу поиска:

Самое интересное происходит при формировании запроса к базе из составляющих:

В зависимости от введенной пользователем комбинации исходных полей из этих компонентов формируется окончательный запрос, в частности для полей «Author» и «Title». Возможны четыре случая: оба поля пусты, пусто первое поле, пусто второе поле и оба поля не пусты. Соответствующая строка SQL-запроса в каждом из этих случаев формируется по-своему. То же самое относится к состоянию селекторов рубрик статей и порядку их сортировки. При добавлении той или иной подстроки учитывается состояние «радиокнопок» И/ИЛИ и соответствующая подстрока добавляется в SQL-запрос, предваряясь логическим элементом «and» или «or» соответственно. После того как окончательный запрос сформирован, он выполняется, а результирующая страница формируется исходя из списка статей, удовлетворяющих критериям.

Полный код приведенных в статье примеров, включая файл базы данных, находится на нашем CD-ROM.

И в заключение

Напоследок хотелось бы сориентировать разработчиков ASP-страниц в мире документации и инструментальных средств. Дело в том, что автор настоящей статьи провел не один день сидя в Интернете в поисках всевозможных исходных текстов, документации, инструментальных средств и теоретических основ этого мощного средства.

Среди множества инструментальных средств, служащих для облегчения создания ASP-приложений, выделяются два: Easy ASP © Eric Banker, 2000 и Microsoft InterDev из комплекта Microsoft Visual Studio 6.0. Первый — очень удобное, несложное и небольшое средство для быстрого создания ASP-приложений. Второй представляет собой мощный, тяжеловесный интегрированный пакет в духе Microsoft для разработки всевозможных Web-приложений.

Временная версия EasyASP 4.0 находится на нашем CD-ROM.

Среди огромного числа сайтов мною были отобраны те, посещение которых было для меня особенно полезным и с которыми хотелось ознакомить читателей, а именно:

http://www.15seconds.com/issue/000210.htm — создание динамичных JavaScript-скриптов с помощью ASP и интерфейсов к базам данных

http://www.alphasierrapapa.com/iisdev/ — сайт, посвященный разработке серверов IIS с помощью ASP

http://www.websiteresources.com/ — огромная база исходных текстов всевозможных Web-программ

Примеры ASP-кода для профессионалов

http://www.asptoday.com/search.asp?category=ASP Tricks — масса полезных советов для начинающих программировать на ASP

http://www.oreilly.com/catalog/aspnut/ — замечательная книга популярнейшей серии «In a Nutshell» всемирно известного издательства O’REILLY «ASP in a Nutshell A Desktop Quick Reference». На сайте бесплатно размещена одна из глав книги

http://www.chilisoft.net/ — версии ASP для различных платформ можно скачать с этого сайта

http://www.willcam.com/sql/ — введение в структурированный язык запросов SQL

SQL Reference and Example Site — хорошо структурированный материал по SQL

В ASP.NET, что называется кодом ASP?

Подробнее на мой вопрос:

HTML и JavaScript называются «клиентским кодом».

С# и VB в файлах, находящихся за кодом, называются «серверным кодом».

Итак, что такое код inline-asp и ‘runat = server’, который называется?

Лучший термин, который я могу придумать, — это «код веб-форм».

Чтобы быть явным, Microsoft называет их встроенными блоками кода.

Они представляют собой кодовые блоки, встроенные в жизненный цикл страницы, вызываемые во время фазы Render.

Разделы ASP-страницы, начинающиеся с и заканчивающиеся на %> , являются фрагменты кода и

Части, начинающиеся с , являются директивами. Блоки рендеринга кода, начинающиеся с , являются просто короткой рукой для вызова writer.Write() в методе Page.Render() .

В разделе ASP на сайте MSDN они называются «script командами, » серверных команд script « и » первичные команды script.

Ниже я включил выдержки из сайта MSDN и ссылку ссылки.

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

Команды, заключенные разделителями, называются основными script командами, которые обрабатываются с использованием основного языка сценариев. Любая команда, используемая в разделителях script, должна быть действительной для основного языка сценариев. По умолчанию основным языком сценариев является VBScript, но вы также можете установить другой язык по умолчанию.

Что такое код asp movehere

Интерфейс IADSContainer в скриптах ADSI на VBScript, общие свойства и методы контейнерных объектов (Site, Domain, OU), свойства Count и Filter, методы CopyHere(), Create(), Delete(), GetObject(), MoveHere()

Интерфейс IADsContainer обеспечивает набор свойств и методов для контейнерных объектов Active Directory (в основном — объектов организационных подразделений и доменов). Чаще всего свойства и методы этого интерфейса используются для двух задач:

  • для получения доступа ко всем элементам, которые находятся в данном контейнерном объекте. Например, чтобы получить набор отличительных имен для объектов пользователей в организационном подразделении HQ в домене nwtraders 1. msft , можно использовать следующий код:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

For Each oUser In oContainer

  • для создания, удаления, копирования или перемещения элементов в контейнерном объекте. Например, для создания объекта пользователя в том же OU можно использовать код вида:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

‘Создаем объект пользователя и настраиваем обязательные свойства

Set oUser = oContainer.Create(«user», «CN=Alexander Ivanov»)

oUser.Put «samAccountName», «AIvanov»

oUser.Put «userPrincipalName», «AIvanov@nwtraders1.msft»

‘Приводим объект пользователя в рабочее состояние

В интерфейсе IADsContainer предусмотрены следующие свойства:

  • Count — это свойство должно возвращать информацию о количестве вложенных элементов в контейнере. Если для контейнерного объекта настроен фильтр при помощи свойства Filter , то это свойство должно вернуть информацию только о количестве элементов, которые не отбрасываются фильтром. Однако, к сожалению, при работе через провайдер LDAP это свойство не поддерживается.
  • Filter — это свойство позволяет настроит фильтр для элементов в данном контейнере. Те элементы, которые не соответствуют данному фильтру, при работе с контейнером будут игнорироваться. Это свойство в качестве значения принимает массив значений типа Variant с именами классов объектов Active Directory согласно схеме (например, » user «, » o кпфтшяфешщтфдГтш», » computer » и т.п.). К примеру, если в организационном подразделении HQ нас интересуют только объекты пользователей, то пример применения этого свойства может выглядеть так:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

For Each oFilter In oContainer.Filter

Чтобы снять фильтр, можно использовать код вида

oContainer . Filter = Nothing

  • Hints — это свойство позволяет определить, какие именно свойства для данного контейнерного объекта необходимо скачать в кэш свойств при получении ссылки на данный объект. Главная его цель — оптимизация сетевого трафика и расхода оперативной памяти при работе с большим количеством объектов. Если мы укажем только необходимые нам свойства, то другие свойства скачиваться с контроллера домена не будут и, таким образом, мы получим выигрыш в производительности при работе с этой программой. Однако это свойство, скорее зарезервировано для будущего использования. При работе через провайдеры WinNT , NDS и NWCOMPAT оно не работает официально. Если же вы подключаетесь к Active Directory через провайдер LDAP , то выполнения требуемых функций от него также удается добиться далеко не всегда.

Работает это свойство с массивом строковых значений. Пример его применения может выглядеть так:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

Ниже представлена информация о методах интерфейса IADsContainer :

  • CopyHere () — этот метод позволяет скопировать элемент внутри данного контейнерного объекта. Сразу отметим, что использовать его можно только при подключении к службе каталогов NDS средствами провайдера NDS . При использовании любого другого провайдера попытка вызвать этот метод вернет ошибку «Не поддерживается».

Этот метод принимает два параметра: путь в формате свойства ADsPath для исходного объекта и имя в формате относительного отличительного имени для создаваемого объекта. Второй параметр является необязательным, если его пропустить, то имя скопированного объекта будет таким же, как и у исходного. Этот метод возвращает ссылку на созданный объект, при помощи которой можно донастроить его свойства после копирования и сохранить внесенные изменения.

  • Create () — очень важный и частоиспользуемый метод интерфейса IADsContainer . Этот метод позволяет создать новый элемент в данном контейнере. Он принимает два обязательных параметра:
    • имя класса создаваемого объекта (например, » user ‘, » group «, » organizationalUnit «, » computer » и т.п.)
    • относительное отличительное имя для данного объекта (точно в том же формате, в котором это имя возвращается при помощи свойства IADs . Name ).

Этот метод возвращает ссылку на созданный объект в оперативной памяти. Затем можно присвоить значение свойствам данного объекта (лучше при помощи метода IADs . Put (), чтобы гарантировать отсутствие ошибок) и сохранить созданный объект в службе каталогов при помощи метода SetInfo (). Например, создание глобальной группы может выглядеть так:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

Set oGroup = oContainer.Create(«group», «CN=Script Users»)

oGroup.Put «groupType», ADS_GROUP_TYPE_GLOBAL_GROUP Or _ ADS_GROUP_TYPE_SECURITY_ENABLED

oGroup.Put «samAccountName», «Script Users»

oGroup.Put «name», «Script Users»

oGroup.Put «displayName», «Script Users»

oGroup.Put «description», «Script Users Security Group»

  • Delete () — этот метод позволяет удалить элемент из данного контейнерного объекта. Он также принимает в качестве параметров имя класса и относительное отличительное имя для удаляемых объектов. Если класс в Active Directory уже отключен, а вам нужно удалить экземпляр этого класса, то вместо имени класса необходимо передать NULL . Пример удаления объекта группы Script Users может выглядеть так:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

oContainer.Delete «group», «CN=Script Users»

  • Get __ NewEnum () — этот метод не предназначен для того, чтобы вызывать его явно. Он возвращает набор элементов, который имеется в данном контейнерном объекте. Обычно он вызывается автоматически, например, при использовании синтаксической конструкции For Each .

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

For Each Item In oContainer

  • GetObject () — этот метод позволяет вернуть ссылку на элемент в контейнерном объекте. В качестве параметров этот элемент принимает класс объекта и его относительное отличительное имя, например:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

Set oUser = oContainer.GetObject(«user», «CN=Alexander Ivanov»)

Wscript.Echo oUser . ADsPath

  • MoveHere () — этот метод позволяет переместить какой-либо элемент в данный контейнерный объект. В качестве параметров этот метод принимает имя отличительное существующего объекта и его новое относительное отличительное имя. Например, чтобы переместить объект пользователя TestUser 1 из контейнера Users в Active Directory в наше организационное подразделение HQ , можно использовать следующий код:

Set oContainer = GetObject(«LDAP://ou=HQ,dc=nwtraders1,dc=msft»)

Set oUser = oContainer.MoveHere _

Этот метод возвращает ссылку на интерфейс IADs для перемещенного объекта, поэтому вы можете использовать полученную ссылку для дальнейшей настройки свойств данного объекта.

Если переместить объект в тот же контейнер, в котором он уже находится, указав при помощи второго параметра новое имя для этого объекта, то тем самым можно переименовать объект в данном каталоге.

Отметим некоторые моменты, связанные с применением метода MoveHere (). При помощи этого метода можно перемещать в данный контейнерный объект как объекты из того же домена, так и объекты из других доменов данного леса. Однако для перемещения объектов из других доменов необходимо обязательно выполнить некоторые условия:

  • домен назначения должен работать по крайней мере в режиме Windows 2000 Native ;
  • перемещать можно только конечные объекты (например, объекты пользователей) или пустые контейнерные объекты (например, организационное подразделение, в котором нет никаких вложенных объектов).

При перемещении объекта между доменами для объекта создается новый SID , а старый сохраняется при помощи атрибута SIDHistory . Явно предоставленные разрешения для пользователя при этом сохраняются, но теряется его членство в глобальных группах (и, соответственно, предоставленные через глобальные группы разрешения). Для перемещаемых объектов пользователей назначенные им пароли сохраняются.

Если же вам нужно переместить между доменами целое организационное подразделение со вложенными элементами (другими организационными подразделениями, объектами пользователей и т.п.), то лучше использовать вместо метода MoveHere () утилиту командной строки MoveTree , которая входит в состав Windows Server 2003 Support Tools .

Что такое код asp movehere

ASP – веб-технология, которую в декабре 1996 года представила компания Microsoft для возможности создания интерактивных веб-приложений. ASP – это аббревиатура от Active Server Pages, что переводится, в соответствии с логикой технологии, как «активные серверные страницы». Важно понимать, что ASP не является языком программирования, она только позволяет встраивать в обычный HTML-код сценарии на каком-либо скриптовом языке(Visual Basic Script или Java Script). Таким образом, за счет использования ASP на веб-страницы могут встраиваться элементы с заранее настроенным программным управлением.

Изначально в любом текстовом редакторе создается исходный код программы. По умолчанию используется Visual Basic – если ничего дополнительно не указывать, система будет считать, что программа написана именно на этом языке. Затем файл, которому задается расширение .asp, выкладывается в каталог, имеющий права на выполнение, чтобы сервер мог исполнить этот файл, когда браузер пользователя запросит его. Для пользователя этот файл не виден, поскольку сначала загруженный файл с программой интерпретирует сервер таким образом, что программный код будет отображаться непосредственно в HTML-коде страницы, в скобках вида скобки .

ASP просуществовала в чистом виде до 2002 года. 1 января этого года увидел свет релиз ASP.NET, технологии, в которой были учтены ошибки и недочеты ASP. Устранить их получилось благодаря тому, что новая технология была основана на более функциональной платформе Microsoft .NET.

Синонимы: нет
Все термины на букву «A»
Все термины в глоссарии

Выполнение кода в фоне в ASP.NET при помощи Hangfire

Веб-приложения — это не только, обработка HTTP-запросов. Часто приложению приходится выполнять какую-то работу в фоне — например, списывать деньги со счета по расписанию или выполнять отправку email-сообщения, не задерживая при этом ответ пользователю.

Решают эту задачу все по-разному — кто-то создает свою службу Windows, кто-то запускает код по расписанию с помощью планировщика Windows. Есть ещё один прекрасный способ — библиотека Hangfire.

В основе идеи Hangfire лежит ключевое «fire-and-forget», что означает запустить код на выполнение и забыть — далее он выполнится в фоне без вашего участия. При этом вам не потребуются дополнительные инфраструктурные вмешательства (такие как Windows Service), что существенно упростит процесс развертывания. Hangfire подключается к приложению путем установки пакета из Nuget.

Подключение Hangfire к приложению

Для подключения Hangfire к приложению нужно установить пакет Hangfire из Nuget:

Данный пакет содержит базовую инфраструктуру Hangfire и хранилище для SQL Server. Hangfire использует внешнее хранилище данных для очередей для того, чтобы фоновые задачи не удалялись при перезапуске приложения. По умолчанию в качестве хранилища используется SQL Server, в платной Pro-версии есть возможность работать с Redis. Также я сделал свой провайдер для Mongo.

Для запуска Hangfire используется инфраструктура OWIN (отличное решение, с учетом задела на будущее), для конфигурации нужно выполнить метод UseHangfire :

Метод UseHangfire принимает в качестве аргумента метод для конфигурирования Hangfire. Здесь нужно обязательно использовать какой-либо из типов источников данных. Провайдер для SQL Server автоматически создаст нужные таблице в вашей базе данных, поэтому дополнительных действий тут не требуется — нужно только указать строку подключения SQL Server:

Необходимые таблицы будут созданы при первом запуске приложения:

Аналогично работают провайдеры для Redis и Mongo — нужные коллекции создаются автоматически.

Этого достаточно для того, чтобы Hangfire заработал. Можно запустить приложение и вам будет доступен Dashboard от Hangifre по адресу /hangfire . Там содержаться все задачи — выполненные, запланированные, ошибочные и т.д.

Если требуется закрыть паролем этот Dashboard, то существует отдельный пакет — Hangfire.Dashboard.Authorization , который поддерживает встроенную аутентификацию ASP.NET, а также Basic Authentication. Не забывайте настроить HTTPS для вашего веб-приложения.

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

Запуск задач при помощи Hangfire

Hangfire имеет возможность запуска разных типов задач:

  • простая задача в фоне, которая запустится как можно скорее («fire-and-forget»)
  • задача, выполняемая с задержкой (например, через 1.5 часа после постановки в очередь)
  • задача, выполняемая периодически по заданному расписанию

При запуске задачи в Hangfire она помещается в очередь (в хранилище появляется соответствующая запись) и далее выполняется в фоне.

Для примера, создадим приложение, отправляющее email-ы. Почему это нужно делать в фоне? Дело в том, что скорость отправки сообщения зависит от конкретного SMTP-сервера. Эта задержка увеличивается, если отправлять несколько сообщений. Например, у меня были случаи, когда по запросу от пользователя нужно было рассылать более 10 сообщений — в этом случае задержка становится ощутимой. В случае с Hangfire мы просто ставим задачи по отправке email-сообщений в очередь и больше не задерживаем пользователя. Поэтому предпочтительнее обрабатывать такие задачи именно в фоне.

Создадим простейший сервис для отправки сообщения:

Чтобы поставить задачу на отправку сообщения в очередь следует воспользоваться объектом BackgroundJob :

Как только задачи будут поставлены в очередь, это будет видно в Hangfire Dashboard:

Здесь же можно отслеживать успешные и неудачные попытки выполнения заданий, отслеживать задания по расписанию и визульно видеть объем задач, выполняемых в фоне.

Илон Маск рекомендует:  Что такое код cpdf_set_horiz_scaling
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL