Een tijdje geleden plaatsen we al een artikeltje betreft impersonation in ASP.NET. Impersonation komt oa. om de hoek kijken wanneer we via .NET code onze Active Directory willen manipuleren. In dit artikeltje geven we hieromtrent wat code cadeau (als nieuwjaarscadeau ;). Opgelet deze code is met momenten zeer ingrijpend en vraagt nooit of u het wel zeker weet. Voorzichtigheid is geboden !
Voor alles hebben we de .NET Class “System.DirectoryServices” nodig dus zeker niet vergeten …
1: using System.DirectoryServices;
2: using System.DirectoryServices.ActiveDirectory;
Omdat zowel gebruikers/groepen/… ergens moeten gemaakt worden schrijven we eerst een kleine functie een OU zoekt. We kunnen een OU ook wel rechstreeks aanspreken maar zijn dan nooit zeker dat hij wel bestaat. Als hij uit ons zoekresultaat komt wel.
1: private DirectoryEntry Find(String sLdap, String sQuery)
2: {
3: DirectoryEntry Found;
4: DirectoryEntry OU = new DirectoryEntry(sLdap, "admin", "admin");
5: DirectorySearcher dsZoeken = new DirectorySearcher(OU);
6: dsZoeken.Filter = sQuery;
7: SearchResult srResultaat = dsZoeken.FindOne();
8: if (srResultaat != null)
9: Found = srResultaat.GetDirectoryEntry();
10: else
11: Found = null;
12: return Found;
13: }
Het resultaat van deze routine is een DirectoryEntry object (worst case zit er wel NULL in), dus dat moet je wel even controleren als je de functie gebruikt hebt. Een user aanmaken in de net gevonden OU kan je doen met onderstaande code. De eerste parameter van de functie is het DirectoryEntry object wat we net vonden met de vorige routine. UserObject is een zelf gedefinieerd object. (Zie volgende stukje code).
1: private bool CreateUser(DirectoryEntry deOU, UserObject gebruiker)
2: {
3: bool gelukt = true;
4: try
5: {
6: DirectoryEntries workingOU = deOU.Children;
7: DirectoryEntry user = workingOU.Add("CN=" + gebruiker.Gebruikersnaam, "user");
8: user.Properties["sAMAccountName"].Add(gebruiker.Gebruikersnaam);
9: user.Properties["sn"].Add(gebruiker.Familienaam);
10: user.Properties["givenName"].Add(gebruiker.Voornaam);
11: user.Properties["Description"].Add("Test Account");
12: user.CommitChanges();
13: }
14: catch (Exception e)
15: {
16: Console.WriteLine(e.Message);
17: gelukt = false;
18: }
19: return gelukt;
20: }
1: public class UserObject
2: {
3: public String Gebruikersnaam { get; set; }
4: public String Voornaam { get; set; }
5: public String Familienaam { get; set; }
6: public String Wachtwoord { get; set; }
7: public String Email { get; set; }
8: }
Met het allereerste stukje code in deze post kan je niet alleen een OU zoeken maar ook een gebruiker. Dat gaan we doen als we een gebruiker willen wijzigen. Afhankelijk of je een OU of een User zoekt gebruik je de routine als volgt.
1: DirectoryEntry putithere = Find("LDAP://SomeADServer/DC=Domain,DC=TLD", "OU=lookingforthisou");
2: of
3: DirectoryEntry putithere = Find("LDAP://SomeADServer/DC=Domain,DC=TLD", "SAMAccountName=lookingforthisou");
4:
5: if (putithere != null)
6: //object is gevonden
7: else
8: //object is niet gevonden
9:
Bij vragen of opmerkingen hoor ik graag van u!