Nachdem mir der Einstieg in dieses Thema mangels Quellen doch etwas Probleme bereitet hat hier ein kleines Einstiegs Tutorial zum Thema LDAP Zugriff via Delphi.
Für grundlegenden Zugriff auf ein Active Directory bringt Delphi 7 bereits alles benötigte von Haus aus mit. Benötigt wird dafür die ADO-Komponente. Bei ADO (ActiveX Data Objects) handelt es sich um eine proprietäre Schnittstelle aus dem Hause Microsoft, mit der Zugriffe auf eine Vielzahl von Datenbanken wie Oracle, Microsoft Access und Active Directory möglich ist.
Zuerst fügt man dem eigenen Projekt eine ADOConnection hinzu. Diese findet man unter dem Menüpunkt ADO. Über die ADOConnection wir die eigentliche Datenbankverbindung aufgebaut die man später für die Abfragen nutzt.Die Verbindung wird über den sogenannten ConnectionString konfiguriert. Dafür steht ein Assistent bereit der nach dem Füttern mit Daten einen ConnectionString erstellt.
Im ersten Punkt wird als OLE DB-Provider “OLE DB-Provider for Microsoft Directory Services” ausgewählt.
Im nächsten Schritt gibt man als Datenquelle z.B. den primären Domänencontroller an. Unter Punkt zwei kann man die Art der Authentifizierung am Domänencontroller wählen.
-
Integrierte Sicherheit von Windows NT verwenden
Diese Authentifizierungsart verwendet das Benutzerkonto des Nutzers der die Anwendung ausführt.
-
Spezifischen Benutzernamen und Kennwort verwenden
Oder man gibt einen bestimmten Benutzernamen vor z.B. wenn alle Nutzer der Anwendung einen bestimmten Account verwenden sollen.
Im Anschluss daran kann mit über den Button “Verbindung testen” überprüfen ob alle Einstellungen richtig vorgenommen wurden.
Der daraus erstellte ConnectionString könnte z.B. folgendermaßen aussehen:
Provider=ADsDSOObject;Encrypt Password=False;Integrated Security=SSPI;Data Source=meindomänencontroller;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648
Um jetzt auch wirklich Datensätze aus dem Active Directory auszulesen fügt man seinem Projekt ein ADODataset Objekt hinzu, welches sich ebenfalls im Menü ADO befindet.
Dieses Objekt bekommt zuersteinmal mitgeteilt über welche Verbindung es auf das Active Directory zugreifen soll. Und zwar über den Wert “Connection” der im Drop-Down Menü bereits unser ADOConnection Objekt bereithalten sollte.
Als nächstes kommt die eigentliche Abfrage, die über die Eigenschaft “CommandText” des ADODataSet Objekts definiert wird. Wählt man die Eigenschaft “CommandText” aus erhält man eine Art SQL Editor in den wir jetzt den LDAP -Query eintragen.
Als Beispiel nehme ich hier mal eine simple Abfrage aller inetOrgPerson-Objekte.
SELECT displayname
FROM ‘LDAP://dc=domäne,dc=local’
WHERE objectClass=’inetOrgPerson’
Wichtig sind hier die Anführungszeichen und natürlich die richtige Domäne als Datenbank unter FROM. Wenn man jetzt die Eigenschaft Active des ADO DataSet Objekts auf True stellt fragt er bereits das Active Directory ab, bzw. sollte es tun. Allerdings bekommt man davon noch nicht wirklich viel zu sehen. Deshalb bringen wir jetzt zwei neue Objekte in unser Projekt ein. Zuerst DataSource, welches sich unter “Data Access” befindet und ein DBGrid welches man unter “Data Controls” findet.
Dem DataSource Objekt wird als DataSet “ADODataSet1″ zugewiesen, und dem DBGrid als DataSource “DataSource1″ . Wenn man jetzt das ADODataSet1 auf Active = True setzt wird das DB Grid mit Inhalt gefüllt.
Soviel erstmal dazu vieleicht schreibe ich noch etwas mehr über Filtermöglichkeiten sobald ich mich damit näher auseinandergesetzt habe. Ich finde es jedenfalls sehr interessant, mit einfachen Mitteln auf ein Active Directory zuzugreifen und auch noch SQL-ähnliche Syntax verwenden zu können.




Hallo,
danke für das nette Beispiel, komme aus der Access-Welt und versuche mich nun in Delphi, war echt hilfreich dein Beispiel, solltest du noch mehr haben, wäre ich sehr interessiert !
Danke
Felizitas Hesse
Vielen Dank!
Deine “Anleitung” hat mir wahnsinnig geholfen!!!
Danke für Deine sehr hilfreiche Anleitung, ich habe nur eine Fehlermeldung beim aktiv setzen des ADODatasets . “Kann Tabelle nicht finden” Hast Du eine Idee ?
Danke für die Anleitung, auch wenn mich die zwei Fallen darin dann doch einen halben Tag rumprobieren gekostet haben – ich hatte nämlich dann auch den “No table found”-Fehler. Das Select-Statement ist nämlich leider falsch, zum einen taucht das falsche Anführungszeichen auf – es sollte das normale einfache Hochkomma sein, welches ja auch bei Delphi-Strings verwendet wird, zum anderen musste ich im FROM den Namen des LDAP-Servers hinzufügen, obwohl der doch eigentlich schon in dem Connectionstring drinsteht. Also ein besser funktionierender CommandText:
SELECT CN, mail
FROM ‘LDAP://example.com/dc=domäne,dc=local’
WHERE objectClass=’*’
Und dann klappte das Anbinden an ein Grid auch nicht, weil die Rückgabefelder als “Array of Variant” kommen statt als Strings, und das sogar beim CN der ja eindeutig sein sollte.
Ist ja schon etwas älter, aber trotzdem noch hilfreich. Leider stehe ich nun auch am Problem von Andy an. Wenn ich objectClass=’computer’ setze und Felder wie description oder lastLogon oder lastLogoff in den select einfüge, laufe ich auf eine Exception ‘Variante des Typs Array Variant konnte nicht in Typ String konvertiert werden’.
Ich habe bereits versucht, anstelle des DBGrids ein StringGrid zu verwenden und dieses selbst zu laden, aber ich bekomme es auch so nicht hin, diese ‘Array of Variant’-Felder in einen String umzuwandeln. Und seltsamerweise haben Felder wie location oder operatingSystem dieses Problem nicht.
Hat jemand eine Idee?