Ultimamente mi è stato chiesto di automatizzare la procedura di creazione ed inserimento utenti in un ambiente Active Directory. Lavorando con ADSI attraverso System.DirectoryServices è possibile effettuare queste operazioni "di gestione" in modo semplice ed indolore.

Per prima cosa è necessario referenziare nel nostro progetto System.DirectoryServices e quindi procedere a creare una connessione al nostro path AD.

DirectoryEntry myDE = new DirectoryEntry(@"LDAP://DC=" + this.domain + ",DC=it", username, password, AuthenticationTypes.Secure);

 

dove domain è un field valorizzato con il nome del vostro dominio.

Successivamente creiamo un nostro contenitore di dati (io ho utilizzato un System.Data.DataTable valorizzato con i valori provenienti da una fonte dati Excel). Quindi procedete a creare un DataTable con almeno i seguenti dati

 

  • Nome Utente
  • Password
  • Gruppo
  • HomePage

A questo punto iniziamo a ciclare il nostro RowSet, qui il discorso inizia a farsi divertente.

 

foreach (DataRow dr in myDT.Rows)

{

       try

       {

       Console.WriteLine("Inserisco Utente " + dr[0].ToString());

       int _stasbar = 0;

       DirectoryEntry UserToAdd = myDE.Children.Find("OU=" + unit + ",OU=" + s);

       DirectorySearcher deSearch = new DirectorySearcher();

       deSearch.SearchRoot = UserToAdd;

       deSearch.Filter = "(&(objectClass=group) (samAccountName=" + dr[2].ToString() + "))";

       SearchResultCollection results = deSearch.FindAll();

       // Finisci di creare i gruppi

       DirectoryEntry AggiungiUtente = UserToAdd.Children.Add("CN=" + dr[0].ToString(), "user");

// trova lo schema in cui si vuole inserire l'utente in active directory

       AggiungiUtente.Properties["samAccountName"].Add(dr[0].ToString());

       AggiungiUtente.Properties["wWWHomePage"].Value = @http://www.mysite.it;                       AggiungiUtente.Properties["name"].Value = dr[0].ToString();

       AggiungiUtente.Properties["displayName"].Value = dr[0].ToString();

       AggiungiUtente.Properties["userPrincipalName"].Value = dr[0].ToString() + "@Dominio.it";

       AggiungiUtente.Properties["description"].Add(dr[5].ToString());

       AggiungiUtente.CommitChanges();

       // Dopo il primo invoke passa la password al ramo corretto

       AggiungiUtente.Invoke("SetPassword", dr[1].ToString());

       AggiungiUtente.CommitChanges();

       UsersOperations UP = new UsersOperations();

       UP.CantChagePassword(AggiungiUtente);

       AddToGroupUser(dr[2].ToString(), dr[0].ToString());

       _stasbar++;

       // a fini statistici aumenta il contatore delle operazioni

       }

       catch (Exception ex)

       {

       Console.WriteLine("Error : " + ex.Message.ToString() + " " + ex.StackTrace.ToString());

       Console.WriteLine("Premete un tasto qualsiasi per continuare");

       Console.ReadLine();

       }

}

 

Il codice esegue le seguenti operazioni:

  1. Connessione ad Active Directory
  2. Si ricerca l'Organization Unit in cui vuole essere creato l'utente
  3. Viene aggiunto un nuovo ramo (l'utente)
  4. Vengono impostate le proprietà di base
  5. Viene invocato il metodo SetPassword per assegnare la password al vostro utente.
  6. Viene invocate un metodo esterno di nome AddToGroupUser

///

/// Aggiunge un utente esistente all'interno di un gruppo esistente

///

/// string il nome del gruppo senza CN

/// strin gil nome dell'utente senza CN

public void AddToGroupUser(string Gruppo, string Utente)

{

DirectoryEntry oGrp = new DirectoryEntry("LDAP://CN=" + Gruppo + ",OU=Produzione,OU=MiaOrganizationUnit,DC=MioDominio,DC=it", "admin", "password", AuthenticationTypes.Secure);

oGrp.Invoke("Add", new Object[] {"LDAP://CN=" + Utente + ",OU=Produzione,OU=MiaOrganizationUnit,DC=MioDominio,DC=it"});

}

 

L'assegnazione dell'utente ad un gruppo è l'ultima delle operazioni da effettuare in una applicazione Batch.
Il metodo qui sopra assegna l'entità (utente) ad un altra entità contenitore (gruppo).

 

Successivamente alla creazione è necessario abilitare gli utenti.

 

///

/// Abilita un account in Active Directory

///

/// System.DirectoryServices.DirectoryEntry

public void EnableAccount(DirectoryEntry de)

{

       try

       {

       de.Properties["userAccountControl"].Value = 0x0001;

       de.CommitChanges();

       }

       catch (Exception ex)

       {

// Exception Gestita

       }

}

A questo punto potete aprire lo Snap-In di Active Directory e gustarvi lo spettacolo ;)

A dir la verità è anche possibile elevarsi di più. Per esempio potete automatizzare ancora di più l'operazione con un Windows Service ed un FileSystemWatcher. Create il vostro file Excel, inserite i valori e spostate semplicemente il file all'interno di questa cartella... et voilà.