Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Neue Attribute mit LDAP hinzufügen (https://www.delphipraxis.net/97534-neue-attribute-mit-ldap-hinzufuegen.html)

RWarnecke 12. Aug 2007 12:14


Neue Attribute mit LDAP hinzufügen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,

ich habe mir die beiden Units für LDAP von CodeCentral (die Ihr auch im Anhang findet) heruntergeladen. Die Verbindung und das auslesen zum LDAP-Server funktioniert wunderbar. Aber irgendwie bin ich zu blöd einem Object ein neues Attribute hinzuzufügen oder es zu modifizieren.

Mein bissheriger Versuch sieht so aus :
Delphi-Quellcode:
procedure TForm6.Button1Click(Sender: TObject);
var
  ldapconnected : LdapConnection;
  Entries: LdapEntryList;
  ldapAttr: LdapEntry;
  Attributes : LdapAttribute;
  newAttr: LdapEntry;
begin
  ldapconnected := LdapConnection.Create;
  ldapconnected.Open('server.domain.de','cn=user,ou=container,o=container', 'password', 389);
  Entries := LdapEntryList.Create;
  ldapAttr := LdapEntry.Create;
  ldapconnected.Search(Entries, 'ou=container,o=container');              // In der NDS suchen ab einem bestimmten Containers

  Label1.Caption := Entries.GetDN(11);                       // Abrufen des Full Calified Name

  ldapAttr := Entries.GetEntry(11);                          // Auslesen der Attribute von dem Object

  ldapAttr.Add('l', 'Stuttgart');                   // Dieser Wert soll hinzugefügt werden.
  ldapconnected.Add(Entries.Entry[9]);

  Label2.Caption := Entries.EntryValue[11, 'givenName', 0];  // Einzelne Attribute auslesen
  Label3.Caption := Entries.EntryValue[11, 'fullName', 0];   // Einzelne Attribute auslesen
  Label4.Caption := Entries.EntryValue[11, 'l', 0];          // Einzelne Attribute auslesen

  Memo3.Lines.Text := ldapAttr.AsLDIF;                      // Eine LDIF - Ausgabe vom NDS-Object erstellen
  Memo2.Lines := ldapAttr.NameList;                         // Anzeigen der dazugehörigen Attribute
  Memo1.Lines.Text := Entries.Text;                         // Anzeigen des Suchergebniss

  ldapAttr.Free;                                            // ldapEntry wieder freigeben
  Entries.Free;                                             // ldapEntryList wieder freigeben
  ldapconnected.Close;                                      // LDAP - Verbindung schliessen
  ldapconnected.Free;                                       // LDAPConnection wieder freigeben
end;
Nur jedesmal bekomme ich eine EAccessViolation auf die Datei wldap32.dll. Nur weiß ich nicht warum. Könntet Ihr mit da weiterhelfen ?

RWarnecke 14. Aug 2007 17:38

Re: Neue Attribute mit LDAP hinzufügen
 
*push* Kann mir da wirklich keiner helfen, nichtmal ansatzweise ?

shmia 14. Aug 2007 17:44

Re: Neue Attribute mit LDAP hinzufügen
 
Delphi-Quellcode:
  ldapAttr := LdapEntry.Create;

  .....
  // folgende Zeile erzeugt auf jeden Fall ein Speicherleck !!
  // ich weiss zwar nicht wie's richtig wäre, so ist's jedoch Falsch
  ldapAttr := Entries.GetEntry(11);                          // Auslesen der Attribute von dem Object

RWarnecke 14. Aug 2007 17:50

Re: Neue Attribute mit LDAP hinzufügen
 
Danke für Deine Antwort. Nur verstehen tue ich das ganze nicht, warum das ein Speicherleck produziert. Wenn ich den Create-Befehl weglasse, dann meckert mein Compiler, dass möglicherweise mein ldapAttr nicht initialisiert wurde.

Edit :
Wichtiger sind mir Zeile 20 und 21. Warum fügt er das Attribute nicht hinzu, dass ist mein größtes Problem.

shmia 14. Aug 2007 18:02

Re: Neue Attribute mit LDAP hinzufügen
 
Zitat:

Zitat von RWarnecke
Nur verstehen tue ich das ganze nicht, warum das ein Speicherleck produziert.

Mit der Create - Zuweisung legt du ein neues, leeres Objekt an. Alles Paletti.
Nur die 2. Zuweisung überschreibt den Zeiger (Objektvariablen sind Zeiger) mit einem neuen Wert.
Jetzt ist das ursprüngliche Objekt verloren (aber nicht sauber freigegeben).
Am Ende droht dann sogar eine doppelte Freigabe, denn ldapAttr zeigt ja auf Entries.GetEntry(11).
Probier mal
Delphi-Quellcode:
   ldapAttr.Assign(Entries.GetEntry(11)); // Objekt kopieren

RWarnecke 14. Aug 2007 19:57

Re: Neue Attribute mit LDAP hinzufügen
 
Danke für Deine Erklärung Andreas, dass war mir bis jetzt nicht so bewusst.

RWarnecke 19. Aug 2007 10:04

Re: Neue Attribute mit LDAP hinzufügen
 
*push* Kann mir hier wirklich keiner weiterhelfen ?

marabu 19. Aug 2007 18:22

Re: Neue Attribute mit LDAP hinzufügen
 
Hallo Rolf,

ich habe mir deinen Code mal angesehen, ein wenig umgeformt und kommentiert.

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  conn: LdapConnection;
  entries: LdapEntryList;
  entry: LdapEntry;
  newEntry: LdapEntry;
begin
  conn := LdapConnection.Create;

  // quick hack to get read access in spite of protocol error
  // actually we need strong authorization to apply changes
  try conn.Open('www.openldap.com') except end;

  // create container for search results
  entries := LdapEntryList.Create;

  // execute subtree search
  conn.Search(entries, 'dc=OpenLDAP,dc=org', '(objectClass=openLDAPperson)');

  // single out second entry
  entry := entries.GetEntry(1);

  // clone entry
  newEntry := LdapEntry.Create(entry);

  // change location
  newEntry.Modify('l', 'Stuttgart');

  // issue mod request
  conn.Modify(entry, newEntry);

  // house keeping
  entry.Free;
  newEntry.Free;
  entries.Free;
  conn.Close;
  conn.Free;
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 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