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:
- 
Connessione ad Active Directory
 - 
Si ricerca l'Organization Unit in cui vuole essere creato l'utente
 - 
Viene aggiunto un nuovo ramo (l'utente)
 - 
Vengono impostate le proprietà di base
 - 
Viene invocato il metodo SetPassword per assegnare la password al vostro utente.
 - 
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à.