Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Active Directory Benutzer anlegen (https://www.delphipraxis.net/110579-active-directory-benutzer-anlegen.html)

Sasuke 20. Mär 2008 11:30


Active Directory Benutzer anlegen
 
Hallo Community,

ich versuche momentan User in der AD anzulegen.
Ich habe auch schon einige Beiträge hier im Forum gelesen, echt Klasse, aber es bringt mich irgendwie nicht weiter.
Ich stehe momentan total aufm Schlauch. :wall:
Ich habe die Libery ActiveDS_TLB eingebunden, aber danach komme ich irgendwie nicht weiter.
Könnte mir das jemand mal so erklären das es auch ein nicht Delphi Guru versteht?
Herzlichen Danke schonmal an euch.

Sasuke 28. Mär 2008 09:39

Re: Active Directory Benutzer anlegen
 
Hallo,

ich habe in den letzten Tag bisschen rum probiert und folgendes entwickelt. Hab mir einige Beiträge zu dem Thema hier im Forum angesehen.
Delphi-Quellcode:
procedure adduser (ADDUVorname, ADDUNachname, ADDUBenutzername, ADDUPosition, ADDUPassword, ADDUSkript: String);
var
    Container : IADsContainer;
    NewObject : IADs;
    User     : IADsUser;
    hr       : HREsult;
begin

       if (ADDUVorname = '') and (ADDUNachname = '') and (ADDUBenutzername = '') and (ADDUPosition = '') then
        begin
         showmessage ('Durchführung war erfolgreich');
         Application.Terminate
        end
        else
          begin
              try
              CoInitialize(nil);

               hr := ADsGetObject('WinNT://OU="Neue Benutzer",DC="test",DC="net"',IADs,Container);
                 if Failed(hr) then Exit;

                  NewObject := Container.Create('User','CN='+ADDUNachname+' '+ADDUVorname) as IADsUser;

                  NewObject.QueryInterface(IID_IADsUser, User);

                  user.Put('Name',ADDUNachname+' '+ADDUVorname+' - '+ADDUBenutzername);
                  user.Put('sAMAccountName',ADDUBenutzername);
                  user.Put('userPrincipalName',ADDUBenutzername+'@test.net');
                  user.Put('Firstname',ADDUVorname);
                  user.Put('LastName', ADDUNachname);
                  user.Put('FullName', ADDUVorname+' '+ADDUNachname);
                  user.Put('LoginScript',ADDUSkript);
                  User.SetPassword(ADDUPassword);
                  user.AccountDisabled:=false;
               
            end;
             Container._Release;
             NewObject._Release;
             User._Release;
             CoUninitialize;

        end;

end;
Es wird aber kein neuer Benutzer in der AD angelegt, es kommt auch keine Fehlermeldung.
Wäre echt super wenn mir jemand helfen könnte.

Alter Mann 28. Mär 2008 09:58

Re: Active Directory Benutzer anlegen
 
Hi

eine Frage hätte ich dazu. Warum 'WinNT://'?


Ergänze mal Deinen Code an dieser Stelle :
Delphi-Quellcode:
...
user.AccountDisabled:=false;

user.SetInfo;               // <- Daten schreiben!
...
dann wird auch der User angelegt.

Gruß

Sasuke 28. Mär 2008 10:13

Re: Active Directory Benutzer anlegen
 
Hi,

ich habs mit "LDAP://" versucht aber dann bekam ich eine Fehlermeldung.
Danke für deine schnelle Hilfe.
Ich hab das mit dem "user.setinfo;" mal getestet aber leider ohne erfolg.

Alter Mann 28. Mär 2008 12:51

Re: Active Directory Benutzer anlegen
 
Hi,


ist nicht schön. Wie ich eben gesehen habe (21:08 ; 28.03.08 ), erst einmal herzlich Willkommen in der DP!

Versuchen wir es mal so:
Delphi-Quellcode:
function CreateUser(ADsPath              : WideString; // zB: 'LDAP://OU=NeueBenutzer,DC=test,DC=Local,DC=net' <- dies ist der Ort wo der User angelegt wird
                    FullName             : WideString;
                    LastName             : WideString;
                    FirstName            : WideString;
                    UserPrinzipalName    : WideString;
                    sAMAccountName       : WideString;
                    Password             : WideString;
                    var distinguishedName : WideString; // Rückgabe wird für weitere 'vereinfachte' Aktionen gebraucht
                    AccountDisabled      : Boolean) : Boolean;
var
  destOU : IADsContainer; // Eine OU ist ein Container
  usr   : IADsUser;      // User-Object
begin
  destOU:= GetObject(ADsPath) As IADsContainer;                   // Verbindung zum Container herstellen
  try
    usr:= destOU.Create('user', 'CN=' + FullName) As IADsUser;    // neues 'User'-Object erstellen, so etwas wie 'Form := TForm.Create(nil)'
    usr.Put('sAMAccountName', sAMAccountName);                    // Mindestents diese Werte übergeben
    usr.Put('userPrincipalName', UserPrinzipalName);
    usr.Put('givenName', FirstName);
    usr.Put('sn', LastName);
    usr.Put('displayName', FullName);
    usr.SetInfo;                                                  // Werte speichern
    usr.SetPassword(UserDat.Password);                            // Erst jetzt kann das Passwort gesetzt werden
    usr.SetInfo;                                                  // Passwort speichern
    distinguishedName := usr.Get('distinguishedName');           // distinguishedName holen
    usr.AccountDisabled:= usr.AccountDisabled;                    // je nachdem Konto sperren oder aktivieren
    Result := true;
  except
    Result := false;
    on e : Exception do                                           // Falls es zu Fehlern kommt, anzeigen
      ShowMessage(e.Message);
  end;
end;

Die Routine sollte nun genau das machen wofür sie gedacht ist, einen Benutzer anlegen.
Einzige Voraussetzung: Übergabe gültiger Werte (der ADsPath muss exestieren).

Was sind 'vereinfachte' Aktionen? zB: Änderung des Familiennamens nach Heirat.
Delphi-Quellcode:
function ChangeLastName(ADspath : WideString; NewLastName : WideString) : Boolean;
var
  destOU : IADsContainer; // Eine OU ist ein Container
  usr   : IADsUser;      // User-Object
begin
   user := GetObject(ADsPath) As IADsUser;
   try
     user.PutEx(ADS_PROPERTY_CLEAR, 'sn', Null);
     user.SetInfo;
     user.Put('sn', NewLastName);
     user.SetInfo;
     Result := true;
  except
    Result := false;
    on e : Exception do                                           // Falls es zu Fehlern kommt, anzeigen
      ShowMessage(e.Message);
  end;
end;
Aufruf: ChangeLastName(distinguishedName, 'Meyer');

Was die Freigabe der Interfaceobjecte angeht, Delphi kümmert sich darum.
Die Referenzen werden verworfen, sobald sie nicht mehr benötigt werden.
Um zu wissen was was ist, also 'sn' = Nachname, siehe MSDN.


Gruß

Sasuke 29. Mär 2008 09:15

Re: Active Directory Benutzer anlegen
 
Danke für dein Hilfe. Ich werds gleich mal einbauen, testen kann ichs aber erst am Montag auf der Arbeit. Hab momentan kein Test System worauf ich die Sachen ausprobieren könnte.
Wenn ich weitere Attribute wie z.B. Anmeldeskripte oder Gruppenzugehörigkeit mit anlegen will kann ich auf die AD Feler zugreifen?

Sasuke 30. Mär 2008 09:23

Re: Active Directory Benutzer anlegen
 
Hi,

wie bekomm ich das den hin, wenn ich in einem Edit Feld die Domain eingebe, z.B. test.net. Dann muss ich das ja für die LDAP Verbindung in diese Form bringen "dc=test, dc=net" aber wie kann ich das innerhalb von einer Varibale trennen?

Gruß

RWarnecke 30. Mär 2008 11:16

Re: Active Directory Benutzer anlegen
 
Anhand des Punktes vom Domain-Namen.

Sasuke 31. Mär 2008 10:34

Re: Active Directory Benutzer anlegen
 
Hi,

wie kann ich den eine Varibale nach einem Punkt filtern?
Muss ich das was Rekursives bauen? Da ich ja zu Beginn nicht weiß was der Benutzer eingibt. Er könnte ja auch test1.test2.test3.net eingeben. Das muss ich auch irgendwie abfangen oder?

marabu 31. Mär 2008 10:40

Re: Active Directory Benutzer anlegen
 
Hi,

versuche es mal so:

Delphi-Quellcode:
function DomainToDN(const s: string): string;
var
  i: Integer;
begin
  with TStringList.Create do
  try
    Delimiter := '.';
    DelimitedText := s;
    for i := 0 to Pred(Count) do
      Strings[i] := 'dc=' + Strings[i];
    Delimiter := ',';
    Result := DelimitedText;
  finally
    Free;
  end;
end;
Getippt und nicht getestet.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Seite 1 von 2  1 2      

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