Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы с LDAP _MATCHING _RULE _IN _CHAIN в Delphi

Delphi , Файловая система , Активные директории

Введение

При работе с Active Directory в Delphi часто приходится использовать запросы к LDAP, для чего применяются компоненты ADOQuery. Иногда возникают сложности с использованием правил сопоставления LDAP_MATCHING_RULE_IN_CHAIN, которые предназначены для поиска вложенных групп. В данной статье мы рассмотрим проблему, с которой столкнулся разработчик, и предложим решение, основанное на использовании ADOCommand.

Описание проблемы

Разработчик столкнулся с проблемой при попытке получить список пользователей, входящих в определенную группу и все вложенные группы. При использовании правильного запроса для получения списка пользователей, входящих в группу, при добавлении правила LDAP_MATCHING_RULE_IN_CHAIN для поиска вложенных групп произошла ошибка при вызове ADOQuery.Open.

Пример кода, вызывающий ошибку

ADOQuery1.SQL.Text := 'SELECT samAccountName FROM ''GC://' + sADForestName + ''' ' +
                        'WHERE objectCategory=''user'' ' +
                          'AND distinguishedName=''' + sADUserName + ''' ' +
                          'AND memberOf:1.2.840.113556.1.4.1941:=''' + sADGroupName + '''';
ADOQuery1.Open;

Альтернативный ответ

Одним из возможных источников ошибки являются двоеточия (:) около memberOf, которые можно исключить, установив свойство ParamCheck в false. Однако, при отключении ParamCheck ошибка все равно сохраняется.

Подтвержденный ответ

Разработчик нашел решение, используя ADOCommand вместо ADOQuery. Пример кода, решающий проблему:

var
  ADOConnection, ADOCmd, Res: Variant;
begin
  ADOConnection := CreateOleObject('ADODB.Connection');
  ADOCmd := CreateOleObject('ADODB.Command');
  try
    ADOConnection.Provider := 'ADsDSOObject';
    ADOConnection.Open('Active Directory Provider');
    ADOCmd.ActiveConnection := ADOConnection;
    ADOCmd.Properties('Page Size')     := 100;
    ADOCmd.Properties('Timeout')       := 30;
    ADOCmd.Properties('Cache Results') := False;

    sBase       := '<GC://' + sADForestName + '>';
    sFilter     := '(&(objectCategory=person)(objectClass=user)' +
                     '(distinguishedName=' + sADUserName + ')' +
                     '(memberOf:1.2.840.113556.1.4.1941:=' + sADGroupName + '))';
    sAttributes := 'sAMAccountName';

    ADOCmd.CommandText := sBase + ';' + sFilter + ';' + sAttributes + ';subtree';
    Res := AdoCmd.Execute;

    if Res.EOF then
      User := ''
    else
      User := Res.Fields[0].Value;
  finally
    ADOCmd := NULL;
    ADOConnection.Close;
    ADOConnection := NULL;
  end;
end;

Заключение

При работе с Active Directory в Delphi для получения списка пользователей, входящих в определенную группу и все вложенные группы, можно использовать ADOCommand вместо ADOQuery. Это решение позволяет обойти ошибку, связанную с правилом LDAP_MATCHING_RULE_IN_CHAIN, и получить необходимые данные.

Создано по материалам из источника по ссылке.

Статья описывает решение проблемы с ошибкой LDAP\_MATCHING\_RULE\_IN\_CHAIN при получении списка пользователей, входящих в группу и все вложенные группы, в Delphi с помощью ADOCommand вместо ADOQuery.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Активные директории ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:01:02/0.0047369003295898/1