2010-02-23 13 views
1

J'essaye de me connecter à un serveur OpenLDAP 'clone'. J'ai essayé d'utiliser Synapse Library mais je n'ai pu obtenir qu'une partie (environ 50%) de nos contacts publics. J'essaye maintenant la manière ADO (j'ai lu que ADSI était compatible avec d'autres serveurs de LDAP) mais je ne peux pas le faire fonctionner.Comment se connecter à un serveur OpenLDAP en utilisant ADO (ou autre) et Delphi

chaîne de connexion fournisseur de ADOConnection ressemble à ceci:

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

ADOConnection.LoginPrompt est définie sur true.

ADOQuery Déclaration SQL ressemble à ceci:

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

Je reçois une erreur lors de l'ouverture du ADOQuery (traduit du français): "Un chemin de répertoire non valide a été envoyé"

Qu'est-ce mal ici? Existe-t-il une autre solution gratuite que ADO/Synapse?

Nous vous remercions à l'avance

SW

Répondre

0

Vous pouvez utiliser COM:

  • Générer l'unité follwoing (ActiveDs_TLB.pas).

vous pouvez maintenant:

ou

Définissez les paramètres suivants:

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

vous pouvez obtenir des objets LDAP en utilisant le code comme:

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; 

Il y a quelques exemples sur le web comment utiliser ces unités .