Delphi-PRAXiS

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

Sasuke 31. Mär 2008 14:40

Re: Active Directory Benutzer anlegen
 
Hi.

ich hab hier noch ein kleines Problem mit der Funktion von Alter Mann. Bei "destOU:= GetObject(ADsPath) As IADsContainer;" sagt er"Inkompatible Typen: 'HGDIOBJ' und 'WideString'". Ich habe die Funktion aber auch nicht so eins zu eins übernommen sondern in meine Procedure integriert.

Gruß

marabu 31. Mär 2008 15:23

Re: Active Directory Benutzer anlegen
 
Es gibt noch eine andere Funktion namens GetObject(). Setze den passenden Unit-Namen vor den Aufruf und es wird die richtige Funktion aufgerufen.

Sasuke 8. Apr 2008 09:58

Re: Active Directory Benutzer anlegen
 
Hi,

ich wollte mich mal bedanken das ihr mir so sehr geholfen habt. Ich bin echt weit gekommen. Könnt ihr mir vielleicht noch eine Frage beantworten, wie kann ich folgende Option einrichten:
"Kennwort bei der nächsten Anmeldung ändern"
"Benutzer kann Kennwort nicht ändern"
"Kennwort läuft nicht ab"
"Konto ist deaktiviert"

Ich hab schon mehrere möglichkeiten Versucht doch leider ohne Erfolg.

Gruß

Alter Mann 8. Apr 2008 18:37

Re: Active Directory Benutzer anlegen
 
Gern geschehen.


Schau doch mal in der MSDN nach userAccountControl.

Gruß


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