6
88 образование образование образование образование образование ПРОГРАММНОЕ УПРАВЛЕНИЕ ADSI: LDAP В предыдущих статьях [1, 2] были рассмотрены теоретические аспекты построения Active Directory и проведен обзор доступных провайдеров, с помощью которых можно программно управлять Active Directory, а также описаны основы программирования одного из провайдеров – WinNT. Данный материал содержит основы программирования провайдера LDAP, объектная модель которого рассмотрена на примере стандартных утилит, созданных компанией Microsoft. ИВАН КОРОБКО

ПРОГРАММНОЕ УПРАВЛЕНИЕ ADSI: · PDF file№3(16), март 2004 89 образование Объектная модель провайдера LDAP Для программного

  • Upload
    voquynh

  • View
    227

  • Download
    1

Embed Size (px)

Citation preview

88

образованиеобразованиеобразованиеобразованиеобразование

ПРОГРАММНОЕ УПРАВЛЕНИЕADSI: LDAP

В предыдущих статьях [1, 2] были рассмотрены теоретические аспекты построения Active Directoryи проведен обзор доступных провайдеров, с помощью которых можно программно управлятьActive Directory, а также описаны основы программирования одного из провайдеров – WinNT.Данный материал содержит основы программирования провайдера LDAP, объектная моделькоторого рассмотрена на примере стандартных утилит, созданных компанией Microsoft.

ИВАН КОРОБКО

89№3(16), март 2004

образованиеобразованиеобразованиеобразованиеобразование

Объектная модельпровайдера LDAPДля программного управления Active Directory с помощьюпровайдера LDAP необходимо использовать его объектнуюмодель. Объектная модель представляет собой совокуп-ность объектов, которые взаимосвязаны друг с другом иобразуют между собой иерархическую структуру. Каждыйиз этих объектов имеет набор свойств, характерных исклю-чительно для объектов данного типа. Существует несколь-ко типов (идентификаторов) объектов: CN, DС, OU. Рас-шифровка и назначение каждого объекта см. в таблице 1.

Имена LDAP URLИмена LDAP URL (см. RFC 1779, RFC 2247) построены наоснове протокола X.500 и используются для связывания собъектами. Идентификаторы объектов DC, OU, CN обра-зуют полное составное имя (Distinguished Name, DN), а имясамого объекта – относительное составное имя (RelativeDistinguished Name, RDN). Полное составное имя объектавключает в себя имя объекта и всех его родителей, начи-ная с корня домена (см. рис. 1).

Существуют две формы доступа к ADSI: развернутая исокращенная. Рассмотрим принципы построения путей кресурсу двумя способами на примере домена domain.com(см. рис. 1).

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

В качестве шаблона может служить выражение вида:

где DC=Domain_name1/DC=Domain_name2/DC=Domain_na-me3 образуют полное имя контроллера домена, элементы

OU=OU_Name_Level1/OU=OU_Name_Level2…/OU=OU_Na-me_Levelµ представляют собой вложенные друг в другаэлементы. В развернутой форме доступа объект CN яв-ляется «дном колодца» в иерархии.

Пример: запрос к объекту CN=User3 с помощью раз-вернутой формы доступа выглядит следующим образом(см. рис. 1):

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

Соответственно запрос к объекту CN=User3 с помощьюсокращенной формы доступа выглядит следующим образом:

Инструменты, обеспечивающие доступк объектной модели каталогаСуществует несколько программ, предназначенных дляпросмотра объектной модели каталога. Остановимся лишьна двух из них: Active Directory Viewer (Microsoft) и LDAPBrowser 2.5.3 (Softerra).

Active Directory Viewer (Microsoft)Active Directory Viewer (ADV) является графической ути-литой, позволяющей выполнять операции чтения, моди-фицирования, осуществлять поиск в любых совместимыхкаталогах, таких как Active Directory, Exchange Server,Netscape Directory, Netware Directory.

Active Directory Viewer входит в состав SDK для ActiveDirectory Services Interface, который можно бесплатно заг-рузить с сайта Microsoft: http://www.microsoft.com/ntserver/nts/downloads/other/adsi25.

После установки SDK for ADSI утилита Active DirectoryViewer (AdsVw.exe) будет находиться в c:\Program Files\Microsoft\ADSI Resource Kit, Samples and Utilities\ADsVw\.

Программа работает в двух режимах: ObjectViewer иQuery (см. рис. 2). Для просмотра объектной модели ка-кого-либо провайдера необходимо использовать режимObjectViewer. Режим Query используется для осуществ-ления поиска объектов в выбранной объектной модели. Вданной статье режим Query рассматриваться не будет.

Òàáëèöà 1

Set obj = GetObject ("LDAP://DC=Domain_name1/ ↵↵↵↵↵DC=Domain_name2/DC=Domain_name3/OU=OU_Name_Level1/ ↵↵↵↵↵OU=OU_Name_Level2�/OU=OU_Name_Levelµ/CN=CN_Name")

Set obj = GetObject ("LDAP://DC=RU/DC=Domain1/OU=Group1/ ↵↵↵↵↵OU=Group4/CN=User3")

Set obj=GetObject("LDAP://CN=User3,OU=Group4, ↵↵↵↵↵OU=Group3,DC=Domain1,dc=RU")

Set obj=GetObject("LDAP://CN=CN_Name,OU=OU_Name_Levelµ�, ↵↵↵↵↵OU=OU_Name_Level2,OU=OU_Name_Level1/DC=�")

Ðèñóíîê 1

Ðèñóíîê 2

90

образованиеобразованиеобразованиеобразованиеобразование

Просмотр и редактирование объектной моделипрограммой ADV в режиме ObjectViewerПосле выбора режима работы ObjectViewer появится диа-логовое окно (см. рис. 3). Для получения доступа к ката-логу необходимо указать путь к каталогу и параметрыучетной записи, обладающей правами администратора(имя и пароль). Путь к каталогу должен быть построен всоответствии со следующим шаблоном:

Обратите внимание на две особенности в этом шаб-лоне: в шаблоне не должно быть пробелов, «слэши» дол-жны быть прямыми – «/». Невыполнение хотя бы одногоиз перечисленных условий приведет к ошибке в соедине-нии с каталогом. Для доступа к серверу server доменаdomain.ru с помощью протокола LDAP используется сле-дующий запрос:

После соединения с каталогом на экране будет ото-бражена его иерархическая структура (см. рис. 4). В ле-вой части экрана отображается иерархическая структуракаталога. В правой части отображаются характеристикиобъекта, на котором установлен курсор. Список свойствобъекта и соответствующих им значений приведен в«Properties» и «Property Value».

С помощью кнопок «Change», «Clear», «Append»,«Delete» можно изменять объектную модель каталога: из-менять, удалять, добавлять поля в свойствах объектов.

LDAP Browser 2.5.3 (Softerra)LDAP Browser 2.5.3 является бесплатной программой (http://www.ldapadministrator.com).

По своим возможностям программа превосходит ActiveDirectory Viewer, в использовании LDAP Browser гораздоудобнее. В процессе создания соединения с каталогоммогут быть заданы фильтры, параметры административ-

<Provider_Name:>//<Server_Name>/<Full_Domain_Name>

Ðèñóíîê 3

LDAP://server/DC=domain,DC=ru;

Ðèñóíîê 4

91№3(16), март 2004

образованиеобразованиеобразованиеобразованиеобразование

ной учетной записи, порт TCP, по которому имеет местосоединение, и другие параметры. Общий вид программыприведен на рис. 5.

Различия в функционалепровайдеров LDAP и WinNTОб одном из отличий речь велась в предыдущей статье[2] – провайдер LDAP (Lightweight Directory Access Protocol)рассматривает принтер как сетевое устройство, в то вре-мя как провайдер WinNT рассматривает принтер исклю-чительно как локальное устройство. Использование обо-их провайдеров при работе с принтерами позволяет пол-ностью управлять принтерами. Наглядный пример управ-ления принтерами домена рассмотрен в статье «Управ-ление сетевыми принтерами домена» [3].

Вторым принципиальным отличием провайдеров явля-ются расширенные возможности поиска провайдераLDAP. Используя провайдер WinNT, можно было осуще-ствлять поиск, пользуясь фильтром, который позволял осу-ществлять поиск всех объектов, принадлежащих к одно-му из классов – computer, user, service и др. Провайдерпозволяет искать объект, при этом не обязательно указы-вать класс, к которому относится объект. Найдя объект,осуществляем чтение его свойств, включая местоположе-ние объекта в AD, класс, к которому относится объект, идругие параметры.

Поиск объектов осуществляется с помощью OLEDistributed Query (DB) интерфейса, который вызывается пря-мо из интерфейса службы активного каталога (Active DirectoryService Interface – ADSI). Поиск осуществляется на основа-нии запроса и его параметров. В качестве параметров зап-роса могут быть: уровень поиска, диапазон поиска, ограни-

чение по размеру, сортировка и т. д. Форма запроса(Distributed Query) заимствована из Microsoft SQL Server.

Запрос строится по шаблону:

где путь – путь к интересующему объекту AD в форматеLDAP URL.

На практике поиск объектов осуществляется следую-щим образом:

В приведенном примере осуществляется поиск всехзарегистрированных в AD-принтеров. У найденных прин-

Ðèñóíîê 5

SELECT ïîëå11,ïîëå21,ïîëån1 FROM ïóòü ↵↵↵↵↵WHERE objectClass="òèï_îáúåêòà"

Ïðèìåð 1:Set objNameSpace = GetObject("WinNT:")

For Each Domain in objNameSpaceDomainName=Domain.Name

NextSet objConnection = CreateObject("ADODB.Connection")Set objCommand = CreateObject("ADODB.Command")objConnection.Provider = "ADsDSOObject"objConnection.Open "Active Directory Provider"Set objCommand.ActiveConnection = objConnectionobjCommand.CommandText = "SELECT printerName, serverName ↵↵↵↵↵

FROM " _ & " 'LDAP://"& DomainName & "' ↵↵↵↵↵WHERE objectClass='printQueue'"

objCommand.Properties("Cache Results") = FalseSet objRecordSet = objCommand.ExecuteobjRecordSet.MoveFirstDo Until objRecordSet.EOF

temp=temp & "Printer Name: " ↵↵↵↵↵& objRecordSet.Fields("printerName").Value ↵↵↵↵↵& " Server Name: " ↵↵↵↵↵& objRecordSet.Fields("serverName").Value & chr(13)

objRecordSet.MoveNextLoopwscript.echo temp

92

образованиеобразованиеобразованиеобразованиеобразование

теров происходит чтение двух полей: название принтераи название сервера печати.

Поиск объектов с помощью провайдера LDAP осуще-ствляется по следующему шаблону:! устанавливается соединение с Active Directory Provider

через ADODB;! составляется запрос, на основе которого будет осуще-

ствляться поиск;! осуществляется поиск по заданным критериям.

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

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

Таким образом, основываясь на приведенном приме-ре, вместо objRecordSet.Fields(«serverName»).Value мож-но записать objRecordSet.Fields(1).Value.

Третье отличие – это управление коммерческими про-дуктами, поддерживающими LDAP. Множество коммер-ческих продуктов использует каталог LDAP для храненияинформации. Используя ADSI, можно управлять коммер-ческими продуктами, в число которых входят: MicrosoftWindows 2000, 2003; Microsoft Exchange 5.5, 2000, 2003;Microsoft Site Server 3.0 + SP2; Netscape Directory Server идр. Кроме того, компании Cisco и Microsoft предложилистандарт сети на основе каталога, в котором описывает-ся интеграция сетевых устройств в каталоге LDAP.

В настоящей статье будет рассмотрен вопрос, касаю-щийся управления Microsoft Windows 200х, а именно ActiveDirectory. Рассмотрим следующие вопросы, касающиесяуправления AD через провайдер LDAP: просмотр атрибу-тов записи от анонимной и конкретной учетной записи;изменение атрибутов учетной записи; создание и удале-ние учетной записи.

Просмотр атрибутов записиот анонимной и конкретнойучетной записиПросмотр атрибутов объектов осуществляется с помощьюфункции Get(), вызову которой предшествует вызов функ-ции GetObject(). Для получения анонимного доступа к объек-там необходимо указать путь к объекту, начиная с контрол-лера домена. В приведенном примере читается идентифи-кационный номер учетной записи User3 (см. рис. 2) – UserID,которому соответствует поле uid. Объектная модель провай-дера LDAP будет рассмотрена позже. Необходимо отметить,что свойства имеют все типы объектов – OU, CN и другие.

В том случае если доступ анонимным пользователямк записям блокирован, то необходимо читать свойстваобъектов от имени учетной записи, которая имеет правана чтение свойств. Пусть пользователь User1 имеет пра-во на чтение всех полей объектов. Пароль пользователяUser1 – 1234567. Осуществим чтение идентификационногономера учетной записи User3 от имени User1. Чтение па-раметров от имени другого пользователя осуществляет-ся с помощью функции OpenDSObject():

Изменение атрибутовучетной записиМодификация атрибутов учетной записи осуществля-ется с помощью функции Put() и метода SetInfo, служа-щего для сохранения внесенных изменений в ActiveDirectory. В приведенном ниже примере атрибут учет-ной записи User3 – Canonical Name (CN) будет измененс User3 на User4.

InetOrgPerson – тип учетной записи.

Создание и удалениеучетной записиДля создания учетной записи в Active Directory необхо-димо задать несколько обязательных параметров, от-носящихся к учетной записи и ее родительскому кон-тейнеру:! создание учетной записи должно выполняться пользо-

вателем, имеющим административные привилегии;! путь к родительскому контейнеру, в котором необходи-

мо создать учетную запись;! класс создаваемого объекта;! соответствующие свойства создаваемого класса объек-

та записи.

Ïðèìåð 2:Set obj=GetObject("LDAP://CN=User3, OU=Group1, ↵↵↵↵↵OU=Users, o=domain.ru")For Each U_obj In obj

wscript.echo "UserUID: " & U_obj.Get("uid")Next

Ïðèìåð 3:Set PreObj= GetObject("LDAP:")

Set obj= PreObj.OpenDSObject("LDAP://CN=User3, OU=Group1, ↵↵↵↵↵OU=Users, o=domain.ru", "CN=User1","1234567",0)For Each U_obj In obj

wscript.echo "UserUID: " & U_obj.Get("uid")Next

Ïðèìåð 4:Set PreObj= GetObject("LDAP:")

Set obj= PreObj.OpenDSObject("LDAP://CN=User3, OU=Group1, ↵↵↵↵↵OU=Users, o=domain.ru", "CN=User1","1234567",0)

Set U_obj=obj.GetObject("InetOrgPerson","CN=User3")U_obj.Put "CN","User4"U_obj.SetInfoMsgBox "Ïàðàìåòð CN èçìåíåí."

Ïðèìåð 5:Set PreObj= GetObject("LDAP:")

Set obj= PreObj.OpenDSObject("LDAP:// OU=Group1, OU=Users, ↵↵↵↵↵o=domain.ru", "CN=User1","1234567",0)

Set U_obj=obj.Create("InetOrgPerson","CN=User3")ClassArray=Array("InetOrgPerson","person","top","organizationPerson")U_obj.Put "objectClass", ClassArrayU_obj.Put "cn", "User_Name_3"U_obj.Put "sn", "Second_Name_3"U_obj.SetInfoMsgBox "Ó÷åòíàÿ çàïèñü ñîçäàíà."

93№3(16), март 2004

образованиеобразованиеобразованиеобразованиеобразование

Для удаления учетных записей используется методDelete («InetOrgPerson», object_name).

ЗаключениеНа практике управление Active Directory преимуществен-но осуществляется с помощью провайдера WinNT или всовокупности WinNT с LDAP. В «чистом» виде програм-мирование LDAP используется очень редко. Основнаяпричина заключается в том, что для доступа к любомуобъекту с помощью провайдера LDAP необходимо знатьполный путь к этому объекту. Эта проблема легко реша-ется: происходит осуществление поиска объекта, затемчтение его свойств. Приведем пример чтения поляFullName для пользователя USER1 с помощью провайде-ров LDAP и WinNT.

Ïðèìåð 6 a) - WinNT:Set obj=GetObject("WinNT:")

For Each str In objDomainName=str.NameNext

Set UserName="Value"Set element=GetObject("WinNT://" & DomainName & "/ USER1")Msgbox "FullName: "+ cstr(element.FullName)Ïðèìåð 6 á) - LDAP:set rootDSE_ = GetObject("LDAP://RootDSE")DomainName = rootDSE_.Get("defaultNamingContext")UserLogonName="USER1"Const ADS_SCOPE_SUBTREE = 2Set objConnection = CreateObject("ADODB.Connection")Set objCommand = CreateObject("ADODB.Command")objConnection.Provider = "ADsDSOObject"objConnection.Open "Active Directory Provider"Set objCommand.ActiveConnection = objConnectionobjCommand.CommandText = "SELECT name, sAMAccoutName ↵↵↵↵↵

FROM " _ & " 'LDAP://"& DomainName & "' ↵↵↵↵↵WHERE objectClass='users'"

objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREEobjCommand.Properties("Cache Results") = FalseSet objRecordSet = objCommand.Execute

objRecordSet.MoveFirstDo Until objRecordSet.EOFIf objRecordSet.Fields("sAMAccoutName").Value=UserLogonNamemsgbox "FullName: "+ objRecordSet.Fields("name").Valueend ifLoop

Как видно, листинг примера 6 б) в несколько раз больше,чем листинг примера 6 а). За счет того, что в примере 6 б)«просматривается» весь массив пользователей, сценарийбудет отрабатываться в несколько раз медленнее, чем сце-нарий 6 а). Скорость выполнения сценария напрямую зави-сит от количества объектов в просматриваемом массиве.Очевидно, что чем больше размер массива, тем медленнеебудет работать скрипт.

Многократное использование данного механизма в од-ном скрипте дополнительно уменьшит скорость выполненияскрипта и увеличивает его размер по сравнению с анало-гичным скриптом, в котором доступ к объектам осуществля-ется с помощью провайдера WinNT. Однако отказаться отдоступа к AD с помощью провайдера LDAP невозможно, по-скольку существует много функций, которые реализованытолько в провайдере LDAP. Оптимальным вариантом явля-ется совместное использование провайдеров LDAP и WinNT.Ярким примером является чтение свойств сетевого принте-ра: с точки зрения провайдера WinNT принтер – локальноеустройство, с точки зрения LDAP – сетевое.

Литература:1. Коробко И. Active Directory – теория построения. –

// Журнал «Системный администратор», №1(14), ян-варь 2004 г. – 90-94с.

2. Коробко И. Программное управление ADSI: WinNT. –// Журнал «Системный администратор», №2(15), фев-раль 2004 г. – 66-74с.

3. Коробко И. Управление сетевыми принтерами доме-на. – // Журнал «Системный администратор», №10(11),октябрь 2003 г. – 38-46с.