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

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

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

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

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

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

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

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

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

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

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

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

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

В следующем примере кода показано, как свойства задаются перед созданием объекта 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. Команда". Этот объект позволяет выдавать инструкции запроса и другие команды в ADSI с помощью активного подключения. Объект Command использует свойство Active Подключение ion для поддержания активного подключения. Он также поддерживает свойство 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"

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

Именованное свойство Description
"Асинхронный" Логическое значение, указывающее, является ли поиск синхронным или асинхронным. Значение по умолчанию — False (синхронное). Синхронный поиск блокируется до тех пор, пока сервер не возвращает весь результат или для страницного поиска на всей странице. Асинхронный поиск блокируется до тех пор, пока не будет доступна одна строка результатов поиска, или до тех пор, пока не истекает время, указанное свойством Timeout.
"Результаты кэширования" Логическое значение, указывающее, следует ли кэшировать результат на стороне клиента. Значение по умолчанию — true; ADSI кэширует результирующий набор. Отключение этого параметра может быть желательно для больших результирующих наборов.
"Чейз рефералы" Значение из ADS_CHASE_REFERRALS_ENUM , указывающее, как поиск отслеживает рекомендации. Значение по умолчанию — ADS_CHASE_REFERRALS_NEVER. Дополнительные сведения об этом свойстве см. в разделе "Ссылки".
"Только имена столбцов" Логическое значение, указывающее, что поиск должен получить только имя атрибутов, к которым были назначены значения. Значение по умолчанию — false.
"Deref Aliases" Логическое значение, указывающее, разрешаются ли псевдонимы найденных объектов. Значение по умолчанию — false.
"Размер страницы" Целочисленное значение, которое включает разбиение по страницам и указывает максимальное количество объектов, возвращаемых в наборе результатов. Значение по умолчанию не имеет размера страницы. Дополнительные сведения см. в разделе "Получение больших наборов результатов".
"SearchScope" Значение перечисления 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

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

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