AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Active Directory - Abfrage

Ein Thema von Maya · begonnen am 18. Apr 2012 · letzter Beitrag vom 19. Apr 2012
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#11

AW: Active Directory - Abfrage

  Alt 18. Apr 2012, 13:45
Delphi-Quellcode:
  datamodule2.qry1.SQL.Add('SELECT TOP 10 (*) FROM ''LDAP:\\DC=****,DC=lan''');
  DataModule2.qry1.Open; //< Wieder knallt es HIER!
Die Syntax für die LDAP-Query lautet nach einem Beispiel von Microsoft so (siehe "//" statt "\\"):

Delphi-Quellcode:
SELECT title, telephoneNumber From 'LDAP://DC=Microsoft, DC=COM' WHERE
objectClass='userAND objectCategory='Person'
Ich würde es erst mal mit einer sehr ähnlichen Select-Anweisung versuchen, um den Fehler einzugrenzen (Vielleicht versteht AD kein "TOP 10").

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Maya
Maya

Registriert seit: 15. Jun 2011
Ort: Potsdam-Mittelmark
107 Beiträge
 
Delphi 2010 Enterprise
 
#12

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 05:54
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:
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;
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?
Status:
- FIAE
- Rechteinhaberin, ein Rüsselmops sein zu wollen

Geändert von Maya (19. Apr 2012 um 06:00 Uhr) Grund: Ergänzungen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#13

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 08:09
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Maya
Maya

Registriert seit: 15. Jun 2011
Ort: Potsdam-Mittelmark
107 Beiträge
 
Delphi 2010 Enterprise
 
#14

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 08:29
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?
Status:
- FIAE
- Rechteinhaberin, ein Rüsselmops sein zu wollen

Geändert von Maya (19. Apr 2012 um 08:49 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#15

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 09:20
Ich habe zwischenzeitlich auch vor dem "Open" noch ein "Active:=True" eingebaut. Da sprach er bei der Zugriffsverletzung immer auf diese Zeile.
Die Implementierung von TDataSet.Open ist auch nur:

Delphi-Quellcode:
procedure TDataSet.Open;
begin
  Active := True;
end;
Somit wäre die zweite der beiden Zeilen redundant und der Fehler tritt sowieso bereits in der ersten auf.

Wir vermuten mittlerweile, ob es nicht doch ein Bug der Komponenten sein könnte?
ADO war schon immer etwas mimosenhaft...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 09:20
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#17

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 09:23
NACHTRAG
Wenn ich den SQL-Text in die Query eingebe, dann klappt es tadellos. Verstehen muss ich das nicht, oder?
Das verstehe ich nicht, der Text wird doch hier
Delphi-Quellcode:
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;
übergeben also was machst Du da?

Und versuch es doch bitte einmal ohne "With"

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#18

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 09:40
Vielleicht hakts am Doppelpunkt?
Mal ParamCheck abschalten=?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Maya
Maya

Registriert seit: 15. Jun 2011
Ort: Potsdam-Mittelmark
107 Beiträge
 
Delphi 2010 Enterprise
 
#19

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 09:48
Das verstehe ich nicht, der Text wird doch hier
Delphi-Quellcode:
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;
übergeben also was machst Du da?
Wenn ich die SQL-Abfrage direkt in die Query schon zur Designzeit eingebe und im Quelltext die Zuweisung auskommentiere, erscheint die Zugriffsverletzung nicht. Das meinte ich damit, habe mich vielleicht unglücklich ausgedrückt. Ohne "WITH" habe ich es auch schon ausprobiert, da ich auch schon überlegte, ob das nicht ggf. eine Sache sein könnte, die ADO nicht so mag. Ergebnis war aber das gleiche.

Ich habe beim etwas genaueren googeln den Beitrag hier gefunden: http://www.delphipraxis.net/84463-ad...erletzung.html und sind jetzt am Überlegen, ob wir nicht gleich das auch so machen, dass wir die Query dynamisch erstellen.

Delphi-Quellcode:
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;
Ich habe auch versucht, bei der Query, die ich zur Designzeit erstelle, direkt den ConnectionString einzugeben, aber hat keine positiven Ergebnisse.

Wenn noch jmd. einen Lösungsansatz hat, wäre ich dem sehr dankbar.


Vielleicht hakts am Doppelpunkt?
Mal ParamCheck abschalten=?
Welcher Doppelpunkt?
Status:
- FIAE
- Rechteinhaberin, ein Rüsselmops sein zu wollen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Active Directory - Abfrage

  Alt 19. Apr 2012, 09:49
Dieser Doppelpunkt vermutlich:
Zitat:
LDAP:
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz