web-dev-qa-db-fra.com

Comment obtenir les détails Active Directory de l'utilisateur actuel en C #

Je travaille sur une application C # et ASP.Net, qui utilise l'authentification Windows.

c'est-à-dire dans Web.config:

<system.web>
    <authentication mode="Windows" />
</system.web>

Je souhaite obtenir des détails sur l'utilisateur actuel (nom complet, adresse e-mail, etc.) dans Active Directory.


Je peux obtenir leur nom de connexion utilisateur antérieur à Windows 2000 (par exemple: SOMEDOMAIN\someuser) en utilisant

string username = HttpContext.Current.Request.ServerVariables["AUTH_USER"];

J'ai élaboré la requête LDAP pour l'utilisateur, en utilisant son nom de connexion actuel (et non son nom de connexion utilisateur antérieur à Windows 2000):

DirectorySearcher adSearch = new DirectorySearcher(
        "([email protected])");
SearchResult adSearchResult = adSearch.FindOne();

Cependant, je ne sais pas comment rechercher AD pour l'utilisateur en utilisant son nom de connexion pré W2K, ou obtenir son nom de connexion au format "[email protected]".

Des idées?

36
Sophia

Le nom "avant Windows 2000", c'est-à-dire DOMAIN\SomeBody, la partie Somebody est appelée sAMAccountName.

Alors essayez:

using(DirectoryEntry de = new DirectoryEntry("LDAP://MyDomainController"))
{
   using(DirectorySearcher adSearch = new DirectorySearcher(de))
   {
     adSearch.Filter = "(sAMAccountName=someuser)";
     SearchResult adSearchResult = adSearch.FindOne();
   }
}

[email protected] est le UserPrincipalName, mais ce n'est pas un champ obligatoire.

52
Alan

Alan vous a déjà donné la bonne réponse - utilisez le sAMAccountName pour filtrer votre utilisateur.

J'ajouterais une recommandation sur votre utilisation de DirectorySearcher - si vous ne voulez qu'une ou deux informations, ajoutez-les dans le "PropertiesToLoad" collection du DirectorySearcher.

Au lieu de récupérer l'intégralité du grand objet utilisateur, puis de sélectionner un ou deux éléments, cela ne fera que retourner exactement les bits dont vous avez besoin.

Échantillon:

adSearch.PropertiesToLoad.Add("sn");  // surname = last name
adSearch.PropertiesToLoad.Add("givenName");  // given (or first) name
adSearch.PropertiesToLoad.Add("mail");  // e-mail addresse
adSearch.PropertiesToLoad.Add("telephoneNumber");  // phone number

Ce ne sont que les noms de propriété AD/LDAP habituels que vous devez spécifier.

44
marc_s

Ajouter une référence à COM "Active DS Type Library"


            Int32 nameTypeNT4               = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4;
            Int32 nameTypeDN                = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_1779;
            Int32 nameTypeUserPrincipalName = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME;

            ActiveDs.NameTranslate nameTranslate = new ActiveDs.NameTranslate();

            // Convert NT name DOMAIN\User into AD distinguished name 
            // "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com"
            nameTranslate.Set(nameTypeNT4, ntUser);

            String distinguishedName = nameTranslate.Get(nameTypeDN);

            Console.WriteLine(distinguishedName);

            // Convert AD distinguished name "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com" 
            // into NT name DOMAIN\User
            ntUser = String.Empty;
            nameTranslate.Set(nameTypeDN, distinguishedName);
            ntUser = nameTranslate.Get(nameTypeNT4);
            Console.WriteLine(ntUser);

            // Convert NT name DOMAIN\User into AD UserPrincipalName [email protected]
            nameTranslate.Set(nameTypeNT4, ntUser);
            String userPrincipalName = nameTranslate.Get(nameTypeUserPrincipalName);

            Console.WriteLine(userPrincipalName);
11
Dmitri Kouminov

Si vous utilisez .NET 3.5 SP1 +, la meilleure façon de procéder est de jeter un œil à la

System.DirectoryServices.AccountManagement namespace.

Il a des méthodes pour trouver des personnes et vous pouvez à peu près passer dans n'importe quel format de nom d'utilisateur que vous souhaitez, puis retourner la plupart des informations de base dont vous auriez besoin. Si vous avez besoin d'aide pour charger les objets et les propriétés les plus complexes, consultez le code source de http://umanage.codeplex.com c'est tout.

Brent

4
Brent Pabst