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с.