c# - tutorial - gestion des utilisateurs asp.net mvc



Impossible de définir le mot de passe avec DirectoryEntry.Invoke lorsque l'utilisateur est créé dans AD à l'aide de ASP.NET C# (1)

Une application Web crée un utilisateur à partir d'une page de gestion du personnel qui à son tour ajoute l'utilisateur à Active Directory. Voici le code pour faire ceci:

DirectoryEntry Folder = new DirectoryEntry("LDAP://XXXX.com/CN=ContainerName, DC=XXXX, DC=com", admin, adminPwd, AuthenticationTypes.None);

    if (Folder.SchemaEntry.Name == "container")
    {
        DirectoryEntry user = Folder.Children.Add("CN=" + txtFirstname.Text + " " + txtLastname.Text, "User");

        if (DirectoryEntry.Exists(user.Path))
        {
            // Error Msg Here
        }
        else
        {
            // Required attributes
            if (txtFirstname.Text != "" && txtLastname.Text != "") { user.Properties["sAMAccountName"].Value = txtFirstname.Text.ToLower() + "." + txtLastname.Text.ToLower(); }
            if (txtFirstname.Text + " " + txtLastname.Text != "") { user.Properties["cn"].Value = txtFirstname.Text + " " + txtLastname.Text; }
            // More controls to populate Optional AD attributes.  Not entered to conserve space.  The code works however.

            user.CommitChanges();

            int val = (int)user.Properties["userAccountControl"].Value;
            user.Properties["userAccountControl"].Value = val & ~0x2;
            user.Properties["pwdLastSet"].Value = 0;
            user.CommitChanges();
            user.Invoke("SetPassword", new object[] { "SuperSecretPassword" });
            user.CommitChanges();
        }

Le problème est qu'après la création du compte, la méthode invoke ne parvient pas à définir le mot de passe. Chaque tentative de définition du mot de passe renvoie cette erreur dans l'instruction catch:

System.Reflection.TargetInvocationException was caught
HResult=-2146232828
Message=Exception has been thrown by the target of an invocation.
Source=System.DirectoryServices
StackTrace:
   at System.DirectoryServices.DirectoryEntry.Invoke(String methodName, Object[] args)
   at Personnel_Govt.CreateUser() in c:\inetpub\wwwroot\TestingFolder\Personnel\Add\Govt.aspx.cs:line 148
   at Personnel_Govt.btnSubmit_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\TestingFolder\Personnel\Add\Govt.aspx.cs:line 95
InnerException: System.UnauthorizedAccessException
   HResult=-2147024891
   Message=One or more input parameters are invalid

   Source=Active Directory
   InnerException: 

Si le mot de passe est défini manuellement dans AD avec «Reset requis» coché après la création du compte, cela fonctionnera.

Pourquoi la méthode de définition du mot de passe échoue ???


Le problème est résolu. Apparemment, le compte d'Internet Information Services (IIS_IUSRS) ne disposait pas d'autorisations pour définir des mots de passe pour le répertoire actif. Il pourrait changer les mots de passe, mais pas les définir.

Pour permettre à une page ASP.NET de définir un mot de passe AD lors de la création du compte, j'ai dû exécuter "Utilisateurs et ordinateurs Active Directory", cliquez avec le bouton droit sur le domaine, sélectionnez "Contrôle délégué". Cela ouvre un assistant qui vous permettra d'accorder au compte les autorisations IIS_IUSRS pour apporter des modifications à AD.





directoryentry