webentwicklung-frage-antwort-db.com.de

Erstellen eines Active Directory-Benutzers in .NET (C #)

Ich muss einen neuen Benutzer in Active Directory erstellen. Ich habe mehrere Beispiele wie die folgenden gefunden:

using System;
using System.DirectoryServices;

namespace test {
   class Program {
      static void Main(string[] args) {
        try {
            string path = "LDAP://OU=x,DC=y,DC=com";
            string username = "johndoe";

            using (DirectoryEntry ou = new DirectoryEntry(path)) {
               DirectoryEntry user = ou.Children.Add("CN=" + username, "user");

               user.Properties["sAMAccountName"].Add(username);

               ou.CommitChanges();
            }
         } 
         catch (Exception exc) {
             Console.WriteLine(exc.Message);
         }
      }
   }
}

Wenn ich diesen Code ausführen, erhalte ich keine Fehler, aber es wird kein neuer Benutzer erstellt. 

Das Konto, mit dem ich den Test durchführe, verfügt über ausreichende Berechtigungen, um einen Benutzer in der Zielorganisationseinheit zu erstellen. 

Fehlt mir etwas (möglicherweise ein erforderliches Attribut des Benutzerobjekts)?

Irgendwelche Ideen, warum der Code keine Ausnahmen gibt?

EDIT
Folgendes hat für mich gearbeitet:

int NORMAL_ACCOUNT = 0x200;
int PWD_NOTREQD = 0x20;
DirectoryEntry user = ou.Children.Add("CN=" + username, "user");
user.Properties["sAMAccountName"].Value = username;
user.Properties["userAccountControl"].Value = NORMAL_ACCOUNT | PWD_NOTREQD;
user.CommitChanges();

Es gab also einige Probleme:

  1. CommitChanges muss auf user aufgerufen werden (danke Rob)
  2. Die Passwortrichtlinie hinderte den Benutzer daran, erstellt zu werden (danke Marc)
20
Paolo Tedesco

Ich denke, Sie rufen CommitChanges für das falsche DirectoryEntry auf. In der MSDN-Dokumentation ( http://msdn.Microsoft.com/de-de/library/system.directoryservices.directoryentries.add.aspx ) wird Folgendes angegeben (Hervorhebung durch mich).

Sie müssen die CommitChanges-Methode für den neuen Eintrag aufrufen, um die Erstellung dauerhaft zu machen. Wenn Sie diese Methode aufrufen, können Sie für den neuen Eintrag obligatorische Eigenschaftswerte festlegen. Die Anbieter haben jeweils unterschiedliche Anforderungen an Eigenschaften, die festgelegt werden müssen, bevor die CommitChanges-Methode aufgerufen wird. Wenn diese Voraussetzungen nicht erfüllt sind, kann der Provider eine Ausnahme auslösen. Erkundigen Sie sich bei Ihrem Anbieter, welche Eigenschaften festgelegt werden müssen, bevor Sie Änderungen vornehmen.

Wenn Sie also Ihren Code in user.CommitChanges () ändern, sollte dies funktionieren. Wenn Sie mehr Eigenschaften als nur den Kontonamen festlegen müssen, sollten Sie eine Ausnahme erhalten.

Da Sie derzeit CommitChanges () in der Organisationseinheit aufrufen, die nicht geändert wurde, gibt es keine Ausnahmen.

16
RobV

Angenommen, Ihr OU-Pfad existiert OU=x,DC=y,DC=com wirklich - es sollte funktionieren :-)

Dinge zu überprüfen:

  • sie fügen dem "samAccountName" einen Wert hinzu - warum setzen Sie nicht einfach seinen Wert:

    user.Properties["sAMAccountName"].Value = username;
    

Andernfalls erhalten Sie möglicherweise mehrere samAccountNames - und das funktioniert nicht .....

  • sie setzen die Eigenschaft userAccountControl nicht auf irgendetwas. Versuchen Sie es mit:

     user.Properties["userAccountControl"].Value = 512;  // normal account
    
  • haben Sie mehrere Domänencontroller in Ihrer Organisation? Wenn Sie diese "serverlose" Bindung verwenden (und keinen Server im LDAP-Pfad angeben), könnten Sie überrascht sein, wo der Benutzer erstellt wird :-) und es kann einige Minuten bis zu einer halben Stunde dauern über das gesamte Netzwerk synchronisieren

  • haben Sie eine strikte Passwortrichtlinie? Vielleicht ist das das Problem. Ich erinnere mich, dass wir den Benutzer zuvor mit der Option "Kein Kennwort erforderlich" erstellen mussten. Führen Sie zunächst eine .CommitChanges () aus, erstellen Sie dann ein ausreichend starkes Kennwort, legen Sie es für den Benutzer fest und entfernen Sie die Benutzeroption.

Marc

8
marc_s

Überprüfen Sie den folgenden Code 

 DirectoryEntry ouEntry = new DirectoryEntry("LDAP://OU=TestOU,DC=TestDomain,DC=local");

        for (int i = 3; i < 6; i++)
        {
            try
            {
                DirectoryEntry childEntry = ouEntry.Children.Add("CN=TestUser" + i, "user");
                childEntry.CommitChanges();
                ouEntry.CommitChanges();
                childEntry.Invoke("SetPassword", new object[] { "password" });
                childEntry.CommitChanges();
            }
            catch (Exception ex)
            {

            }
        }
0
kombsh