36 votes

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

Je suis en train de travailler sur un C# et ASP.Net l'application, qui utilise l'Authentification Windows.

c'est à dire dans le Web.config:

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

Je veux obtenir les détails de l'utilisateur actuel (nom, prénom, adresse email, etc) à partir d'Active Directory.


Je peux obtenir leur pré Windows 2000, nom d'utilisateur (par exemple: SOMEDOMAIN\someuser) à l'aide de

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

J'ai travaillé sur la requête LDAP pour l'utilisateur, à l'aide de leur nom d'utilisateur (pas avant Windows 2000, nom d'utilisateur):

DirectorySearcher adSearch = new DirectorySearcher(
        "(userprincipalname=someuser@somedomain.com.au)");
SearchResult adSearchResult = adSearch.FindOne();

Cependant, je ne sais pas comment faire pour rechercher de la publicité pour l'utilisateur à l'aide de leur pré W2K nom de connexion, ou obtenir leur nom de connexion dans la 'someuser@somedomain.com.au format.

Des idées?

52voto

Alan Points 21367

Le nom "pre 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();
   }
}
 

someuser@somedomain.com.au est le nom UserPrincipalName, mais ce n'est pas un champ obligatoire.

44voto

marc_s Points 321990

Alan vous ai déjà donné la bonne réponse - utiliser l' sAMAccountName pour filtrer votre utilisateur.

Je voudrais ajouter une recommandation au sujet de votre utilisation de l' DirectorySearcher - si vous souhaitez seulement une ou deux pièces de l'information, les ajouter dans la "PropertiesToLoad" de la collecte de l' DirectorySearcher.

Au lieu de récupérer le grand ensemble de l'objet utilisateur et ensuite choisir un ou deux objets, ce sera juste retour exactement les éléments dont vous avez besoin.

Exemple:

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

Ceux-ci sont simplement l'habitude AD/LDAP noms de propriété, vous devez spécifier.

11voto

Dmitri Kouminov Points 253

Ajouter une référence à COM "Bibliothèque de types Active DS"


             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 Name.User@Company.com
            nameTranslate.Set(nameTypeNT4, ntUser);
            String userPrincipalName = nameTranslate.Get(nameTypeUserPrincipalName);

            Console.WriteLine(userPrincipalName);
 

4voto

Brent Pabst Points 569

Si vous utilisez .NET 3.5 SP1 +, le meilleur moyen de le faire est de consulter la

 System.DirectoryServices.AccountManagement namespace.
 

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

Brent

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X