![]() |
Datenbank: Active Directory • Version: ?? • Zugriff über: Delphi 2010
Active Directory - Abfrage
Hallo ihr Lieben,
unsere Admins kamen auf die Idee, da ich ja in meinen Postbuch unsere Mitarbeiter abspeichern möchte, ich die doch immer aktuell aus dem Active Directory abfragen könnte. Tolle Idee, muss ich zugeben, wenn da nicht das Problem der Abfrage wäre. Wenn ich in meinen Testprogramm auf einen Button klicke, soll er mir einfach mal alle Leutz in einen Memo darstellen.
Delphi-Quellcode:
In der Query ist folgender Text:
DataModule2.qry1.Close;
DataModule2.con1.Close; DataModule2.con1.Open; DataModule2.qry1.Open; //< DA KNALLT'S! DataModule2.qry1.First; while not DataModule2.qry1.Eof do begin mmo1.Lines.Add(DataModule2.qry1.FieldByName('displayname').AsString); DataModule2.qry1.Next; end;
Code:
Die Verbindung kann er ja scheinbar aufbauen, aber die Abfrage funktioniert nicht, da meint er immer, dass mindestens ein Fehler vorhanden ist.
SELECT top 10(*) FROM 'LDAP:\\*****.lan'
Wie muss die Domäne z.B. aussehen? Wir sind hier uns alle ein wenig unsicher, ob die so richtig ist, wie wir sie uns dachten und probierten schon mehrere Sachen aus. Könnt ihr mal ein Beispiel nennen? Danke, das Maya |
AW: Active Directory - Abfrage
Was genau für eine Fehlermeldung erscheint denn?
|
AW: Active Directory - Abfrage
"Exception-Klasse EOleException mit Meldung 'Der Befehlt enthielt mindestens einen Fehler'."
Hab's auch schon mit "DC=***,DC=lan" probiert und da kommt die gleiche Fehlermeldung. |
AW: Active Directory - Abfrage
Was für eine Komponente verbirgt sich denn hinter qry1?
|
AW: Active Directory - Abfrage
Übrigens, ich benutze die ADO-Komponenten für die Query und die Connection.
|
AW: Active Directory - Abfrage
Versuch's mal mit "/" anstatt "\".
|
AW: Active Directory - Abfrage
Leider klappt das auch nicht. -.-
Mit dem Active Directory Explorer habe ich keine Probleme, mir die ganzen Strukturen und Einträge anzusehen. Also habe ich zumindest Leserechte darauf. |
AW: Active Directory - Abfrage
Sry für Doppelpost.
Also, maybe habe ich das Problem ein klein wenig eingeschränkt? Ich hab den Quelltext mal ein wenig abgewandelt.
Delphi-Quellcode:
Wenn es knallt, dann kommt diesmal aber ein klein wenig anderer Fehler:
procedure TForm1.btn2Click(Sender: TObject);
begin DataModule2.con1.Close; DataModule2.con1.Open; Datamodule2.qry1.Close; DataModule2.qry1.SQL.Clear; datamodule2.qry1.SQL.Add('SELECT TOP 10 (*) FROM ''LDAP:\\DC=****,DC=lan'''); DataModule2.qry1.Open; //< Wieder knallt es HIER! DataModule2.qry1.First; while not DataModule2.qry1.Eof do begin mmo1.Lines.Add(DataModule2.qry1.FieldByName('displayname').AsString); DataModule2.qry1.Next; end; end; Zitat:
|
AW: Active Directory - Abfrage
Schau dir mal im Internet nach ADSI und Delphi.
Da gibt es paar super Webseiten zu. |
AW: Active Directory - Abfrage
Zitat:
|
AW: Active Directory - Abfrage
Zitat:
Delphi-Quellcode:
Ich würde es erst mal mit einer sehr ähnlichen Select-Anweisung versuchen, um den Fehler einzugrenzen (Vielleicht versteht AD kein "TOP 10").
SELECT title, telephoneNumber From 'LDAP://DC=Microsoft, DC=COM' WHERE
objectClass='user' AND objectCategory='Person' Ebenso könnte es daran liegen, daß ohne die WHERE-Klausel, keine sinnvollen RecordSets zurückgegeben werden können, da diese eventuell nicht alle die gleichen Felder haben. Es steckt eben keine homogene Tabelle dahinter. |
AW: Active Directory - Abfrage
Tut mir Leid, dass ich gestern nicht mehr antwortete. Hatte dann dreiviertel vier Feierabend und hatte zu Hause selber einiges zutun.
Wir haben das jetzt soweit gepackt, dass zwar immer noch eine Zugriffsverletzung kommt, wenn ich aber auf "Fortfahren" gehe, zeigt der mir im Memo einiges an Daten an, was danach auch aussieht, was ich haben möchte. Das Problem liegt da, wie Uwe schon vermutete, dass die AD mit dem "Top 10(*)", geschweige denn überhaupt dem Sternchen zurecht kommt. Man muss scheibar explizit angeben, was für Spalten man haben möchte. Darauf muss erstmal einer kommen. ;) Ohne WHERE-Klausel habe ich es jetzt noch nicht versucht, da ich mir nicht das Memo sprengen möchte. Der Quelltext sieht jetzt wie folgt aus:
Delphi-Quellcode:
Wir hatten diesen Code gefunden, um Fehler abgezufangen und ggf. etwas genauer zu erfahren, wo der Fehler ist. Das hat soweit auch ganz gut geholfen. Aber bei der Zugriffsverletzung handelt sich ja um ein delphiseitiges Problem und weniger bei der AD, oder?
procedure TForm1.btn2Click(Sender: TObject);
var LastErrorIndex, NativeError, NumberError, i: Integer; SourceError, DescriptionError, SQLStateError: string; begin try DataModule2.con1.Close; DataModule2.con1.Open; with DataModule2.qry1 do begin Close; SQL.Text:='SELECT displayName FROM ''LDAP://DC=****,DC=lan'' WHERE objectClass=''user'' AND objectCategory=''Person'''; Open; //<Hier liegt scheinbar immer noch ein Problem. First; end; mmo1.Lines.Clear; while not DataModule2.qry1.Eof do begin mmo1.Lines.Add(DataModule2.qry1.FieldByName('displayName').AsString); DataModule2.qry1.Next; end; except for I := 0 to DataModule2.con1.Errors.Count - 1 do begin LastErrorIndex:=i; SourceError:=DataModule2.con1.Errors.Item[LastErrorIndex].Source; NumberError:=DataModule2.con1.Errors.Item[LastErrorIndex].Number; DescriptionError:=DataModule2.con1.Errors.Item[LastErrorIndex].Description; SQLStateError:=DataModule2.con1.Errors.Item[LastErrorIndex].SQLState; NativeError:=DataModule2.con1.Errors.Item[LastErrorIndex].NativeError; Showmessage('SourceError: '+ SourceError+#10#13+ 'NumberError: '+IntToStr(NumberError)+#10#13+ 'DescriptionError: '+DescriptionError+#10#13+ 'SQLStateError: '+SQLStateError+#10#13+ 'NativeError: '+IntToStr(NativeError)); end; end; end; |
AW: Active Directory - Abfrage
Also '*' sollte schon noch funktionieren. Aber viel mehr nicht, sprich diverse SQL-Funktionen, die man von den üblichen Datenbanken kennt, oder aber komplexere Abfragen funktionieren nicht.
Was die Zugriffsverletzung angeht: Kannst du da nicht mal einen Haltepunkt setzen und sehen, wo genau die passiert, innerhalb des Query.Open passiert ja auch noch was. |
AW: Active Directory - Abfrage
Also ich hab das mit dem Sternchen versucht und es klappte leider nicht. Gut, finde ich aber jetzt wo ich es weiß, nicht all zu schlimm.
Ich habe bei dem "Close" einen Haltepunkt gesetzt und mit F7 weitergemacht. Aber bei dem Sprung von "SQl.Text" zu "SQL.Open" kommt die Fehlermeldung der Zugriffsverletzung. "Im Projekt TestADO.exe iste ine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 004FFAE3 in Modul 'TestADO.exe'.Lesen von Adresse 00000000' aufgetreten." Es macht mich nur skeptisch, warum er dann nicht in den EXCEPT-Teil springt, sondern einfach weiter macht, als wäre nix gewesen und auch die Abfrage ausführt. Ich habe zwischenzeitlich auch vor dem "Open" noch ein "Active:=True" eingebaut. Da sprach er bei der Zugriffsverletzung immer auf diese Zeile. Wir vermuten mittlerweile, ob es nicht doch ein Bug der Komponenten sein könnte? NACHTRAG Wenn ich den SQL-Text in die Query eingebe, dann klappt es tadellos. Verstehen muss ich das nicht, oder? |
AW: Active Directory - Abfrage
Zitat:
Delphi-Quellcode:
Somit wäre die zweite der beiden Zeilen redundant und der Fehler tritt sowieso bereits in der ersten auf.
procedure TDataSet.Open;
begin Active := True; end; Zitat:
|
AW: Active Directory - Abfrage
Aufgrund der angegebenen Speicheradresse ist es wohl so, dass irgendwo auf einen nil-Pointer (nicht vorhandenes Objekt o.ä.) zugegriffen wird. Wie das kommt, kann ich natürlich aus der Ferne auch nicht sagen.
|
AW: Active Directory - Abfrage
Zitat:
Delphi-Quellcode:
übergeben also was machst Du da?
with DataModule2.qry1 do
begin Close; SQL.Text:='SELECT displayName FROM ''LDAP://DC=****,DC=lan'' WHERE objectClass=''user'' AND objectCategory=''Person'''; Open; //<Hier liegt scheinbar immer noch ein Problem. First; end; Und versuch es doch bitte einmal ohne "With" Gruß K-H |
AW: Active Directory - Abfrage
Vielleicht hakts am Doppelpunkt?
Mal ParamCheck abschalten=? |
AW: Active Directory - Abfrage
Zitat:
Ich habe beim etwas genaueren googeln den Beitrag hier gefunden: ![]()
Delphi-Quellcode:
Ich habe auch versucht, bei der Query, die ich zur Designzeit erstelle, direkt den ConnectionString einzugeben, aber hat keine positiven Ergebnisse.
procedure TForm1.btn1Click(Sender: TObject);
var ConString: String; LastErrorIndex, NativeError, NumberError, i: Integer; SourceError, DescriptionError, SQLStateError: string; begin ConString:='Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648'; try qry2:=TADOQuery.Create(nil); qry2.SQL.Text:=' SELECT displayName '+ ' FROM ''LDAP://DC=****,DC=lan'' '+ ' WHERE objectClass=''user'' '+ ' AND objectCategory=''Person'' '; qry2.Active:=False; qry2.ConnectionString:=ConString; qry2.Active:=True; qry2.First; mmo1.Lines.Clear; while not qry2.Eof do begin mmo1.Lines.Add(qry2.FieldByName('displayName').AsString); qry2.Next; end; except for I := 0 to qry2.Connection.Errors.Count - 1 do begin LastErrorIndex:=i; SourceError:=qry2.Connection.Errors.Item[LastErrorIndex].Source; NumberError:=qry2.Connection.Errors.Item[LastErrorIndex].Number; DescriptionError:=qry2.Connection.Errors.Item[LastErrorIndex].Description; SQLStateError:=qry2.Connection.Errors.Item[LastErrorIndex].SQLState; NativeError:=qry2.Connection.Errors.Item[LastErrorIndex].NativeError; Showmessage('SourceError: '+ SourceError+#10#13+ 'NumberError: '+IntToStr(NumberError)+#10#13+ 'DescriptionError: '+DescriptionError+#10#13+ 'SQLStateError: '+SQLStateError+#10#13+ 'NativeError: '+IntToStr(NativeError)); end; qry2.Free; end; Wenn noch jmd. einen Lösungsansatz hat, wäre ich dem sehr dankbar. :) Zitat:
|
AW: Active Directory - Abfrage
Dieser Doppelpunkt vermutlich:
Zitat:
|
AW: Active Directory - Abfrage
Zitat:
Echt, das war's, jetzt klappt's perfekt. Wenn ich das dynamisch erstelle, ist dann ParamCheck von vornherein (OMG, schreibt man das so?) auf "false" gesetzt? |
AW: Active Directory - Abfrage
hast du mal den debugger gefragt was in SQL.Text steht?
Gruß K-H |
AW: Active Directory - Abfrage
Zitat:
Habe jetzt ParamCheck auf "False" gestellt und nun klappt's tadellos. Danke an alle, die halfen! Ich schlage mich jetzt weiter mit der Active Directory 'rum. :) |
AW: Active Directory - Abfrage
Zitat:
|
AW: Active Directory - Abfrage
Der war ja auch nicht schwer zu finden: einfach alles ausblenden, was kein Doppelpunkt ist :lol:
|
AW: Active Directory - Abfrage
Ja für Dich!
Aber ein Hinweis auf das SQL Statement hätte nicht geschadet, im restlichen Quelltext waren ja auch noch ein paar Doppelpunkte. Also gut, die Antwort war etwas schlampig, Zitat:
|
AW: Active Directory - Abfrage
Zitat:
Klappt super und langsam entsteht soetwas wie eine Freundschaft zwischen mir und der Active Directory. Man muss nur wissen, wie man sie nehmen muss. ;) |
AW: Active Directory - Abfrage
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 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