LDAP-Attribute mit LDAPSend ändern

Rund um die LCL und andere Komponenten
Antworten
MartinKoeditz
Beiträge: 1
Registriert: Mo 17. Okt 2022, 16:36

LDAP-Attribute mit LDAPSend ändern

Beitrag von MartinKoeditz »

Hallo zusammen,

hat jemand Erfahrungen mit dem Ändern von LDAP-Attributen mittels Synapse LDAPSend gemacht? Ich versuche, die Beschreibung von Benutzern zu ändern. Dies klappt jedoch nicht.

Hier mein Code:

Code: Alles auswählen

unit Main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComObj, lDapSend, fpjson, jsonparser;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  ldap: TLDAPsend;
  lSearchAttribs: TStringList;
  lAttrib: TLDAPAttribute;
begin
  ldap := TLDAPsend.Create;
  lSearchAttribs := TStringList.Create;
  lAttrib := TLDAPAttribute.Create;
  try
    ldap.TargetHost := '10.1.1.200';
    ldap.UserName := 'syndesk-dev\administrator';
    ldap.Password := 'secret';

    ldap.Login;
    if ldap.Bind then
    begin
      Memo1.Lines.add('Bind OK');
      lSearchAttribs.Add('sAMAccountName');
      lSearchAttribs.Add('distinguishedName');

      lSearchAttribs.Add('title');
      lSearchAttribs.Add('member');
      lSearchAttribs.Add('description');
      lSearchAttribs.Add('lastLogonTimestamp');
      ldap.Search('CN=Administrator,CN=Users,DC=syndesk-dev,DC=local', False, '', lSearchAttribs);
      Memo1.Lines.add(LDAPResultDump(ldap.searchresult));

      lAttrib.Clear;
      lAttrib.AddPair('description', 'Admin-Beschreibung');
      if(ldap.Modify('CN=Administrator,CN=Users,DC=syndesk-dev,DC=local', TLDAPModifyOp.MO_Replace, lAttrib) = false) then
      begin
           Memo1.Lines.add('Ergebnis: ' + ldap.ResultString);
      end;

    end;
    ldap.Logout;
  finally
    ldap.Free;
    lSearchAttribs.Free;
  end;
end;

end.
Als Ergebnis erhalte ich:

Code: Alles auswählen

Memo1
Bind OK
Results: 1

Result: 0
  Object: CN=Administrator,CN=Users,DC=syndesk-dev,DC=local
  Attribute: description
    Vordefiniertes Konto für die Verwaltung des Computers bzw. der Domäne
  Attribute: distinguishedName
    CN=Administrator,CN=Users,DC=syndesk-dev,DC=local
  Attribute: sAMAccountName
    Administrator
  Attribute: lastLogonTimestamp
    133101479466054732

Ergebnis: 00000057: LdapErr: DSID-0C090EBF, comment: Error in attribute conversion operation, data 57, v3839
Die Abfrage von Objekten funktioniert. Nur das Ändern wirft mir Fehler aus. Eventuell nutze ich die falsche Syntax. Wäre toll, wenn jemand schonmal was ähnliches gemacht hat.

Dank und Gruß
Martin

schoschy
Beiträge: 24
Registriert: Di 18. Okt 2022, 15:46

Re: LDAP-Attribute mit LDAPSend ändern

Beitrag von schoschy »

Hab ich mir extra einen Account machen müssen. :)

Attribute können mehrfach verwendet werden, weshalb dein modify ins leere rennt.
Ein changetype modify sieht in etwa so aus (apache directory studio: log)

Code: Alles auswählen

changetype: modify
delete: description
description: 2
-
add: description
description: 23
-
Es könnte also im lAttrib ein verweis auf das Attribut fehlen, welches "geändert" werden soll.
Synapse LDAPSend mal durchkämmen, was TLDAPModifyOp.MO_Replace genau macht.

Schoschy

schoschy
Beiträge: 24
Registriert: Di 18. Okt 2022, 15:46

Re: LDAP-Attribute mit LDAPSend ändern

Beitrag von schoschy »

Bin hier heute selbst gestolpert ;)

Da das ModifyDN nicht in google auffindbar war, hier eine Kurze Erweiterung zum TLDAPsend.Search, welches im WIKI steht.

Code: Alles auswählen

  procedure TMyApplication.DoRun;
  var
    ErrorMsg: string;
    ldap: TLDapsend;
    latr: TLDAPAttribute;
    lObj: String;
  begin
    ...
    { add your program here }
    try
      ldap := TLDAPSend.Create;
      ldap.Version := 3;
      ldap.TargetHost := '<IP>';
      ldap.Username := '<AdminUser>';
      ldap.Password := '<PW>';
      if ldap.Login then
      begin
        if ldap.Bind then
        begin


          lObj := 'cn=MANN,ou=public,ou=phonebook,dc=example,dc=de';
          latr := TLDAPAttribute.Create;

          // latr ist eine erweiterte TStringList
          latr.AttributeName := 'givenName';

          (* DELETE *)
          // Add gibt die zu behandelnden Werte des Attributs an
          latr.Add('MUSTER');
          ldap.Modify(lObj, MO_Delete, latr);
          WriteLn(ldap.ResultString);

          (* ADD *)
          // clear des inhalts der TStringList, nicht vom AttributNamen
          latr.Clear;
          latr.Add('Muster');
          ldap.Modify(lObj, MO_Add, latr);
          latr.Clear;
          WriteLn(ldap.ResultString);

          (* REPLACE *)
          latr.AttributeName := 'sn';
          latr.Add('Mann');
          ldap.Modify(lObj, MO_Replace, latr);
          WriteLn(ldap.ResultString);

          (* MODIFY DN *)
          // ModifyDN ändert den Eintrag selbst (also den RDN)
          ldap.ModifyDN(lObj, 'cn=MusterMann', '', True);
          WriteLn(ldap.ResultString);

          (* MODIFY DN PATH *)
          lObj := 'cn=MusterMann,ou=public,ou=phone book,dc=combox,dc=sinus,dc=de';
          ldap.ModifyDN(lObj, 'cn=MusterMann', 'ou=woanders,ou=phonebook,dc=example,dc=de', True);
          WriteLn(ldap.ResultString);
             
        end;
      end;
    finally    
      latr.Free;
      ldap.Free;
    end;
    ReadLn;
    // stop program loop
    Terminate;
  end;  

Antworten