LDAP-запрос с FILTER - PullRequest
       13

LDAP-запрос с FILTER

2 голосов
/ 19 января 2010

Предположим, у меня есть следующий запрос LDAP:

Base DN: OU=Groups,DC=office,DC=domain,DC=org
Filter: (member:1.2.840.113556.1.4.1941:=CN=adam smith,OU=Users,DC=office,DC=domain,DC=org)

Как я могу выполнить его под Delphi (2007)? Примеры использования ADO имеют синтаксис SQL'ов, и я не знаю, как его преобразовать?

Ответы [ 2 ]

4 голосов
/ 19 января 2010

В Delphi вы можете использовать два способа получения ваших данных:

  • либо синтаксис «SQL'ish», который вы описываете - в основном ADO доступ к Active Directory. Это легко, если у вас есть фон SQL, но он также ограничен в некоторых отношениях (например, вы не можете получить многозначные атрибуты и тому подобное). Вы можете найти Советы по поиску в ADO на сайте Ричарда Мюллера (MVP программирования AD)

  • импортировать библиотеку типов ActiveDs.tlb и использовать COM-интерфейсы (прежде всего IDirectorySearch), предоставляемые ADSI, для поиска. Это довольно грязный COM-интерфейс, поэтому, вероятно, большинство из них предпочитают использовать средства поиска ADO, которые более доступны

Когда я еще программировал на Delphi, я много занимался в Active Directory и помещал на свой сайт некоторые из моих советов по Delphi / AD и пример кода . Хотя он не обновлялся довольно долго :-( Но компонент ADSISearch может быть интересен вам (и другим Delphites)

Обновление: Можете ли вы попробовать этот оператор "SQL-ish" в вашем TADOCommand ??

SELECT sAMAccountName, displayName 
FROM 'LDAP://OU=Groups,DC=office,DC=domain,DC=org' 
WHERE objectCategory='group'
  AND member:1.2.840.113556.1.4.1941:=(CN=adam smith,OU=Users,DC=office,DC=domain,DC=org)
0 голосов
/ 20 сентября 2013

Решение для вашего вопроса:

var ADOConnection, ADOCmd, Res: Variant;

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