2009-08-19 8 views
20

Je dois créer un nouvel utilisateur dans Active Directory. J'ai trouvé plusieurs exemples comme les suivants:Créer un utilisateur Active Directory dans .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); 
     } 
     } 
    } 
} 

Lorsque j'exécute ce code je n'obtiens pas d'erreurs, mais aucun nouvel utilisateur n'est créé.

Le compte avec lequel j'exécute le test dispose de privilèges suffisants pour créer un utilisateur dans l'unité organisationnelle cible. Est-ce que je manque quelque chose (peut-être un attribut requis de l'objet utilisateur)?

Des idées pour lesquelles le code ne donne pas d'exceptions?

EDIT
Ce qui suit a fonctionné pour moi:

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

Donc, il y avait en fait deux problèmes:

  1. CommitChanges doit être appelé user (merci Rob)
  2. La politique de mot de passe empêchait la création de l'utilisateur (merci Marc)

Répondre

16

Je pense que vous appelez CommitChanges sur le mauvais DirectoryEntry.Dans la documentation MSDN (http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx), il stipule ce qui suit (souligné par moi)

Vous devez appeler la méthode CommitChanges sur la nouvelle entrée pour rendre la création permanente. Lorsque vous appelez cette méthode, vous pouvez définir les valeurs de propriété obligatoires sur la nouvelle entrée. Les fournisseurs ont chacun des exigences différentes pour les propriétés qui doivent être définies avant qu'un appel à la méthode CommitChanges ne soit effectué. Si ces conditions ne sont pas remplies, le fournisseur peut générer une exception. Vérifiez auprès de votre fournisseur pour déterminer quelles propriétés doivent être définies avant de valider les modifications.

Donc, si vous changez votre code à user.CommitChanges() il devrait fonctionner, si vous avez besoin de mettre plus de propriétés que simplement le nom du compte, alors vous devriez obtenir une exception.

Étant donné que vous appelez actuellement CommitChanges() sur l'unité d'organisation qui n'a pas été modifiée, il n'y aura aucune exception.

+0

Bonne prise !! :-) –

+1

le pouvoir de lire "manuels" en action :) – balexandre

8

En supposant que votre chemin OU OU=x,DC=y,DC=com existe vraiment - il devrait fonctionner :-)

choses à vérifier:

  • vous ajoutez une valeur à la "samAccountName" - pourquoi ne pas vous venez de définir sa valeur:

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

Sinon, vous pourriez vous retrouver avec sever al samAccountNames - et cela ne fonctionnera pas .....

  • vous n'êtes pas régler la userAccountControl propriété à quoi que ce soit - essayez d'utiliser:

    user.Properties["userAccountControl"].Value = 512; // normal account 
    
  • Avez-vous plusieurs contrôleurs de domaine votre organisation? Si vous utilisez cette liaison "sans serveur" (sans spécifier de serveur dans le chemin LDAP), vous pourriez être surpris de la création de l'utilisateur :-) et cela prendra plusieurs minutes jusqu'à une demi-heure synchroniser sur l'ensemble du réseau

  • Avez-vous une politique de mot de passe stricte en place? Peut-être que c'est le problème. Je rappelle que nous devions d'abord créer l'utilisateur avec l'option "ne nécessite pas de mot de passe", faire un premier .CommitChanges(), puis créer un mot de passe assez puissant, le définir sur l'utilisateur, et supprimer cette option utilisateur.

Marc

0

Vérifier le code ci-dessous

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

      } 
     } 
Questions connexes