Как подключиться к серверу OpenLDAP с помощью ADO (или еще) и Delphi - PullRequest
1 голос
/ 23 февраля 2010

Я пытаюсь подключиться к серверу OpenLDAP «клон». Я пытался использовать библиотеку Synapse, но мне удалось получить только часть (около 50%) наших общедоступных контактов.

Сейчас я пробую способ ADO (я читал, что ADSI совместим с другими серверами LDAP), но не могу заставить его работать.

Строка подключения поставщика ADOConnection выглядит следующим образом:

Provider=ADsDSOObject;Encrypt Password=False;Integrated Security=SSPI;Data Source=NIS;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648;

ADOConnection.LoginPrompt имеет значение true.

ADOQuery SQL-оператор выглядит следующим образом:

Select Description FROM 'LDAP://192.168.xxx.xxx/fn=Public Folders/cn=user@domain.com/fn=ContactRoot' WHERE objectClass='*'

Я получаю сообщение об ошибке при открытии ADOQuery (перевод с французского): «Неправильный путь к каталогу был отправлен»

Что здесь не так? Есть ли другое бесплатное решение, кроме ADO / Synapse?

Заранее спасибо

SW

1 Ответ

0 голосов
/ 24 февраля 2010

Вы можете использовать COM:

  • Создать следующий модуль (ActiveDs_TLB.pas).

Теперь вы можете:

или

Определите следующее:

function ADsGetObject( lpszPathName: WideString; const riid: TGUID; out ppObject ):HRESULT; stdcall; external 'activeds.dll';

вы можете получить объекты LDAP с помощью кода, подобного:

function GetUserNameFromAD( const ADName: string ): string;
var
    Token:              THandle;
    Info, User, Domain: array [ 0..255 ] of Byte;
    ILen, ULen, DLen:   Longword;
    Use:                SID_NAME_USE;
    Usr:                IAdsUser;
begin
    Result := '';
    // Get the thread token. If the current thread is not impersonating, get the process token.
    if not OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, True, Token ) then begin
        if GetLastError() <> ERROR_NO_TOKEN then Exit;
        if not OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, Token ) then Exit;
    end;
    try
        // Get name of domain and username using the token.
        if not GetTokenInformation( Token, TokenUser, @Info, sizeof( Info ), ILen ) then Exit;
        ULen := sizeof( User );
        DLen := sizeof( Domain );
        if not LookupAccountSid( nil, PSIDAndAttributes( @Info )^.Sid, @User, ULen, @Domain, DLen, Use ) then Exit;
        // Should be the specified domain
        if ADName <> PChar( @Domain ) then Exit;
        // Check user and domain with the AD and obtain the username from the AD
        if ADsGetObject( 'WinNT://' + PChar( @Domain ) + '/' + PChar( @User ), IADsUser, Usr ) <> S_OK then Exit;
        if Assigned( Usr ) then Result := Usr.Name;
    finally
        CloseHandle(Token);
    end;
end;

В Интернете есть несколько примеров использования этих устройств.

...