2009-08-19 35 views
20

Potrzebuję utworzyć nowego użytkownika w Active Directory. Znalazłem kilka przykładów takich jak:Utwórz użytkownika Active Directory w .NET (C#)

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); 
     } 
     } 
    } 
} 

Po uruchomieniu tego kodu nie otrzymuję żadnych błędów, ale nie utworzono nowego użytkownika.

Konto, na którym przeprowadzam test, ma wystarczające uprawnienia do utworzenia użytkownika w docelowej jednostce organizacyjnej.

Czy brakuje mi czegoś (ewentualnie jakiegoś wymaganego atrybutu obiektu użytkownika)?

Jakieś pomysły, dlaczego kod nie podaje wyjątków?

EDIT
Następujące pracował dla mnie:

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(); 

Tak było rzeczywiście kilka problemów:

  1. CommitChanges musi być wywoływana na user (Dzięki Rob)
  2. Zasady haseł uniemożliwiały utworzenie użytkownika (dzięki Marc)

Odpowiedz

16

myślę dzwonisz po niewłaściwej CommitChanges DirectoryEntry.W dokumentacji MSDN (http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx) stwierdza następujące (podkreślenie dodane przeze mnie)

należy wywołać metodę CommitChanges na nowego wpisu aby tworzenie stałe. Po wywołaniu tej metody można ustawić obowiązkowe wartości właściwości dla nowego wpisu. Każdy dostawca ma inne wymagania dotyczące właściwości, które należy ustawić przed wywołaniem metody CommitChanges. Jeśli te wymagania nie zostaną spełnione, dostawca może rzucić wyjątek. Skontaktuj się z dostawcą, aby ustalić, które właściwości należy ustawić przed wprowadzeniem zmian.

Więc jeśli zmienić swój kod do user.CommitChanges() powinno działać, jeśli trzeba ustawić właściwości więcej niż tylko nazwa konta to powinieneś dostać wyjątek.

Ponieważ obecnie wywoływana jest funkcja CommitChanges() w jednostce organizacyjnej, która nie została zmieniona, nie będzie żadnych wyjątków.

+0

Dobry połów !! :-) –

+1

moc czytania "podręczników" w akcji :) – balexandre

8

Zakładając swoją ścieżkę OU OU=x,DC=y,DC=com naprawdę istnieje - to powinno działać :-)

rzeczy do sprawdzenia:

  • jesteś dodanie wartości do "samAccountName" - dlaczego nie zrobić wystarczy ustawić jej wartość:

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

przeciwnym wypadku może skończyć się z sever al samAccountNames - i to nie zadziała .....

  • nie jesteś ustawienie właściwości do niczego userAccountControl - spróbuj:

    user.Properties["userAccountControl"].Value = 512; // normal account 
    
  • masz wiele kontrolerów domen w twoje org? Jeśli ty i używasz tego "bezserwerowego" wiązania (nie określając żadnego serwera w ścieżce LDAP), możesz być zaskoczony tym, co tworzy użytkownik :-) i potrwa od kilku minut do pół godziny do synchronizacji w całej sieci

  • Czy masz ścisłą politykę haseł? Może to jest problem. Przypominam, że musieliśmy najpierw utworzyć użytkownika z opcją "nie wymaga hasła", najpierw wykonać polecenie .CommitChanges(), następnie utworzyć wystarczająco silne hasło, ustawić je na użytkowniku i usunąć tę opcję użytkownika.

Marc

0

Sprawdź kod poniżej

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) 
      { 

      } 
     } 
Powiązane problemy