Asp методы объектов adsi


Содержание

Архитектура Membership API

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

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

Для преодоления этой проблемы в ASP.NET 2.0 было добавлено средство под названием , которое в ASP.NET 4, по сути, осталось без изменений. Интерфейс Membership API — это платформа, построенная на основе существующей инфраструктуры аутентификации с помощью форм. При использовании Membership API даже не понадобится реализовывать страницы входа или хранилища удостоверений.

Платформа Membership API предоставляет полный набор готовых функций управления пользователями:

Возможность создавать и удалять пользователей — как программно, так и с помощью веб-утилиты конфигурирования ASP.NET.

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

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

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

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

Уровень абстракции, который обеспечивает независимость приложений от конкретного лежащего в основе хранилища данных через классы поставщиков членства. Любая функциональность, перечисленная выше, работает совершенно независимо от конкретного используемого хранилища данных, и одни хранилища данных можно заменять на другие — совершенно без необходимости в какой-либо модификации приложений. По умолчанию Membership API полагается на базу данных SQL Server Express для хранения информации о пользователях и ролях.

На рисунке ниже показана фундаментальная архитектура Membership API, которая состоит из поставщиков, собственно API-интерфейса и элементов управления для создания соответствующих пользовательских интерфейсов:

Платформа Membership API спроектирована для полностью независимой работы от используемого им хранилища данных. Вы, как разработчик приложения, в основном имеете дело с элементами управления, предоставленными ASP.NET, а также классом Membership. Класс Membership предлагает набор методов для программного доступа к пользователям и ролям, находящимся в хранилище. Методы работают с поставщиком членства. Этот поставщик реализует доступ к лежащему в основе хранилищу данных. Все классы, относящиеся к Membership API, размещены в пространстве имен System.Web.Security. Их список с краткими описаниями приведен в таблице ниже:

Классы Membership API

Класс Membership — центральная точка взаимодействия с Membership API. Он предоставляет ряд методов для управления пользователями, их проверки и переустановки паролей

Исключение, генерируемое в случае возникновения ошибки при попытке создания пользователя классом Membership

Представляет отдельного пользователя, записанного в хранилище данных Membership API. Этот объект содержит всю информацию о пользователе и возвращается несколькими методами класса Membership, например, GetUser()

Коллекция пользователей Membership. Например, метод GetUsers() класса Membership возвращает экземпляр этой коллекции

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

Коллекций доступных поставщиков членства на машине для данного веб-приложения

Реализаций класса MembershipProvider, работающая с базами данных SQL Server

Реализация класса MembershipProvider, работающая со службой Active Directory

Класс, который наследует всю функциональность MembershipUser и добавляет некоторые специфичные для Active Directory свойства

ASP.NET включает готовых поставщиков членства для SQL Server и Active Directory (что позволяет создавать собственные страницы входа для пользователей, хранящихся в Active Directory). Но основная идея поставщиков состоит в том, что они предоставляют возможность полного расширения инфраструктуры. Таким образом, можно реализовать собственный поставщик членства, который будет представлять собой класс, унаследованный от System.Web.Security.MembershipProvider. Поставщик членства конфигурируется, прежде всего, в файле web.config, в новом разделе .

Хотя Membership API и поддерживает службу Active Directory в качестве одного из поставщиков, все же существует большая разница между использованием Windows-аутентификации и Membership API для аутентификации пользователей веб-приложений.

В случае настройки приложения на применение интерфейса Membership API, который в действительности основан на аутентификации с помощью форм, удостоверения пересылаются по сети в виде простого текста (если только не используется SSL) и, как было показано ранее, для аутентификации применяются так называемые билеты аутентификации. С другой стороны, при настройке Windows-аутентификации пользователь аутентифицируется либо через NTLM, либо через Kerberos (в случае доменов Windows Server). Оба метода намного более безопасны, поскольку удостоверения никогда не пересылаются через сеть.

В приведенной таблице присутствует выделенный класс по имени ActiveDirectoryMembershipUser, который применяется в сочетании с ActiveDirectoryMembershipProvider. Однако класса по имени SqlMembershipProviderUser вы не найдете. Это значит, что класс SqlMembershipProviderUser для представления пользователей использует базовый класс MembershipUser. Причина в том, что версия поставщика Active Directory расширяет класс MembershipUser множеством специфичных для Active Directory атрибутов, доступных пользователям Active Directory. Таких специфичных свойств у SqlMembershipProviderUser не предусмотрено, поэтому создание отдельного класса SqlMembershipProviderUser просто не понадобилось.

Интерфейс Membership API служит только для управления и аутентификации пользователей. Он не реализует никакой функциональности авторизации и не предоставляет функциональности управления пользовательскими ролями. Для этой цели предназначен интерфейс Roles API рассматриваемый позже.

Объектная модель ASP.NET

Доступность Web-страниц

Технология ASP.NET обеспечивает высокую доступность созданных в ее рамках Web-страниц, благодаря применению эффективной системы обработки ошибок, устранения «утечек памяти» и взаимных блокировок. Для этого задается максимальное количество запросов и устанавливаются значения параметров для контроля объема используемой памяти. Конфигурационная информация сохраняется в файле Web.config. При достижении приложением ASP.NET предельного значения какого-либо установленного параметра создается новый экземпляр Web-страницы. Запросы перенаправляются к новому экземпляру Web-страницы, а старый экземпляр уничтожается по окончании обработки всех поступивших к нему запросов.

ASP.NET предоставляет новую объектно-ориентированную модель разработки Web-приложений. Сами ASP.NET-страницы являются объектами классов. Можно создавать программный код с возможностью его повторного использования классами. Эти классы можно использовать для создания экземпляров объектов.

Объектная модель — это иерархия объектов, предоставляющих разработчикам определенные возможности. В ASP.NET используется новая структура Web-страниц, которая отличается от структуры ASP-страниц и обеспечивает поддержку объектной модели для сохранения содержимого ASP.NET-страницы. Добавлен новый класс элементов управления — серверные элементы управления. Можно добавлять собственные комментарии и связывать эти данные с серверными элементами управления. Для оформления Web-страниц имеются наборы директив, которые предназначены для установки параметров. Например, параметры TraceContext и isEnabled позволяют, соответственно, включить и отключить механизм отслеживания Web-запросов.

ASP.NET определяет шесть внутренних объектов структуры страниц:

Эти объекты встроены в модель ASP.NET-страниц и готовы к использованию.

В объекте application хранятся данные, которые будут доступны всем пользователям, одновременно работающим с Web-приложением. Данные о сеансе работы каждого отдельного пользователя сохраняет объект session. Объект application используется для хранения глобальных переменных, которые содержат информацию, общедоступную для всех пользователей Web-приложения, например приветственное сообщение или индекс посещения Web-страницы. Этот объект представляет собой коллекцию разнородных элементов. Пользователи совместно используют объекты Web-приложения, поэтому требуется гарантировать, что несколько пользователей не смогут одновременно изменять переменные, хранимые в объекте application. Для блокирования содержимого коллекции объектов от изменения применяется метод Lock, для разблокирования — метод Unlock.

С помощью объекта ObjectContext выполняется фиксация или откат транзакций, управляемых MTS. Транзакции могут быть инициированы со страницы ASP.NET. Методы SetComplete и SetAbort объекта ObjectContext используются, соответственно, для фиксации и отката транзакций.

В объекте request сохраняется информация, отправляемая броузером клиента на сервер в HTTP-запросе. После обработки запроса с помощью объекта request пользователю отправляется ответная информация. Объект server позволяет получить доступ к свойствам и методам Web-сервера. С помощью метода Server.createobject можно создать экземпляр объекта server.

Объект session используется для хранения информации о пользовательских сеансах. Значения переменных объекта session сохраняются, даже когда пользователь переходит на другую страницу Web-приложения. Этот объект создается при организации пользователем сеанса и уничтожается при его завершении. Например, в нём можно сохранять регистрационную информацию каждого пользователя, посещающего сайт виртуального магазина. Эта информация остаётся доступной для всего Web-приложения даже при переходе пользователя на другие Web-страницы сайта.

Каждый из внутренних объектов ASP.NET обладает набором методов и коллекций для управления функциональными возможностями этого объекта. Назначение и возможности внутренних объектов технологий ASP и ASP.NET практически идентичны.

Вопросы промежуточного контроля третьего раздела

  1. Назовите фундаментальные основы ASP.NET;
  2. Архитектура ASP.NET;
  3. История создания ASP.NET;
  4. Назовите модель программирования ASP.NET
  5. Возможности ASP.NET.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Студент — человек, постоянно откладывающий неизбежность. 10528 — | 7318 — или читать все.

Вопрос по system.reflection, reflection, powershell, syntax &#8211 Можно ли перечислить все методы и свойства, доступные через Invoke () объекта [ADSI]?

Мне интересно, если кто-то может описать, как перечислить методы ADSI, доступные через связанный экземпляр, как? [ADSI]$instance.psbase.Invoke()

Исследование оказалосьобратитесь к документации по интерфейсу ADSI «, но я не особенно доволен этим ответом.

Если я создаю экземпляр с:

Powershell вернет out из GetProperty(«Name») для каждого объекта, содержащегося в группе.

Как мне перечислить все доступные методы и свойства, которые будут доступны через любой данный интерфейс ADSI?

Этот ответ от Шей Леви это еще один пример синтаксиса, где [ADSI]$_.GetTypes().InvokeMember() а также [ADSI]$_.psbase.Invoke() используются.

если это отвечает на ваш вопрос, но как насчет следующего?

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

Основная проблема заключается в том, что объекты ADSI с собственным кодом должны реализовывать интерфейс COM IDispatch [который позволяет вызывать методы с поздней привязкой], но они неt обязательно реализовать ITypeInfo [который допускает поведение, подобное отражению]. В PowerShell COM-объект, который реализует IDispatch, но не ITypeInfo, приводит к странному набору ограничений, который вы заметили.

Поставщику WinNT ADSI не менее 15 лет, и у него никогда не было сильной стороны. Это было заполнено написанодо Active Directory поставляется (задолго до CLR или PowerShell.)сценарии» под Microsoft подразумевались ранние версии VBScript с некоторой поддержкой JScript, обе из которых основывались на IDispatch и никогда не использовали ITypeInfo.

Это было предметом обсуждения в начале PowerShellжизнь, когда один из членов команды PowerShell сказал:

. PowerShell может «t показать методы объектов COM, если интерфейс ITypeInfo не предоставлен. Это будет исправлено в ближайшее время. Обходной путь должен использовать Type.InvokeMethod ().

В PowerShell были улучшенияПоддержка COM-объектов, но полное исправление так и не состоялось. Я думаю, что член команды, возможно, переобещал то, что технически возможно. Это могло сбить людей с толку. Я спросил об этом моего друга-разработчика в команде пару лет назад; он был явно знаком с проблемой и указал, что сценарий использования не былПриоритет также упомянул обходной путь.

Команда PowerShell поставляет впечатляющие функции и некоторые исправления ошибок, но, честно говоря, я неНе думаю, что эта проблема когда-нибудь сделает панель ошибок.

Active Directory — теория построения

Архив номеров / 2004 / Выпуск №1 (14) / Active Directory — теория построения

Компонент Описание
Membership
MembershipCreateUserException
MembershipUser
MembershipUserCollection
MembershipProvider
MembershipProviderCollection
SqlMembershipProvider
ActiveDirectoryMembershipProvider
ActiveDirectoryMembershipUser


ИВАН КОРОБКО

Active Directory – теория построения

В своей работе системному администратору часто приходится выполнять рутинные действия, которые отнимают много времени и требуют повышенного внимания. Управление Active Directory является одной из приоритетных задач системного администратора. Программное администрирование Active Directory позволит сэкономить время и свести к минимуму влияние человеческого фактора. Используя провайдеры LDAP и WinNT, системный администратор сможет с помощью сценария загрузки управлять подключением сетевых ресурсов; создавать скрипты, которые позволят автоматизировать рутинные операции. Умелое сочетание возможностей провайдеров WinNT и LDAP дает превосходный результат. Как показывает опыт, без теоретических знаний о механизме работы Active Directory и ADSI, базируясь на приведенных в Интернете примерах, очень трудно понять что к чему. В данной статье предпринята попытка поставить все точки над «и», не оторвав при этом теорию от практики (программирования Active Directory).

Программное управление с помощью VBScript

Как отмечалось ранее, для управления ADSI могут быть использованы VB/VBScript, JScript, C/C++. Для программного управления – компьютером, выполняющим роль контроллера домена, на котором установлена Active Directory, следует использовать стандартные средства, предлагаемые компанией Microsoft. Одним из таких стандартных средств является VBScript. Использование этого языка программирования дает огромные преимущества. Скрипты, написанные на VBScript помогут системному администратору не только управлять Active Directory, но и создавать сценарии загрузки для входа в сеть. По сравнению с С/С++, программный код на VBScript в несколько раз меньше, а по функциям равнозначен. Использование WHS (Windows Hosting Script) и WMI (Windows Management Instrument) совместно с программированием Active Directory позволит решать сложные задачи администрирования. И WSH, и WMI также являются стандартными средствами и поддерживают VBScript. Программирование WMI рассмотрено в статье «Решение задач инвентаризации в сети» в журнале «Системный администратор» №12(13) за 2003 год.

Использование VBScript позволяет создавать скрипты – текстовые файлы с расширением VBS, которые используются как сценарии загрузки при регистрации пользователей в сети, в виде сайтов на основе ASP. ASP-страница является синтезом HTML и VBScript. В отличие от HTML-страниц, ASP-страницы поддерживают OLE-объекты. Это позволяет использовать в ASP-страницах программирование WMI, WSH, ADSI.

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

Используя в скриптах массивы для передачи данных, при определении массива задавайте заведомо большее количество элементов в массиве, чем это необходимо, например Array(1000). После занесения данных в массив переопределите размер массива с помощью функции ReDim Preserve Array(i), где i – новый размер массива. При использовании цикла For определяйте границы массивов с помощью функций Lbound(Array) – нижняя граница массива, Ubound(Array) – верхняя граница (см. Пример 1а). Существует второй способ работы с массивами, который в основном используется в программировании ADSI – использование конструкции FOR EACH element IN array (см. Пример 1б).

Пример 1а Пример 1б

i= Lbound(Array) For Each i in Array

For i To Ubound(Array) element=Array(i)

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

Наиболее простым методом упорядочивания массивов является пузырьковый метод. Суть метода заключается в том, что при несоблюдении условия упорядочивания массива смежные элементы меняются местами. Тем самым элементы массива становятся друг за другом в заданном порядке – происходит упорядочивание.

For j=0 to Ubound(Array)

For i=0 to Ubound(Array)

If StrComp(Array_sort(i),Array_sort(i+1),0)=1 Then

Осуществление процедуры поиска в независимости от регистра символов является задачей, решать которую приходится очень часто. Для обеспечения процедуры поиска формируется массив, среди элементов которого происходит поиск. Для того чтобы сделать функцию поиска нечувствительной к регистру символов, необходимо использовать функцию, преобразующую все символы строки в большие или в маленькие. Это касается как элементов массива, так и искомой строки. Для преобразования строки в маленькие буквы используют функцию Lcase(string), для преобразования в большие – Ucase(string).

For i=0 to Ubound(Array)

if Instr(Lcase(Array(i)),LCase(SearchString)) then

MsgBox «Строка найдена»

MsgBox «Строка не найдена»

Active Directory (AD) – это служба каталогов, которая является иерархической базой данных, обеспечивающей централизованное управление сетью. Active Directory хранит в себе информацию об объектах сети и обеспечивает доступ к этой информации пользователям, компьютерам и приложениям.

Active Directory обладает следующими особенностями:

  • Масштабируемость. В отличие от большинства других баз данных, которые являются реляционными, база данных Active Directory является иерархической. В базах данных взаимосвязи между записями определяются при помощи ключей, которые хранятся совместно с данными. В иерархической базе данных взаимосвязи между записями имеют характер «родитель-потомок»: каждая запись, за исключением корневой, обладает родительской записью. У каждой родительской записи может быть один или несколько потомков. Иерархическая база данных позволяет хранить большое количество объектов, при этом быстро получать доступ к необходимым объектам.
  • Поддержка открытых стандартов. Active Directory объединяет в себе концепцию пространства имен интернета со службой каталогов Windows NT, что позволяет объединить и управлять различными пространствами имен в разноразрядных аппаратных и программных средах. Для управления пространством имен Active Directory используется библиотека интерфейса службы активного каталога (Active Directory Service Interface – ADSI).
  • Поддержка стандартных форматов имен. Active Directory поддерживает несколько общих форматов имен. Этот факт позволяет приложениям и пользователям получать доступ к каталогу, применяя наиболее удобный для них формат:
Рубрика: Карьера/Образование / Образование
Формат Описание
UPN Формат основного имя пользователя (User Principial Name, UPN) описан в RFC 822. UPN известны как адреса электронной почты. AD обеспечивает «дружественные» имена в этом формате, таким образом, в качестве имя для входа в сеть пользователь может использовать как имя учетной записи SAM, так и имя в формате RFC 822, например NIvanov@company.com
LDAP URL Имена LDAP (см. RFC 1779, 2247), имеющие более сложную структуру по сравнению с URL именами, которые построены на основе протокола X.500. Имена URL LDAP состоят из следующих частей: CN, OU, DN.

CN расшифровывается как Common Name (общее имя), OU означает организационную единицу (Organization Unit) и DN означает контроллер домена (Distinguished Nаme – отличительное имя). Часть отличительного имени «DC=» делает возможным подключения каталогов X.500 к пространству имен DNS.

Пример, LDAP://www.domain.ru/CN=NIvanov, OU=Support, OU=Developers или LDAP:// CN=NIvanov, OU=Support, OU=Developers, DN=ru, DN=domain, DN=www

UNC UNC или канонический вид (Active Directory Canonical Name, ADCN), который имеет стандартный вид computer.domain.com/folder1/subfolder2. В AD данный формат является путем в иерархической структуре к объекту (см. RFC 1123)

DNS и Active Directory

Для иерархического именования доменов и компьютеров в Active Directory используется система DNS, поэтому объекты доменов и компьютеров являются как частью иерархии доменов DNS, так и иерархией доменов Active Directory. Несмотря на то, что имена в обеих системах идентичны, они относятся к различным пространствам имен. Взаимодействие DNS-имен доменов и их IP-адресов в Active Directory реализовано в согласии с общепринятыми соглашениями об именовании в DNS.

Доменная система именования (Domain Name System, DNS) представляет собой базу данных, реализующую иерархическую систему именования для идентификации хостов. Основная функция DNS (см. RFC 1034 и RFC 1035) заключается в прямом и обратном разрешении имен компьютеров в IP-адреса.

База данных DNS – это древовидная структура, называемая пространством имен доменов (domain space name).

В Windows 2000 полное доменное имя (Fully Qualified Domain Name, FQDN) компьютера состоит из 2 частей:

  • Имя DNS-узла. Крайняя левая метка – это полноценное имя DNS-узла, идентифицирующее учетную запись компьютера, хранящуюся в Active Directory. Кроме того, это имя локальной учетной записи компьютера в диспетчере безопасности учетных записей (Security Account Manager, SAM) на рабочей станции или рядовом сервере (не контроллер домена). По умолчанию имя DNS-узла также используется в качестве NetBIOS-имени. Это делается для совместимости с доменами на основе Windows NT 3.51 и Windows NT 4, а также для совместимости с рабочими станциями под управлением 9х.
  • Основное имя DNS-имени домена. По умолчанию – это домен Windows, к которому относится данный компьютер (см. рис. 1).

Рисунок 1. Порядок построения имен FQDN

Кроме DNS-имен компьютеров, контроллеры домена Active Directory идентифицируются по видам предоставляемых ими служб: серверы протокола LDAP (Lightweight Directory Access Protocol); контроллеры доменов; сервер глобального каталога GC (Global Catalog). Получив указание на имя домена и службу, сервер DNS способен найти контроллер со службой искомого типа в данном домене.

Глобальный каталог (Global Catalog, GC) – это контроллер домена, в котором существуют три доступных для записи каталога: домена, схемы и конфигурации. Каталог автоматически создается при репликации Active Directory. Все разделы каталогов на сервере глобального каталога хранятся в одной базе данных каталога (Ntds.dit). Глобальный каталог хранит сведения обо всех лесах, поэтому его можно использовать для поиска любых объектов в лесу без переадресации на другие серверы. Если запрос на поиск послан по порту 389 (стандартный порт протокола LDAP), то в случае неудачного поиска запрос будет последовательно передаваться другим контроллерам домена. В том случае, если обращение идет по стандартному порту глобального каталога (GC) 3268, поиск ведется по всем разделам леса. Для безопасного доступа к службам следует использовать порты, использующие SSL:

Порт Описание
389 Порт для открытых запросов LDAP
636 Порт для запросов LDAP c использованием протокола SSL
3268 Порт для открытых запросов GC
3269 Порт для запросов GC c использованием протокола SSL

Set gc = GetObject(«GC:»)

For each child in gc

Архитектура службы каталогов Active Directory

Чтобы понять, как хранятся и обрабатываются данные в Active Directory, необходимо представлять себе, как взаимодействуют отдельные компоненты этой службы каталогов. Службу каталогов можно представить в виде многоуровневой структуры. Существует три уровня служб и несколько интерфейсов и протоколов, которые образуют полный спектр служб каталогов (см. рис. 2). Три уровня служб содержат все данные для нахождения записей в базе данных каталога. Выше уровня служб находятся протоколы и API-интерфейсы, которые обеспечивают взаимодействие между клиентами и службами каталогов или при репликации – между службами каталогами.

Рисунок 3. Архитектура служб Active Directory

Далее перечислены основные службы-компоненты Active Directory:

  • агент системы каталогов (directory system agent, DSA) формирует иерархию каталога на основе отношений родитель-потомок и обеспечивает интерфейс прикладного программирования (application programming interfece, API) для запросов на доступ к каталогу;
  • уровень базы данных является промежуточным уровнем – уровнем абстракций между базой данных и приложениями;
  • ядро базы данных (Extensible Storage Engine, ESE), работающее непосредственно с записями хранилища каталогов, различает объекты по атрибуту относительно составного каталога.
  • хранилище данных (файл базы данных Ntds.dit). С этим файлом может работать только ядро базы данных. Обращаться напрямую к этому файлу можно только с помощью программы Ntdsutil, которая находится в папке Support/Tools на диске с операционной системой Windows 2000 Server.

Клиенты получают доступ к Active Directory по одному из перечисленных механизмов:

  1. LDAP/ADSI. Клиенты, поддерживающие протокол LDAP, используют его для доступа к агенту системы каталогов. Интерфейсы службы каталогов Active Directory (Active Directory Service Interface – ADSI) служат для абстрагирования от LDAP интерфейса прикладного программирования (API), представляя COM-интерфейсы для взаимодействия с Active Directory. Однако нужно помнить, что в Active Directory используется только LDAP;
  2. MAPI. При обмене сообщениями и коллективной работе клиенты MS Outlook подключаются к агенту системы каталогов по механизму вызова удаленных процедур MAPI через интерфейс средства доступа к адресной книге.
  3. SAM. Клиенты MS Windows NT 4.0 и ранее Windows 9x подключаются к агенту системы каталогов (DSA) через SAM;
  4. REPL. В процессе репликации каталогов агент системы каталогов (DSA) Active Directory взаимодействует через RPC-интерфейс.

Объектная модель ADSI

Наглядная схема объектной модели ADSI приведена на рисунке.

Рисунок 4. Объектная модель ADSI

Схема условно поделена на три части. Используя клиента – язык программирования, скрипт получает доступ к COM-объектам. Объекты могут быть двух видов – классы и подклассы. Обращение к подклассам осуществляется через классы, однако на схеме это не показано, чтобы не загромождать рисунок. С помощью COM-объекта через протокол LDAP или WinNT сценарий загрузки получает доступ к выбранному элементу объектной модели. Пространство имен условно обозначено треугольником; квадратами обозначены классы, а кружками – подклассы. Методы доступа к каждому из перечисленных протоколов отличаются, однако можно привести пример, который наглядно демонстрирует приведенную схему:

For each SubClass in ClassName

Интерфейс ADSI поддерживает следующие провайдеры, с помощью которых осуществляется программное администрирование:

Название Протокол Описание
LDAP Provider «LDAP:» Администрирование Active Directory, Microsoft Exchange Server
WinNT Provide «WinNT:» Администрирование Windows NT, Windows 200x, Windows XP
NDS Provider «NDS:» Администрирование Novell NetWare Directory Service
NVCOMPAT «NVCOMPAT:» Администрирование Novell NetWare 3.1
IIS «IIS: Протокол IIS предназначен для управления WWW и FTP узлами по протоколу HTTP

Для определения всех доступных протоколов на вашем компьютере необходимо использовать службу ADS:

For Each provider IN obj

temp = temp + provider.name + chr(13)

Из всех перечисленных провайдеров будут рассмотрены только LDAP и WINNT.

Провайдер ADSI LDAP выполняется на клиенте ADSI и обеспечивает доступ к Active Directory.

Кроме служб каталогов Active Directory Windows 2000, LDAP-провайдер обеспечивает доступ к:

  • Netscape Directory Server;
  • Microsoft Exchange Server 5.x и выше;
  • Microsoft Commercial Internet System (MCIS) Address Book Server.

Программное управление Active Directory часто используется именно этим провайдером. Запрос провайдеру LDAP составляется в формате LDAP URL (см. RFC 1779, RFC 2247):

Провайдер WinNT ADSI поддерживает доступ к каталогам Microsoft Window 4.0/3.x, обеспечивает связь с PDC и BDC. Провайдер WinNT в основном используется для работы с принтерами. Причина проста: в отличие от провайдера LDAP провайдер WinNT рассматривает принтер не как сетевое, а как локальное устройство. Только с помощью провайдера WinNT можно управлять состоянием и очередями принтеров. Совместное использование обоих провайдеров позволит осуществлять мониторинг и управление сетевыми принтерами домена (см. статью «Управление сетевыми принтерами» в журнале «Системный администратор» №10(11) за 2003 г.). Порядок построения запроса для провайдера WinNT в формате UNC следующий:

Получив фундаментальные знания о построении Active Directory, поддерживаемых форматов имен и провайдером, принципах программирования скриптов, можно приступать к изучению объектных моделей провайдером. Как ни странно, даже исчерпывающие знания объектной модели, умение применять на практике различные методы, обеспечиваемые провайдерами, не позволяют успешно программировать ADSI. По собственному опыту могу сказать, что не зная основы (теории), которая сначала кажется лишней, невозможно добиться корректной работы скрипта в 100% случаях. Приведу один маленький, но очень наглядный пример: в статье «Управление сетевыми принтерами» в журнале «Системный администратор» №10 за 2003 г. рассказано о том, как с помощью небольшого сайта, написанном на ASP, управлять сетевыми принтерами домена. Не секрет, что сначала создаются наработки – небольшие сценарии, затем состыковывая эти небольшие отрывки между собой, получают решение какой-либо задачи. Заготовки были написаны на VBS, а сайт написан на ASP, который хоть и поддерживает VBS, все же накладывает свой отпечаток. После завершения создания сайта было замечено, что он довольно часто выдает ошибку связанную с тем, что невозможно найти базу, хотя все отрывки на VBS были оттестированы и признаны работающими корректно. Сначала грешили на репликацию двух контроллеров домена. Однако, оказалось, что проблема была в том, что имя сервера печати в провайдере LDAP необходимо было указывать в полном формате, т.е. не server, а server.domain.com. Несмотря на то, что VBS к формату имени равнодушен, для ASP это оказалось принципиальным. Посмотрите таблицу 1 и сразу станет ясно какой формат имен необходимо использовать.

Итак, знание теории и вытекающих из нее нюансов, поможет сэкономит время при создании и отладке продукта.

LDAP и ADSI информация с примерами

Кто нибудь ковырял LDAP и ADSI. Где можно инфу найти с примерами.
На microsoft-е ничего не нашел


Заранее спасибо за ответы.

31.01.2008, 14:55

Пользование ADSI в Win-app идет, а в ASP.NET почему-то нет?
При использовании обьектов DirectoryEntry, DirectorySearch в Windows app. нет никаких проблем.

Как с помощью ADSI получить список только активных компьютеров домена?
Как с помощью ADSI получить список только активных компьютеров домена? заранее спасибо

ADSI в DLL
Народ помогите найти ошибки в DLLке она компилируется но при выполнении выдает ошибки в CPU.

Использование ADSI в JScript
Народ! Кто-нибудь использовал ADSI в JScript?

Создание локальной учетной записи (Без использования ADSI)
Всем Доброго Времени суток! Подскажите пожалуйста, есть ли возмонжость создавать локального.

31.01.2008, 15:45 2
31.01.2008, 16:16 [ТС] 3
31.01.2008, 17:05 4
31.01.2008, 17:05
31.01.2008, 17:30 [ТС] 5

Спасибо, я уже вроде сам разобрался — пол дня на это убил.

Кто-нибудь знает в Питере продается ‘Сценарии ADSI для системного администрирования Windows NT/2000’?

Очень хочется эту книгу полистать

04.02.2008, 14:10 [ТС] 6

Вопрос такой: как получить ссылку на объект типа user.
Пробую так

Set user = GetObject(‘LDAP://elephant.gskaudit.spb.ru/CN=Administrator,CN=Users,DC=gskaudit,DC=spb,DC=ru’)

не получается. есть у кого-нибудь идеи, или рабочие примеры.

Заранее спасибо за ответы.

04.02.2008, 14:28 7
04.02.2008, 14:54 [ТС] 8
04.02.2008, 14:59 9
04.02.2008, 15:00 [ТС] 10
04.02.2008, 15:15 11
Visual Basic
04.02.2008, 15:17 [ТС] 12
04.02.2008, 15:26 13
04.02.2008, 15:41 [ТС] 14

то получим recordset со всеми user-ами в Active Directory
и каждого user-а можно получить с помощью GetObject(rsAd(0))
а потом уже читать все его свойства.

А чтобы получить объект user-a допустим по login_name нужно просмотреть весь recordset каждый раз вызывая GetObject и сравнивая свойство объекта с искомым login-ом

А мне хочется просто получить ссылку на user-a как на объект Active Directory. Чтобы в дальнейшем в базе данных хранить только login_name на основе которого строить ссылку на объект в Active Directory.

не получается правильно сослаться на объект.

ASP. Основы. Объекты и компоненты. Доступ к базам данных

Dynamic HTML представляет собой основное средство программирования клиента для Microsoft Internet Explorer 4.0 и выше, но такие программы просмотра Web, как Netscape Navigator, не поддерживают Dynamic HTML. На самом деле очень малая часть функциональности клиентской части, поддерживаемой различными программами просмотра, может рассматриваться как действительно кросс-платформенная.

Если Вы хотите разработать Интернет-узел, открытый для доступа самым различным программам просмотра, то должны перенести программирование с клиента на сервер. Такую возможность предоставляют Microsoft ASP (Active Server Pages — активные серверные страницы). По сути ASP не что иное, как сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML-текст. Это ключевая особенность ASP — клиент никогда не видит вашего кода, а только результирующий HTML, который воспринимает любая программа просмотра.

Листинг 4.1 демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now — функция VBScript, возвращающая текущий момент времени и дату. Если текущий час меньше 12, то приветствие задается в форме «Доброе утро!» От полудня до шести вечера сообщение имеет вид «Добрый день!», а после шести — «Добрый вечер!»

Листинг 4.1.Простой пример ASP.

Simple ASP Example

11 And Hour(Now) 17 Then

strGreeting = «Добрый вечер!»

Обратите внимание на код в листинге, окруженный специальными символами: угловыми скобками и знаками процента ( ). Такие символы означают, что это серверный код, который выполняется перед тем, как страница будет на самом деле послана программе просмотра. Если бы Вы посмотрели в Internet Explorer на результирующий HTML-текст, то увидели бы следующее (в предположении, что сейчас еще не вечер, но уже не утро):

Simple ASP Example

В этом-то и состоит суть ASP. Результат исполнения кода — обыкновенный HTML! Эту страницу можно просматривать любой программой просмотра: не только Internet Explorer, но и, например, Netscape Navigator. Иными словами, ASP предоставляет разработчику подлинную платформенную независимость

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

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

А теперь обратите внимание на ту строку, где и происходит генерация HTML-текста. Здесь для вывода приветствия используется переменная:

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

Объекты и компоненты.На самом простом уровне создание ASP-страницы — это ни что иное, как написание серверного кода для получения ожидаемого результата. Но VBScript не является полнофункциональным языком и, как только Вы приступаете к построению более сложных страниц, его выразительных средств начинает не хватать. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы. Собственно говоря, в VBScript отсутствуют какие-либо встроенные средства доступа к каким бы то ни было внешним источникам данных. Так как же в таком случае при помощи ASP выполняются такие сложные действия, как доступ к данным? Ответ будет таким: нужно дополнить VBScript объектами и компонентами ASP.

ASP-объекты и компоненты — это не что иное, как компоненты ActiveX, подобные обычным DLL ActiveX, с которыми Вы наверняка работали в Microsoft Visual Basic. Различие между объектами и компонентами ASP состоит в том, каким образом они появляются в программе. ASP-объекты — это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server. А вот ASP-компоненты представляют собой DLL, существующие вне структуры ASP. Эти компоненты могут быть написаны на любом языке, а некоторые по­лезные ASP-компоненты просто поставляются в комплекте с Visual InterDev. ASP-компо­ненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.

Файл GLOBAL.ASA.Одна из главных трудностей разработчика для Интернета, независимо от того, какую технологию он использует, состоит в том, как сложно создать в Интернете настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой по сути лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе. Коренная проблема для всех Web-приложений такова: как показать, что это именно приложение?

Определить приложение в среде Microsoft Windows довольно просто. Приложение запуска­ется двойным щелчком значка и завершается, когда в меню File выбран пункт Exit. В проме­жутке между двумя этими событиями данные хранятся в переменных. Но для Интернет-при­ложений это не так. Как определить, когда приложение начинается, а когда заканчивается? Можно сказать, что приложение начало работу, если пользователь зашел на узел и просмат­ривает одну из его страниц. Но что если он переходит к другому узлу, а через пять минут возвращается? Приложение все еще активно? А если пользователь отсутствовал час или два?

Проблема определения моментов запуска и завершения приложения оказывает серьезное влияние на правильное управление переменными и последовательностью выполнения. К счастью, ASP предлагает решение. Оно состоит в том, что для определения начала и завер­шения — как всего приложения, так и отдельных пользовательских сессий — используется специальный файл под названием GLOBAL.ASA. На этот файл возложено реагирование на четыре ключевых события узла: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии). В листинге 4.2 приведен типичный файл GLOBAL.ASA.

Листинг 4.2.Файл GLOBAL.ASA.

Для обозначения разделов сценария GLOBAL.ASA содержит теги

Хотя GLOBAL.ASA отмечает начало и завершение приложения при помощи событий, оста­ется неясным, что же все-таки составляет собственно приложение. Одна из рабочих форму­лировок, предложенная Microsoft, определяет Интернет-приложение как виртуальный ката­лог со всеми его файлами. Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.

Согласно этому определению с приложением одновременно могут работать несколько про­грамм просмотра. Но событие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога. Когда затем страницы из этого ката­лога запрашивают другие пользователи, возбуждается только событие Session_OnStart.

В то время как приложение может относиться к нескольким программам просмотра, обра­щающимся к одному и тому же множеству Web-страниц, сессия касается какой-то одной программы просмотра, обращающейся к тем же Web-страницам. Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога. Если же пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd. Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.

В качестве примера рассмотрим следующий сценарий. Два пользователя намереваются посе­тить на Web-узле приложение Magazine. Пользователь 1 оказывается проворнее и быст­ренько запрашивает Web-страницу DEFAULT.ASP. Тут же возбуждаются события Application_OnStart и Session_OnStart. Буквально пятью минутами позже к приложению обращается пользователь 2. Поскольку пользователь 1 как-то проявлял себя в течение последних 20 минут, приложение Magazine активно. Следовательно, возбуждается только событие Session_OnStart, сигнализируя о начале новой сессии. Кроме того, теперь для завершения приложения необходимо, чтобы завершились обе сессии.

В течение следующих 15 минут пользователь 1 не запрашивает ни­каких страниц приложе­ния Magazine. Поскольку он не проявлял активности на протяжении 20 минут, ASP приходит к выводу, что пользователь 1 закончил свою работу с приложением, и возбуждает событие Session_OnEnd. Но приложение все еще активно, поскольку в течение последних 20 минут к нему обращался пользователь 2.

Пользователь 2 работает с приложением еще час, то и дело запрашивая новые Web-страницы. Но в конце концов он отключается, а через 20 минут после того, как он покинул узел (точнее, в последний раз запросил Web-страницу приложения), возбуждается событие Session_OnEnd. Поскольку пользователь 2 был последним пользователем данного приложения, оно завершается, и возбуждается событие Application_OnEnd.

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

Объект Application.Объект Application (приложение) позволяет создавать переменные приложения (application variables) — переменные, доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога.

В листинге 4.3 приведен пример программы, которая использует Объект Application. В нем переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.

Листинг 4.3.Объект Application.

Эта страница последний раз посещалась:

Создание переменной приложения сводится к адресации объекта Application именем новой переменной, которую вы хотите создать. Например, следующий код создает новую переменную приложения с именем Company и присваивает ей значение NewTech.

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

Поскольку такие переменные доступны нескольким пользователям одновременно, вы не сможете гарантировать, что два пользователя не попытаются одновременно присвоить одной и той же переменной разные значения. Для разрешения подобных коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, а не только переменную, вы хотите изменить, поэтому сразу же после изменения значения переменной разблокируйте объект:

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


Объект Session.Зачастую разработчиков меньше интересуют данные, совместно используемые несколькими пользователями, зато гораздо больше — данные, связанные с конкретным пользователем. ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables).

Листинг 4.4 демонстрирует, как определить несколько переменных сессии в файле GLOBAL.ASA. Само по себе их определение так же просто, как и в случае переменных приложения. Все, что нужно сделать — это адресовать объект Session именем переменной, которую вы хотите создать. Основное различие между переменными этих объектов — их области видимости. Переменные сессии предназначаются для одного пользователя и живут, пока пользователь поддерживает сессию. Как только в течение 20 минут (по умолчанию) пользователь не обращается к страницам данного виртуального каталога, данные пропадают.

Листинг 4-..Создание переменных сессии.

Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web-странице приложения, в котором эти переменные были первоначально созданы. Получить значения переменных сессии можно, считывая их из объекта Session. Следующий фрагмент кода считывает переменные сессии, созданные в листинге 4.4, и выводит их в полях ввода:

Ранее мы определили Интернет-приложение как лишенные статуса транзакции между Web-сервером и программой просмотра. Как же тогда ASP запоминает переменные сессии для каждого пользователя приложения? Ответ будет таким: эти переменные сохраняются на сервере для каждого клиента. Программа просмотра получает от сервера уникальный идентификатор, позволяющий определить, какой набор переменных кому принадлежит. Клиент этот идентификатор (Globally Unique Identifier, GUID) сохраняет, а впоследствии посылает серверу и получает именно ему предназначенные данные. Таким образом каждый клиент может иметь свой набор данных в каждом Интернет-приложении.

Осталось сказать, что для установки или считывания впемени жизни сессии (в минутах) применяется свойство Timeout объекта Session:

Объект Request.Для передачи данные клиенту создается Web-страница, а для передачи данных в обратном направлении программа просмотра использует отправку формы (form submission). В форме содержатся текстовые поля, переключатели и т.п. Клиент размещает введенные данные в этих полях и пересылает пакет серверу. Процессом передачи формы управляют два атрибута тега

Элемент формы с типом SUBMIT — это кнопка, нажатие которой пользователем заставляет программу просмотра упаковать данные формы и отправить их. Формат пересылки данных определен строго и сервер знает, чего ожидать от клиента. Данные имеют вид пар Поле=Значение,отсылаемых серверу в формате открытого текста. Если в предыдущем примере ввести в поле Name NewTech и info@newtech.com в поле Email, то сценарию DATA.ASP будет послан следующий текст:

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

Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию. Если для отправки данных используется метод GET или сценарий вызывается с передачей параметров прямо в гиперссылке

то для разбота данных применяют свойство Request.QueryString, который работает так же, как Request.Form. Следующий фрагмент кода вернет значение поля Name из гиперссылки:

Другое свойство — Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра. А листинг 4.5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.

Листинг 4.5.Определение компьютера пользователя.

Вы вошли с компьютера

Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.

Объект Response.Этот объект управляет содержимым страницы, которую ASP возвращает программе просмотра. Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response. Так что следующие две строки кода эквивалентны:

Поскольку объект Response используется очень часто, такое сокращение оправдано.

Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти. Рассмотрим такой фрагмент кода, показывающий текущее время и дату:

Когда IE запрашивают страницу с этим кодом, на сервере выполняется сценарий, и на странице появляется текущее время. Однако, если программа просмотра переходит к другой странице, а затем возвращается к этой, со временем, то время не изменится, поскольку IE не запрашивает ее повторно. В листинге 4.6 приведена исправленная версия примера, устаревающая уже в момент загрузки.

Листинг 4.6.Страница, устаревающая уже в момент загрузки.

Forcing a Page to Expire

Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:

Объект Server.Объект Server (сервер) представляет собой в некотором роде свалку — в том смысле, что предоставляемые им функции никак не связаны между собой, за тем исключением, что все они полезны разработчику для Интернета. Пожалуй, самая важная из всех функций объекта Server — это метод CreateObject, который создает экземпляр компонента ActiveX. Причем это может быть как встроенный компонент, входящий в комплект поставки, так и тот, который написали Вы сами на любом языке. В любом случае использование компонента ActiveX на сервере требует вызова метода CreateObject.

Аргументом метода CreateObject служит ProgID (программный идентификатор) требуемого компонента ActiveX. ProgID — это содержательное имя компонента, такое как Excel.Sheet или Word.Basic. Следующая строчка показывает, как при помощи CreateObject создать экземпляр компонента с ProgID Excel.Sheet.

Set MyObject = Server.CreateObject(«Excel.Sheet»)

Другим полезным методом объекта Server является MapPath, возвращающий фактический путь, соответствующий заданному виртуальному каталогу.

Компоненты ASP — это на самом деле просто компоненты ActiveX, наподобие тех, что Вы можете сами создать на Visual Basic или Visual C++. Но эти компоненты написаны Microsoft и поставляются вместе с Visual InterDev. Они предназначены для выполнения полезных для Web-узлов задач общего характера, включая доступ к данным. Создать их на своей странице Вы можете при помощи метода CreateObject объекта Server, а как только они созданы, смело обращайтесь к их свойствам и методам для выполнения нужных Вам задач.

Компонент ActiveX Data Objects.Самым полезным изо всех компонентов ASP следует признать компонент доступа к базам данных, называемый также ActiveX Data Objects, или сокращенно ADO. Он и содержащиеся в нем объекты применяются для чтения и записи данных в источники данных ODBC при публикации в Web информации из баз данных.

Объект Connection (подсоединение) создается методом CreateObject объекта Server, и ссылка на него помещается в переменную. Когда объект создан, его можно использовать для открытия подсоединения к любому источнику данных ODBC. Следующий фрагмент кода устанавливает подсоединение к источнику данных ODBC с названием Publications:

‘ Создаем объект Connection

Set objConnection = Server.CreateObject(«ADODB.Connection»)

‘ Открываем подсоединение к источнику данных

objConnection.Open «Publications», «sa», «» %>

Здесь objConnection — переменная для объектной ссылки на экземпляр объекта Connection. Метод Open устанавливает подсоединение, принимая в качестве аргументов имя источника данных, идентификатор пользователя и пароль.

Когда подсоединение установлено, получать информацию из источника данных можно при помощи объекта Recordset (набор записей). Этот объект умеет выполнять оператор SELECT языка SQL и возвращать набор записей, удовлетворяющих этому запросу. Как и объект Connection, Recordset создается методом CreateObject. В следующем примере программа выполняет оператор SELECT над источником данных, представленным переменной objConnection:

После того, как записи получены, для передвижения по ним можно обращаться к методам MoveFirst, MoveLast, MoveNext и MovePrevious. Затем метод Write объекта Response помещает данные на Web-страницу, которая и посылается программе просмотра. В листинге 4.7 приведен полный пример ASP-страницы, которая строит список пользователей, со­держащихся в источнике данных Data.

Листинг 4.7.Построение списка при помощи ADO.

Одна из основных задач в управляемом данными Web-приложении — управление информацией в объекте Recordset. Очень часто простой запрос возвращает гораздо больше данных, чем имеет смысл показывать. Давайте, например, посмотрим, что происходит, когда Вы обращаетесь к какой-либо поисковой системе в Интернете. Поисковая машина, получив ключевое слово, возвращает ссылки на узлы, где это ключевое слово встречается. Но зачастую обнаруживаются тысячи узлов, содержащих данное ключевое слово. Совершенно очевидно, что показать все эти узлы на одной Web-странице совершенно невозможно.

Выход состоит в разбиении на страницы (paging). Этот механизм реализован во всех поисковых системах для передачи за один раз некоей порции результатов запроса, скажем, из 10 записей. Теперь пользователь может эффективно работать с полученной информацией. Поддерживает разбиение на страницы и ADO — посредством нескольких свойств объекта Recordset: PageSize, PageCount и AbsolutePage.

При получении набора данных можно указать, что записи следует разбить на страницы. Количество строк набора данных, составляющих страницу, задается значением свойства PageSize. Затем можно определить общее количество страниц в наборе данных посредством свойства PageCount. А доступ к заданной странице обеспечивает свойство AbsolutePage.

В листинге 4.8 приведен полный пример, в котором пользователь может просматривать 10 записей за раз. Переменная сессии CurrentPage отслеживает текущую страницу. Пользователь может перейти к предыдущей порции данных или к следующему набору из 10 записей, выбрав одну из двух гипертекстовых ссылок на странице.

Листинг 4.8.Разбиение набора данных на страницы средствами ADO.

Сценарии для 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).

Visual Basic
Листинг 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 существует, нужно оценить те свойства и методы, которые он предоставляет, чтобы найти подходящий метод или свойство.

m_i_kuznetsov

Максим Кузнецов о разработке программного обеспечения

То, что действительно важно, но чему нигде не учат

Ссылка на оригинальную запись из блога Криса Шифхауэра: Implement Active Directory Authentication in ASP.NET MVC 5.

1. Файл AccountController.cs

2. Файл AccountViewModels.cs

Posts from This Journal by “программирование” Tag

Зарплаты IT-специалистов в первом полугодии 2020 года

Зарплаты ИТ-специалистов: отчёт сервиса зарплат «Моего круга» на Хабре. Зарплаты по основным ИТ-специализациям Маркетинг падает в цене.…

Системная архитектура. Терминология

Давным-давно я в своём блоге дал короткое описание модели представления архитектуры 4+1, она же модель Филиппа Крухтена. В последнее время пришлось…

Ссылка: и ещё немного рефакторинга

Рефакторинг от Рефакторинг.Гуру

Закон пропорциональности ошибок

«Чем более программа необходима, тем больше в ней ошибок.» Следствие: «Ошибок не содержит лишь совершенно…

Час одиночества — и новый значок на китель!

Ну вот, первое запланированное мероприятие успешно завершено :) Теперь я сертифицированный разработчик C#. О том, что собственно…

Как очистить кэш аутентификации в IE

Возникла проблема. Для входа пользователя на сайт по сертификату используется двусторонняя аутентификация. TLS и всё такое. Работает.…

Типы данных и архитектура процессора

Некоторые опыты с кодом, результаты которых нуждаются во внимательном изучении. И это только сложение простых чисел! В общем, смотрите и думайте.…

Просмотр дизассемблированного кода в VisualStudio

Речь пойдёт не о промежуточном коде IL, а об инструкциях процессора, сформированных JIT-компилятором. *** В процессе отладки кода бывает необходимо…

Общие замечания об анализе действующей информационной системы

Сегодня я затрону очень большую тему — анализ ИС, находящейся в промышленной эксплуатации. С этой темой связан огромный пласт работы системного…

Переход на механизмы авторизации и аутентификации ADFS как часть маркетинговой стратегии

Статья будет интересна всем, кто хочет узнать значение страшного термина «Active Directory Federation Services» на примере из реальной жизни, а также всем, кто занимается разработкой кастомных систем на базе SharePoint и находится в процессе принятия решения, какую модель авторизации и аутентификации выбрать, либо собирается переключить существующее решение на ADFS.

А самое главное, она пригодится тем, кому важны потребительские качества IT-продукта, его значение и удобство для конечного пользователя.

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

Это система лояльности для кассиров, которые продают услуги нашего заказчика. Выполнена на MS SharePoint. Через портал кассиры копят бонусы и получают за них подарки (сувенирку, турпутевки, подарочные карты и т.п.) Компания таким образом может гибко управлять продажами нужных «позиций», анализировать работу кассиров и агентств и много еще чего полезного.

Мы разрабатывали программу лояльности с самого начала. Первый релиз состоялся в феврале 2013 года. Развитие системы продолжается. Например, только что мы провели полный редизайн портала. Но этому предшествовала миграция на ADFS, как важнейший этап модернизации. Об этом — дальше речь.

Вкратце схему работы ADFS можно описать так:

Клиент заходит на портал, веб-сервер портала перенаправляет клиента на сервис ADFS для авторизации. Здесь клиент проходит авторизацию и получает от сервиса авторизации «CLAIM» (маркер), затем с помощью данного маркера авторизуется на портале.

Миграция на ADFS

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

В данном случае требовалось не создание решения с нуля, а «миграция авторизации» с «classic ntlm» на ADFS. И мы пошли своим классическим путем отработанной многоэтапной подготовки к переносу:

  1. Развернули у себя на тестовой площадке прототип решения и начали отрабатывать ошибки.
  2. Убедившись, что все заработало, составили документацию по развертыванию решения и отправили ее заказчику, чтобы он развернул решение у себя.
  3. Протестировали у заказчика на тестовой конфигурации.
  4. Успешно провели боевую миграцию.


Анализируем собственное решение

Итак, для начала анализируем, что нам нужно для перехода:

  1. У нас есть список пользователей сайта (несколько тысяч), которых надо заменить на claim записи.
  2. У нас есть списки и библиотеки документов с кастомными разрешениями. И нужно, чтобы после миграции у новых пользователей права остались прежними.
  3. У нас есть куча кастомного кода (веб-части, страницы, хендлеры и т.д.), в котором проверяется уровень доступа пользователя через AD. Все это надо прорефакторить и переписать с учетом того, что пользователи могут быть клеймовые.
  4. Так как мы переключаем на ADFS не весь портал, а только отдельный узел, то придется узел выделить в отдельное веб-приложение. Но часть данных используется с корневого узла, поэтому необходимо вынести слой работы с данными в WCF-сервис, с помощью которого будем эти данные в нашем новом приложении получать.

Начинаем процесс:

    Начали с 4 пункта – выделения получения данных с корневого узла в отдельный сервис и последующего отделения нашего узла в отдельное приложение.

По первой части особых проблем не возникло – обыкновенный рефакторинг кода и настройка WCF сервиса. Пара недель – и все работает.
С отделением узла в отдельное приложение возникли некоторые сложности. В основном они были связаны с тем, что надо было при импорте/экспорте убедиться, что все данные сохранились, юзеры перетащились, права остались. Но так как данных на узле было достаточно много, то процедура импорта/экспорта занимала часа 3, и при неудачном исходе приходилось все это дело запускать заново и терпеть снова.

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

После долгих и мучительных поисков причин выяснилось: проблема в том, что портал был ранее мигрирован с SharePoint 2007 на SharePoint 2010, и в схеме списков описание поля типа User было неполным. Пришлось для начала прогонять утилиту (написанную своими руками), потом опять делать экспорт/импорт. После этого импорт состоялся успешно.
Теперь можно переключать новое приложение на ADFS. Идем по стандартной процедуре:

a. Устанавливаем доверенный ADFS-сервер и сертификат через powershell скрипт

b. Меняем настройки аутентификации приложения

c. Мигрируем юзеров для того чтобы все разрешения стали через Claims (опять через powershell скрипт)

d. После этого обновляем все существующие учетные записи и приводим их к Claim записи вида i:0e.t|ADFS Federated Server|user@company
После этого все заработало в целом. Потом еще долго тренировались локально и на тестовых серверах.

Боевое переключение и проблемы

Боевое переключение делали в субботу, так как время только на экспорт/импорт уходило около 5 часов. В итоге со всеми мелкими проблемами начали в 9 утра, закончили в 12 ночи :)

В целом все заработало сразу нормально, так как до этого все оттренировали и оттестили на тестовом окружении. Но вылез один баг, который на тестовом у нас не повторялся никогда (и до сих пор не повторяется) — проблема логаута в Internet Explorer.

Суть в следующем:

Для выхода используется редирект на страницу ADFS-сервера вида adfs.ru/adfs/ls/?wa=wsignout1.0&Source=yoursiteurl

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

Так вот, чтобы выход в SharePoint прошел корректно, необходимо при вызове этой страницы выхода передать в запросе авторизационный cookies FedAuth/

Как оказалось, в IE это происходит не всегда, и получался эффект, когда мы жмем выход, но выйти не можем.

В итоге пришлось немного подправить url выхода, чтобы после отработки страницы логаута ADFS вызывалась напрямую страница логаута SharePoint, а после нее обратно страница авторизации ADFS:

Заключение

Почему миграция программы лояльности на ADFS оказалась важна для заказчика?

  1. ADFS дает возможность авторизоваться на портале с помощью дружелюбного логина-пароля вместо устрашающей стандартной Windows Authentication формы. Также, если пользователь забыл пароль, система любезно его подскажет, не нужно будет разыскивать админа и доказывать ему, что ты не верблюд.
  2. Такой вход можно брендировать корпоративными цветами и символикой и подогнать под единые корпоративные визуальные стандарты.
  3. ADFS дает возможность настроить single sign on авторизацию, и юзеры смогут не плодить учетные записи, а заходить в систему с помощью своих аккаунтов в соцсетях. Что не может не сказаться на их душевном равновесии и позитивном настрое на работу :)
  4. ADFS отлично подходит для применения в таких сложных систем, как нашего заказчика, т.к. предоставляет функционал единого входа к разным веб-приложениям в течение одного сеанса работы.

Asp методы объектов adsi

Здравствуйте товарищи! Рад, что вы вновь заглянули на IT блог pyatilistnik.org. Я уже неоднократно вам рассказывал, о разных вещах посвященных активному каталогу (Active Directory), но так и не касался, довольно повседневной функциональности в виде редактора атрибутов AD. Сегодня я исправлю, этот недочет и мы с вами разберем. Что из себя представляет редактор атрибутов Active Directory, как его открыть, что он вам даст в вашей работе и как позволит эффективно его использовать. Думаю для многих инженеров или системных администраторов будет очень полезно, освежить знания в данной области.

Что такое редактор атрибутов Active Directory

И так ранее мы с вами установили Active Directory, и разобрались со всеми понятиями активного каталога, из которых мы выяснили, что администратор, получает информацию о всех объектах схемы в виде красивого графического интерфейса, например, оснастки ADUC, а вот контроллеры домена и другие компьютеры, получают информацию об объектах в виде языка LDAP, который лежит в основе Active Directory.

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

Приведу простой пример использования редактора атрибутов:

  • Необходимо узнать distinguished name
  • Задать automapping для почты пользователю с правами только на чтение

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

Как открыть редактор атрибутов Active Directory

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

  • использование оснастки Active Directory пользователи и компьютеры
  • использование Active Directory Administrative Center
  • использование ADSI Edit редактора
  • использование оболочки powershell

Ниже я хочу подробно рассмотреть, где и как редактировать атрибуты в данных инструментах.

Просмотр и редактирование атрибутов Active Directory в оснастке ADUC

Заходим в меню «Пуск», в котором находим пункт «Active Directory Пользователи и компьютеры» либо откройте окно «Выполнить» и введите служебное название dsa.msc. (Полный список названий служебных сокращений Windows, читайте по ссылке слева)

У вас откроется ADUC. Если вы зайдет в свойства любой учетной записи, в моем примере это Барбоскин Геннадий, то обнаружите, что редактор атрибутов в списке вкладок отсутствует. Чтобы его отобразить сделайте следующие действия.

Открываете вкладку «Вид», в меню находите пункт «Дополнительные компоненты», включаем его.

После чего, вкладка редактора атрибутов отобразиться в свойствах учетной записи объекта Active Directory.

Вот так вот выглядит редактор атрибутов Active Directory. У вас в виде списка будут перечисляться атрибуты и их значения. Если они доступны для редактирования, то вы их можете изменить, с помощью специальной кнопки. Сразу бросаются в глаза знакомые значения:

  • CN (Common Name) — Отображаемое имя
  • LastLogon — время логирования
  • Discription — Описание

В момент изменения будет открыт редактор строковых или целочисленных атрибутов.

По умолчанию Active Directory в редакторе атрибутов, отображает, только атрибуты со значениями, то есть не пустые. Для того, чтобы увидеть все атрибуты, вам необходимо применить фильтр, через соответствующую кнопку. Снимите галку «Отображать только атрибуты со значениями». Так же можно более тонко настроить фильтрацию и задать, например, показывать, только атрибуты доступные для записи (изменения вручную) или только системные. Я вам советую посмотреть все варианты и проверить, что каждый из них отображает. Переходим к ADSI Edit.

Редактирование атрибутов Active Directory в ADSI Edit

Напомню, что ADSI Edit — это служебная оснастка, которая позволяет подключаться к различным разделам базы данных Active Directory (Ntds.dit). Открыть «Редактор ADSI», можно также из меню «Пуск» на контроллере домена, либо так же через окно «Выполнить» (Сочетание клавиш WIN и R). Введите adsiedit.msc.

Далее в оснастке, кликните правым кликом по «Редактирование ADSI» и выберите «Подключение к»

Для того, чтобы зайти в редактор атрибутов, выберите пункт «Выберите известный контекст именования». Подключаемся к стандартному, идущему по умолчанию.

Перед вами будет привычная вам структура из контейнеров и организационных подразделений. Переместитесь в нужное расположение и откройте свойства нужного вам объекта Active Directory.

Вы попадете на вкладку «Редактор атрибутов», который мы с вами уже видели в оснастке «Пользователи и компьютеры». Можете производить редактирования. Перейдем к третьему методу, использование Active Directory Administrative Center.

Редактирование атрибутов Active Directory в Центр администрирования Active Directory

Третий метод просмотра атрибутов у объектов AD, заключается в использовании оснастки «Центр администрирования Active Directory» (Active Directory Administrative Center). Открываем его через пуск или набрав команду в окне «Выполнить» dsac.exe.

Если кто-то не в курсе, то Центр администрирования Active Directory — это оснастка построенная на оболочке power shell, все что вы тут выполняете, делается в фоновом режиме именно этим языком, плюс вы всегда на выходе графических манипуляций, получите полную команду, как это делалось бы в power shell. Переходим в нужное расположение объекта.

Открываем его свойства, переходим на вкладку «Расширения» и перед вами будет, знакомый редактор атрибутов AD. Вот так вот его запрятали. Хочу отметить, что начиная с Windows Server 2012 R2, компания Microsoft старается продвигать все работы с объектами Active Directory именно в этой утилите и оснастке power shell и это понятно, у последнего возможностей в разы больше, чем у GUI собратьев. Поэтому, кто еще пока с ним не знаком, будет очень полезно начать именно с оснастки «Центр администрирования Active Directory», которая имеет подсказки, как все сделать через оболочку power shell.

Редактирование атрибутов Active Directory в Power Shell

На текущий момент самой актуальной версией power shell является 5-я, и компания Microsoft каждый год расширяет возможности данного языка на несколько сотен командлетов, помогая автоматизировать все, что вы хотите и удовлетворить потребности людей любящих операционные системы семейства Linux, например, CentOS. Чтобы посмотреть атрибуты пользователя, нам поможет командлет Get-ADUser и для того, чтобы изменить атрибут Set-ADUser.

Открываете power shell от имени администратора, первым делом необходимо выполнить импортирование модуля Active Directory, для того, чтобы вам подгрузились команды, отвечающие за доступ и получение информации с контроллеров домена, это можно делать на любой рабочей станции, у которой установлена операционная система не ниже Windows 7.

Вводим команду: Import-Module activedirectory. После чего запросим информацию о пользователе Барбоскине.

Как видите атрибутов Active Directory не так много вывелось, добавим ключик -Properties *

В итоге вывод оказался очень информативным.

Более подробно про вывод командлета Get-ADUser читайте на сайте Microsoft. Теперь давайте изменим, например, для пользователя Барбоскин его домашнюю страницу, для этого пишем:

Set-ADUser -Identity barboskin.g -HomePage ‘http://pyatilistnik.org’

Как видите операционная система Windows позволяет вам редактировать и взаимодействовать с редактором атрибутов Active Directory разными методами, каждый вы будите использовать в разных ситуациях, для единичных изменений, вероятнее всего ADUC, для автоматизации, это будет несомненно power shell. Наверняка, есть еще и сторонний софт, но зачем он нужен, когда все идет из коробки.

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