web-dev-qa-db-fra.com

Création d'un utilisateur Active Directory avec un mot de passe en C #

Je cherche un moyen de créer des utilisateurs Active Directory et de définir leur mot de passe, de préférence sans donner à mon application/service les privilèges d'administrateur de domaine.

J'ai essayé ce qui suit:

DirectoryEntry newUser = _directoryEntry.Children.Add("CN=" + fullname, USER);
newUser.Properties["samAccountName"].Value = username;
newUser.Properties["userPassword"].Value = password;
newUser.Properties["mail"].Value = email;
newUser.CommitChanges();

L'utilisateur est créé, mais il semble que le mot de passe ne soit jamais défini sur l'utilisateur.

Quelqu'un at-il une idée sur la façon de définir le mot de passe de l'utilisateur lors de la création de l'utilisateur? Je sais à propos de

.Invoke("SetPassword", new object[] { password })

Mais cela nécessite que mon code soit exécuté avec les privilèges d'administrateur de domaine. Comme je ne vois vraiment pas l'intérêt d'octroyer à mon code des privilèges d'administrateur de domaine, juste pour définir le mot de passe initial (j'autorise également les réinitialisations de mot de passe d'utilisateur, mais celles-ci s'exécutent dans le contexte de cet utilisateur particulier), solution qui ne nécessite pas de moi de le faire.

Merci d'avance!

21
RajenK

Vous pouvez faire tout ce processus beaucoup plus facilement maintenant avec System.DirectoryServices.AccountManagement (tant que vous êtes sur .Net 3.5):

Voir ici pour un aperçu complet

Voici un exemple rapide de votre cas spécifique:

using(var pc = new PrincipalContext(ContextType.Domain))
{
  using(var up = new UserPrincipal(pc))
  {
    up.SamAccountName = username;
    up.EmailAddress = email;
    up.SetPassword(password);
    up.Enabled = true;
    up.ExpirePasswordNow();
    up.Save();
  }
}
31
Nick Craver

J'utiliserais le code de @ Nick (encapsulé dans des instructions using pour que le contexte et le principal soient correctement disposés). En ce qui concerne les privilèges, vous devez au moins disposer de suffisamment de privilèges sur l'unité d'organisation dans laquelle vous créez l'utilisateur pour créer et gérer des objets. Je créerais un utilisateur spécifique sous lequel votre programme s'exécutera et lui donnerais juste assez de privilèges pour effectuer les tâches dont il a besoin dans cette unité d'organisation spécifique, sans plus.

4
tvanfosson

Oui, vous pouvez également utiliser le code ci-dessous pour créer un grand nombre d'utilisateurs.

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

for (int i = 0; i < 10; 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)
    {
    }
}
4
kombsh

Essayez avec ce code.

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

for (int i = 0; i < 10; 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
Munna