Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi uLDAP: Protokollfehler? Wie mit LDAP verbinden? (https://www.delphipraxis.net/116877-uldap-protokollfehler-wie-mit-ldap-verbinden.html)

Phoenix 8. Jul 2008 08:08


uLDAP: Protokollfehler? Wie mit LDAP verbinden?
 
Hi,

ich benutze die wldap32.dll (via diesem Artikel / dieser Unit (uLdap.pas)).
Nur wenn ich auf den LDAP-Server (openldap) verbinden will, schmeisst mir das Ding immer eine Exception alá 'Protokollfehler'. Ich brauche hier übrigens nur lesenden Zugriff (ohne Benutzerkonto, und ja: das Directory erlaubt den anonymen Zugriff).

Background - weil die Frage in anderen Threads des öfteren auftrat: LDAP = Lightweight Directory Access Protokoll. LDAP ist das Protokoll, mit dem man solche Verzeichnisse (im Prinzip eine hierarchische Datenbank), auslesen und verändern kann.

Eine ADO-Verbindung zum LDAP (wie z.B. mit diesem Artikel hier) will auch nicht klappen. Hier behauptet er immer, die "Tabelle" sei nicht vorhanden. Als Statement benutze ich
Code:
SELECT displayname FROM ‘LDAP://dc=meine,dc=Angaben’
. Die dc-Angaben sind korrekt, da ich z.B. mit dem Softerra LDAP Browser mit den gleichen Angaben einwandfrei verbinden und durch das LDAP browsen kann.

Wer hat mir einen Link wie ich mit möglichst Hausmitteln (bzw. möglichst freien Units) auf einen OpenLDAP-Server zugreifen kann? Oder noch besser, wie ich den Protokollfehler verhindern kann den mir die uLDAP schmeisst?

Ziel ist es ein kleines Tool zu haben, welches Daten aus dem LDAP-Master in unsere Datenbank kopiert und später regelmäßig aktualisiert. Wenn der Aufwand zu groß wird, dann schreiben wir zur Not dieses Tool in C#. In Delphi wär halt schöner, da wir das dann gleich in die Anwendung packen könnten...

Edit Nachtrag: Ich habe jetzt auch ADSI probiert. Nur anscheinend kann das ActiveX-Gedöns von Microsoft nicht mit OpenLDAP-Servern sprechen. Hier bekomme ich immer den fehler, dass der übermittelte Verzeichnispfad ungültig sei. Angaben waren: ldap://server:port/dc=meine,dc=Angaben [bzw. auch gestestet: WinNT:// als Protokoll und server jeweils mit und ohne Portangabe, also alle möglichen Kombinationen]. Ist LDAP mit Delphi wirklich so kompliziert? In .NET sind das nur ein paar Zeilen...

marabu 8. Jul 2008 10:12

Re: uLDAP: Protokollfehler? Wie mit LDAP verbinden?
 
Hallo Sebastian,

dein ADsPath scheint falsch aufgebaut zu sein.

Auf meinen lokalen LDAP-Server greife ich so zu:

SQL-Code:
SELECT sn,givenName,departmentNumber
FROM 'LDAP://majestix/ou=accounting,o=sgi,c=us'
WHERE objectClass='inetorgperson'
Der Server lauscht auf dem well known port. Die searchbase liefert dir der Softerra LDAP Browser in der window caption.

Freundliche Grüße

Phoenix 8. Jul 2008 10:54

Re: uLDAP: Protokollfehler? Wie mit LDAP verbinden?
 
Die Verbindung läuft jetzt (mittels ADSI und der AdsHlp Unit).

Ich kann zumindest mal alle o= - Einträge unterhalb meiner dc-Angaben auflisten.
Jetzt muss ich mich halt in die Objekte einarbeiten. Eigentlich sind die Elemente die ich da aufliste selber Container und enthalten weitere Childs - aber auf dem Container erhalte ich irgendwie keinen Enumerator... :gruebel:

Und insbesondere ein QueryInterface auf IAdsContainer klappt nicht (Interface wird nicht unterstützt), was mich wundert. Weil es dort definitiv Childs gibt ;-)

Edit Nachtrag: Ah, geht nu. Irgendwas hatte sich verklemmt - jetzt nach der Mittagspause läuft es so wie es soll *g*

joehd 12. Nov 2024 16:01

AW: uLDAP: Protokollfehler? Wie mit LDAP verbinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für den Hinweis mit dem LDAP Admin den würde ich ja gerne nutzen aber beim Compilieren mit der Delphi version 10.2 gibt es eine Fehlermeldung :

[dcc32 Fehler] Ldif.pas(418): E2010 Inkompatible Typen: 'PBytes' und 'Pointer'

Der Entsprechende Sourcecode ist

Die Procedure
Delphi-Quellcode:
   procedure TLDIF.WriteRecord(Entry: TLdapEntry);
und darin die Zeile
Delphi-Quellcode:
   
// hier die Deklaration der Procedure
// procedure TLDIF.PutLine(const attrib: string; const Buffer: PBytes; const DataSize: Cardinal);
  PutLine('dn', [B]@Entry.utf8dn[1] [/B], Length(Entry.utf8dn));
TldapEntry ist eine classe.

nun ich bin da nicht so fit drinn es wäre echt stark wenn sich den Source mal jemanden anschaut
Ich habe den kompletten Source Version 1.8.3 heute von Github runtergeladen. Dann noch weil benötigt die TregExpr-1.182

joehd 12. Nov 2024 16:14

AW: uLDAP: Protokollfehler? Wie mit LDAP verbinden?
 
Ich habe die Lösung gefunden
14.03.2021 hat Robert Nelson sich dem Problem schon angenommen

Der Original Link https://sourceforge.net/p/ldapadmin/bugs/54/

I'm using Delphi 10.3 Community Edition. I fixed the compile error by adding a cast to the second arg in line 417.

My Version:

PutLine('dn', PBytes(@Entry.utf8dn[1]), Length(Entry.utf8dn));

Und damit geht es wieder DANKE


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz