2010-01-19 3 views
2

Предположим у меня есть следующий запрос LDAP: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'ish, и я не сейчас, как его преобразовать?

ответ

4

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

  • либо "SQL'ish" синтаксис, который вы описываете - в основном ADO доступ к Active Directory. Это легко, если у вас есть фон SQL, но он также ограничен некоторыми способами (например, вы не можете получить многозначные атрибуты и т. Д.). Вы найдете некоторые Search Tips on ADO на сайте Ричарда Мюллера (AD Программирование MVP)

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

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

Update: вы можете попробовать это «SQL-иш» заявление в вашей 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

Благодарим вас за Řepy мне действительно нужно запустить только один запрос (тот, который я отправил выше) Если кто-то сможет переписать его. так что я могу использовать его TADOCommand ...? – marian12

+0

Да, но 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) дает мне ВСЕ группы, к которым принадлежит пользователь (а не только члены memberof) - это происходит, когда группы являются членами другого grous - мне нужны ВСЕ. – marian12

0

Desicion для вашего вопроса:

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; 
Смежные вопросы