Поделиться через


Поиск с помощью объектов данных ActiveX (ADO)

Модель объекта данных ActiveX (ADO) состоит из объектов, перечисленных в следующей таблице.

Объект Описание
Соединение Открытое подключение к источнику данных OLE DB, например ADSI.
Команда Определяет определенную команду, выполняемую в источнике данных.
Параметр Необязательная коллекция для всех параметров, предоставляемых объекту команды.
Набор записей Набор записей из таблицы, объекта команды или синтаксиса SQL. Набор записей можно создать без базового объекта подключения.
полe Один столбец данных в наборе записей.
свойство Коллекция значений, предоставленных поставщиком для ADO.
Ошибка Содержит данные об ошибках доступа к данным. Обновляется при возникновении ошибки в одной операции.

Для взаимодействия ADO с ADSI необходимо, по крайней мере, два объекта ADO: Connection и RecordSet. Эти объекты ADO служат для проверки подлинности пользователей и перечисления результатов соответственно. Как правило, вы также будете использовать объект Command для поддержания активного соединения, указания параметров запроса, таких как размер страницы и область поиска, и выполнение запроса. Дополнительные сведения о синтаксисе фильтра поиска см. в разделе Синтаксис фильтра поиска.

Объект connection загружает поставщика OLE DB и проверяет учетные данные пользователя. В Visual Basic вызовите функцию CreateObject с "ADODB.Connection" для создания экземпляра объекта Connection, а затем задайте для свойства Provider объекта Connection значение "ADsDSOObject". "ADODB. Connection" — это progID объекта Connection, а "ADsDSOObject" — это имя поставщика OLE DB в ADSI. Если учетные данные не указаны, используются учетные данные пользователя, вошедшего в систему.

В следующем примере кода показано, как создать экземпляр объекта Connection.

Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"

В следующем примере кода показано, как создать экземпляр объекта Connection.

<%
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
%>

В следующем примере кода показано, как создать экземпляр объекта Connection. Помните, что необходимо включить библиотеку типов ADO (msadoXX.dll) в качестве одной из ссылок в проекте Visual Basic.

Dim Con As New Connection
con.Provider = "ADsDSOObject"

Укажите данные проверки подлинности пользователей, задав свойства объекта Connection. В следующей таблице перечислены свойства проверки подлинности пользователей, поддерживаемые ADSI.

Собственность Описание
"Идентификатор пользователя" Строка, определяющая пользователя, контекст безопасности которого используется при выполнении поиска. Дополнительные сведения о формате строки имени пользователя см. в разделе IADsOpenDSObject::OpenDSObject. Если не указано, по умолчанию используется вошедший в систему пользователь или пользователь, представляемый вызывающим процессом.
"Пароль" Строка, указывающая пароль пользователя, определяемого идентификатором пользователя.
"Encrypt Password" (Шифрование пароля) Логическое значение, указывающее, зашифрован ли пароль. Значение по умолчанию — false.
"Флаг ADSI" Набор флагов из перечисления ADS_AUTHENTICATION_ENUM, которые указывают параметры аутентификации соединения. Значение по умолчанию равно нулю.

В следующем примере кода показано, как свойства задаются перед созданием объекта command.

Set oConnect = CreateObject("ADODB.Connection")
oConnect.Provider = "ADsDSOObject"
oConnect.Properties("User ID") = stUser
oConnect.Properties("Password") = stPass
oConnect.Properties("Encrypt Password") = True
oConnect.Open "DS Query", stUser, stPass

Второй объект ADO — это объект Command. Идентификатор ProgID объекта Command — "ADODB.Command". Этот объект позволяет выдавать инструкции запроса и другие команды в ADSI с помощью активного подключения. Объект Command использует свойство ActiveConnection для поддержания активного подключения. Он также поддерживает свойство CommandText для хранения инструкций запросов, выданных пользователем. Инструкции запроса выражаются в диалекте SQL или диалекте LDAP.

В следующих примерах кода продемонстрировано создание объекта Command.

Set command = CreateObject("ADODB.Command")
Set command.ActiveConnection = oConnect
command.CommandText = 
"SELECT AdsPath, cn FROM 'LDAP://DC=Fabrikam,DC=com' WHERE objectClass = '*'"

В следующем примере кода включите библиотеку типов ADO (msadoXX.dll) в качестве одной из ссылок.

Dim command As New Command
Set command.ActiveConnection = oConnect
command.CommandText = "<LDAP://DC=Fabrikam,DC=com>;(objectClass=*);AdsPath, cn; subTree"

Параметры поиска объекта команды задаются путем задания свойства Properties. В следующей таблице перечислены разрешённые именованные свойства для свойств .

Именованное свойство Описание
"Асинхронный" Логическое значение, указывающее, является ли поиск синхронным или асинхронным. Значение по умолчанию — False (синхронное). Синхронный поиск блокируется до тех пор, пока сервер не вернет весь результат или для постраничного поиска полную страницу. Асинхронный поиск блокируется до тех пор, пока не будет доступна одна строка результатов поиска, или до тех пор, пока не истекает время, указанное свойством Timeout.
"Результаты кэширования" Логическое значение, указывающее, следует ли кэшировать результат на стороне клиента. Значение по умолчанию — true; ADSI кэширует результирующий набор. Отключение этого параметра может быть желательно для больших результирующих наборов.
Управляйте рекомендациями Значение из ADS_CHASE_REFERRALS_ENUM, указывающее, как поиск отслеживает рефералы. Значение по умолчанию — ADS_CHASE_REFERRALS_NEVER. Дополнительные сведения об этом свойстве см. в разделе Переадресация.
"Только имена столбцов" Логическое значение, указывающее, что поиск должен получить только имя атрибутов, к которым были назначены значения. Значение по умолчанию — false.
"Deref Aliases" Логическое значение, определяющее, разрешаются ли псевдонимы найденных объектов. Значение по умолчанию — false.
"Размер страницы" Целочисленное значение, которое активирует разбиение по страницам и указывает максимальное количество объектов, которое будет возвращено в наборе результатов. Значение по умолчанию не имеет размера страницы. Дополнительные сведения см. в разделе получение больших наборов результатов.
Область поиска Значение перечисления ADS_SCOPEENUM, указывающее область поиска. Значение по умолчанию — ADS_SCOPE_SUBTREE.
"Ограничение размера" Целочисленное значение, указывающее ограничение размера для поиска. Для Active Directory ограничение размера указывает максимальное количество возвращаемых объектов. Сервер перестает выполнять поиск по достижении предельного размера и возвращает полученные результаты. Значение по умолчанию не ограничено.
"Сортировка по" Строка, указывающая разделенный запятыми список атрибутов для использования в качестве ключей сортировки. Это свойство работает только для серверов каталогов, поддерживающих элемент управления LDAP для сортировки на стороне сервера. Active Directory поддерживает элемент управления сортировкой, но может повлиять на производительность сервера, особенно если набор результатов велик. Помните, что Active Directory поддерживает только один ключ сортировки. По умолчанию сортировка не выполняется.
"Ограничение времени" Целочисленное значение, указывающее ограничение времени (в секундах) для поиска. Когда достигнуто ограничение времени, сервер перестает выполнять поиск и возвращает полученные результаты. По умолчанию нет ограничения по времени.
тайм-аут Целочисленное значение, указывающее значение времени ожидания на стороне клиента в секундах. Это значение указывает время, когда клиент ожидает результатов от сервера перед остановкой поиска. Значение по умолчанию — отсутствие тайм-аута.

В следующем примере кода показано, как задать параметры поиска.

Const ADS_SCOPE_ONELEVEL = 1
Const ADS_CHASE_REFERRALS_EXTERNAL = &H40

Dim Com As New Command
 
Com.Properties("Page Size") = 999
Com.Properties("Timeout") = 30     ' Seconds
Com.Properties("searchscope") = ADS_SCOPE_ONELEVEL
Com.Properties("Chase referrals") = ADS_CHASE_REFERRALS_EXTERNAL
Com.Properties("Cache Results") = False     ' Do not cache the result set.

Третий объект ADO — RecordSet. Этот объект получается при вызове метода Execute на объекте Command. Основная функция объекта RecordSet заключается в перечислении результирующих наборов и получении данных. Результирующий набор может содержать значения атрибутов с одним или несколькими значениями. Получение однозначного атрибута просто, аналогично получению значения столбца в реляционной базе данных, например:

Fields('name').Value

Однако получение атрибута с несколькими значениями является более сложным. В этом случае Field.Value является массивом, и необходимо проверить нижнюю и верхнюю границу массива, как показано в следующем примере кода.

Set rs = Com.Execute
 
For i = 0 To rs.Fields.Count - 1
    Debug.Print rs.Fields(i).Name, rs.Fields(i).Type
Next i
 
'--------------------------
' Navigate the record set.
'--------------------------
rs.MoveFirst
lstResult.Clear      ' Clear the user interface.
While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
    ' For Multi Value attribute
    If rs.Fields(i).Type = adVariant And Not (IsNull(rs.Fields(i).Value)) Then
        Debug.Print rs.Fields(i).Name, " = "
        For j = LBound(rs.Fields(i).Value) To UBound(rs.Fields(i).Value)
            Debug.Print rs.Fields(i).Value(j), " # "
            lstResult.AddItem rs.Fields(i).Value(j)
        Next j
    Else
        ' For Single Value attribute.
         Debug.Print rs.Fields(i).Name, " = ", rs.Fields(i).Value
         lstResult.AddItem rs.Fields(i).Value
    End If
Next i
rs.MoveNext
Wend

В следующем примере кода отключается учетные записи пользователей на сервере LDAP.

Dim X as IADs
Dim con As New Connection, rs As New Recordset
Dim MyUser As IADsUser
 
con.Provider = "ADsDSOObject"
con.Open "Active Directory Provider", "CN=Test,CN=Users,DC=Fabrikam,DC=COM,O=INTERNET", "Password"
Set rs = con.Execute("<LDAP://MyMachine/DC=MyDomain,DC=Fabrikam,DC=com>;(objectClass=User);ADsPath;onelevel")
 
While Not rs.EOF
    ' Bind to the object to make changes 
    ' to it because ADO is currently read-only.
    MyUser = GetObject(rs.Fields(0).Value)
    MyUser.AccountDisabled = True
    MyUser.SetInfo
    rs.MoveNext
Wend

Дополнительные сведения об объектной модели ADO см. в объектах данных Microsoft ActiveX .