La problématique est simple : j'ai besoin de récupérer le nom complet d'un utilisateur qui se connecte grâce à l'authentification Windows (Active Directory) sur l'intranet que je suis en train de développer pour un client en ASP.Net et C#.
Dans un premier temps, je veux simplement récupérer le nom de connexion de l'utilisateur (de type DOMAIN\User) que je vais ensuite réutiliser dans une variable appelée principal.
this.Context.User.Identity.Name
Avant de pouvoir rechercher les informations, il faut définir le nom de domaine, le filtre de recherche dans l'AD contenant le nom de connexion, et les propriétés à récupérer.
string filter = string.Format("(&(ObjectClass={0})(sAMAccountName={1}))",
"person", principal.Split('\\')[1]);
string domain = "DOMAIN";
string[] properties = new string[] { "fullname" };
Concernant le filtre, on cherche une personne (person) pour laquelle on ne garde en argument que le nom de connexion sans le domaine (dans une variable domain à part), d'où l'utilisation de la méthode Split(). Quant aux propriétés, seul le nom complet fullname nous intéresse.
Il ne reste plus qu'à définir les objets suivants, en leur passant les paramètres nécessaires (dont les variables définies ci-dessus) :
DirectoryEntry adRoot = new DirectoryEntry("LDAP://" + domain, null, null,
AuthenticationTypes.Secure);
DirectorySearcher searcher = new DirectorySearcher(adRoot);
searcher.SearchScope = SearchScope.Subtree;
searcher.ReferralChasing = ReferralChasingOption.All;
searcher.PropertiesToLoad.AddRange(properties);
searcher.Filter = filter;
SearchResult result = searcher.FindOne();
DirectoryEntry directoryEntry = result.GetDirectoryEntry();
Après avoir récupéré l'objet correspondant à la recherche, il ne reste plus qu'à en extraire les propriétés demandées.
string fullName = directoryEntry.Properties["displayName"][0].ToString();
string firstName = directoryEntry.Properties["givenName"][0].ToString();
string lastName = directoryEntry.Properties["sn"][0].ToString();
string email = directoryEntry.Properties["mail"][0].ToString();