2010-02-23 2 views
1

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

Я пытаюсь использовать путь 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 устанавливается истина.

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

Select Description FROM 'LDAP://192.168.xxx.xxx/fn=Public Folders/[email protected]/fn=ContactRoot' WHERE objectClass='*' 

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

Что такое Неправильно здесь? Есть ли еще решение, чем ADO/Synapse?

Спасибо заранее

SW

ответ

0

Вы можете использовать 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; 

Есть некоторые примеры в Интернете, как использовать эти единицы ,