(Notes) 2003

Сценарии ADSI

Написание ADSI-сценариев особой сложности не представляет - надо только четко уметь работать с иерархической базой данных, какой является Active Derectory. Поскольку я довольно долго работал программистом на VB6, то на этой страничке я дам пару советов для начинающих:

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

Итак, если эти два аргумента принимаются, то надо только поставить ссылку на библиотеку Active DS Type Library - и все - можно начинать:


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

На верхнем уровне дерево имеет три ключа:

и так далее - самый последний уровень - это атрибуты (Property) низших обьектов (Object) иерархии.

Вопрос навигации по иерархической базе - это отдельный вопрос. Так же для навигации по дереву XML-документов используется отдельный язык XPath, так же для навигации по Active Directory используется специальный язычок ADsPath. Грубо говоря, для доступа к конкретному обьекту, после LDAP:// можно перечислять контейнеры либо сверху (от корня дерева) вниз, либо снизу вверх. Лично мне проще работать сверху вниз.

Более подробно о протоколе LDAP можно почитать в конце этой странички, посвященной настройке QMAIL.


Сам по себе Windows работает с этой базой с помощью нескольких провайдеров - читай драйверов - обеспечивающих доступ к этой базе. Эти провайдеры хорошо видны в реестре (этот же список провайдеров можно увидеть и из сценария ADSI):


Через 389 порт Windows отправляет запросы к этой базе:

Фактически Windows работает довольно сложно - достаточно только посмотреть на количество параметров для прямого доступа к Active Directory - Вот именно для того, чтобы не ввязываться во весь этот гимморой и были придуманы специальные унифицированные интерфейсы - Active Directory Service Interface - ADSI.


Для каждого из вышеперечисленных провайдеров доступа к базе существует несколько стандартизированных интерфесов - обьектов с четко описанными свойствами и методами. Их довольно много - например, для вот сколько обьектов у провайдера Winnt. Это обеспечивает всю функциональность и гибкость Windows - этими обьектами можно манипулировать учетными записями компьютеров, пользователей, группами, правами, очередями принтера и еще черт знает чем. Часть этих функций реализована в диалоговых окнах работы с Active Directory, а большая часть доступна только программно из сценариев ADSI. Пример параметра, который не упоминается в графических оснастках - BadLoginCount - счетчик, в котором записано количество неверных попыток ввода пароля при попытке зарегистрироваться в Windows - из сценария ADSI этот параметр можно обнулить или, наоборот, заблокировать учетную запись, записав в него большое значение.


Чтобы как-то ограничится на конкретном примере, рассмотрим интерфейс IADSContainer, который позволяет перечислить все дочерние обьекты заданного обьекта в иерархической базе. Этот обьект позволяет создать утилиту, подобную 2-3 рисунку на данной страничке или выгрузить провайдером IIS все параметры Exchange или даже просто выбросить на листик Excel мои злосчастные 1700 пользовательских логинов (последнее также можно сделать также встроенными утилитами Windows - CSVDE, LDIFDE). В примере мы также ограничимся самым простым провайдером - WinNT.


Вот теперь мы подошли ближе к телу - непосредственно к сценариям на Visual Basic for Excel. Итак, ставим на форму кнопку и уходим в Бейсик:

Сгружаете с моего сайта класс с этой прогой и напрямую импортируете этот класс в Excel:

После нажатия на форме кнопки - вводите имя контейнера - и получаете ЧУДО:

Обращаю ваше внимание - что для имени провайдера имеет значение регистр - надо писать именно так, как у меня. HOME - в данном случае - это имя домена, в который включен мой компьютер с именем TUALATIN. А на экране мы видим все обьекты верхнего уровня этого компьютера. Вообще-то провайдер WinNT по-правильному применяется только к локальному компу, а к контроллеру домена надо входить провайдером LDAP. Кроме того, интерфейс IADSContainer - это же просто перечислитель дочерних обьетов, а для практической работы надо пользоватся более серьезными обьектами... Но это уже дело техники и приобретается только с опытом работы - главное вы, надеюсь, поняли...

Лично я делаю всегда так - и вам очень рекомендую - поставить в цикле точку отладки и поизучать реально загруженные из Active Directory обьекты вручную отладчиком Бейсика:


И напоследок - вся документация по ADSI лежит в MSDN здесь:


Через несколько лет после написания этой странички я внес свой вклад в развитие ADSI-программирования и перевел OpenSource библиотеку ADSI-функций Томаса Еска на VB.NET.



Comments ( )
Link to this page: //www.vb-net.com/iile/adsi/index.htm
< THANKS ME>