Поиск



Поиск

Эта последняя сложность, которую следует обсудить, перед тем как двигаться дальше. В разделе «LDAP: сложная служба каталогов» мы провели достаточно времени в разговорах о поиске в LDAP. Но в мире ADSI мы вряд ли услышим хоть слово по этому поводу. Все из-за того, что в Perl (и любом другом языке, в котором используется тот же OLE-интерфейс автоматизации) поиск с ADSI очень сложен; более того, поиск поддеревьев и поиск, в котором используются не самые простые фильтры, мучительно сложен. (Все остальное не так плохо.) Сложный поиск проблематичен, т. к. для его выполнения необходимо выйти за пределы ADSI и использовать совершенно иную методологию для получения данных (не говоря уже о том, что придется выучить новые акроним от Microsoft).

Но тот, кто занимается системным администрированием, привык смеяться над сложностями, так что начнем с простого поиска, а потом пе рейдем к более сложным вопросам. Простой поиск, затрагивающий один объект (пространство base) или его непосредственных потомков

(пространство one), можно выполнить вручную при помощи Perl. Сделать это можно так:

  • Для одного объекта получите нужные свойства и используйте обычные операторы сравнения для определения соответствия:
  • Для поиска дочерних объектов примените технологии доступа к контейнерам, о которых говорилось раньше, а затем изучите каждый дочерний объект. Несколько примеров поиска такого типа будут рассмотрены очень скоро.

Для того чтобы выполнить более сложный поиск, затрагивающий, скажем, все дерево каталогов или поддерево, вам придется переключиться на использование другой технологии «промежуточного уровня» под названием ADO (ActiveX Data Objects, объекты данных ActiveX). ADO предоставляет языкам сценариев интерфейс к базам уровня Microsoft OLE DB. OLE DB обеспечивает общий интерфейс, ориентированный на базы данных, к источникам данных, подобным реляционным базам данных и службам каталогов. В нашем случае ADO будет применяться для «разговора» с ADSI (который, в свою очередь, общается с самой службой каталогов). Поскольку ADO - это методология, ориентированная на базы данных, рассматриваемая программа предваряет материал об ODBC, о котором речь пойдет в главе 7.

ADO работает только с провайдером LDAP ADSI. В пространстве имен WinNT она работать не будет.

ADO - это отдельная тема, которая лишь затрагивает службы каталогов, поэтому будет рассмотрен только один пример с короткими пояснениями, остальные примеры работают с ADSL Дополнительную информацию об ADO можно найти на http://www.microsoft.com/ado.

Вот пример программы, выводящей имена всех групп, найденных в данном домене. Детальное обсуждение программы приведено ниже.

use Win32::OLE 'in';

# получаем объект ADO, устанавливаем провайдер, открываем соединение

$с = Win32::OLE->new("ADODB.Connection");

$c->{Provider} = "ADsDSOObject";

$c->OpenC'ADSI Provider");

die Win32::OLE->LastError() if Win32::OLE->LastError();

подготавливаем и выполняем запрос

$ADsPath = "LDAP://ldapserver/dc=example,dc=com";

$rs = $c->Execute("<$ADsPath>;(objectClass=Group);Name;SubTree");

die Win32::OLE->LastError() if Win32::OLE->LastError();

until ($rs->EOF){

print $rs->Fields(0)->{Value},"\n"; $rs->MoveNext;

$rs->Close; $c->Close;

Блок кода после загрузки модуля получает экземпляр объекта ADO Connection, устанавливает имя провайдера для этого экземпляра объекта, а затем просит его открыть соединение. Соединение открывается от имени пользователя, запускающего сценарий, хотя можно было установить другие свойства объекта, позволяющие изменить такое поведение.

Затем выполняется собственно поиск при помощи Execute(). Поиск можно осуществлять средствами одного из двух «диалектов»: SQL или ADSL Диалект ADSI, как видно из программы, использует командную строку, состоящую из четырех аргументов, каждый из которых разделен точкой с запятой.2 Вот эти аргументы:

  • ADsPath (в угловых скобках), определяющий сервер и базовое DN-имя для поиска.
  • Фильтр поиска (применяется тот же синтаксис LDAP-фильтров, что упоминался раньше).
  • Имя или имена (разделенные запятыми) возвращаемых свойств.
  • Пространство поиска: либо Base, либо OneLevel, либо SubTree (в соответствии со стандартом LDAP).

Execute() возвращает ссылку на первый из объектов ADO RecordSe, получаемых в результате запроса. По очереди запрашивается каждый из объектов RecordSet, распаковываются объекты, которые в нем содержатся, и выводится свойство Value, возвращаемое методом Fields() для каждого из этих объектов. Свойство Value содержит значение, которое запрашивалось в командной строке (имя объекта Group). Вот как выглядит отрывок получаемых данных на машине с Windows 2000:

Administrators

Users

Guests

Backup Operators

Replicator

Server Operators

Account Operators

Print Operators

DHCP Users

DHCP Administrators

Domain Computers

Domain Controllers

Schema Admirs

Enterprise Admins

Cert Publishers

Domain Admins

Domain Users Domain Guests Group Policy Admins RAS and IAS Serveis DnsAdmins DnsUpdateProxy



Содержание раздела