如何在C#中获取当前用户的Active Directory详细信息

Sop*_*hia 36 .net c# ldap active-directory windows-authentication

我正在使用一个使用Windows身份验证的C#和ASP.Net应用程序.

即在Web.config中:

<system.web>
    <authentication mode="Windows" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

我想从Active Directory获取当前用户的详细信息(全名,电子邮件地址等).


我可以SOMEDOMAIN\someuser通过使用获得他们的Windows 2000用户登录名(例如:)

string username = HttpContext.Current.Request.ServerVariables["AUTH_USER"];
Run Code Online (Sandbox Code Playgroud)

我已经使用他们当前的登录名(而不是他们的Windows 2000用户登录名)为用户制定了LDAP查询:

DirectorySearcher adSearch = new DirectorySearcher(
        "(userprincipalname=someuser@somedomain.com.au)");
SearchResult adSearchResult = adSearch.FindOne();
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何使用他们的前W2K登录名为用户搜索AD,或者以'someuser@somedomain.com.au'格式获取他们的登录名.

有任何想法吗?

Ala*_*lan 52

"pre Windows 2000"名称即DOMAIN\SomeBody,该Somebody部分称为sAMAccountName.

所以尝试:

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

someuser@somedomain.com.au是UserPrincipalName,但它不是必填字段.

  • 不,这不对.sAMAccountName不包含"DOMAIN"部分,使其对林范围的查询无效. (8认同)

mar*_*c_s 44

艾伦已经给你正确的答案 - sAMAccountName用来过滤你的用户.

我会添加一个关于你的使用的建议DirectorySearcher- 如果你只想要一两条信息,把它们添加到.的"PropertiesToLoad"集合中DirectorySearcher.

而不是检索整个大用户对象,然后选择一个或两个项目,这将只返回您需要的那些位.

样品:

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
Run Code Online (Sandbox Code Playgroud)

这些只是您需要指定的常用AD/LDAP属性名称.


Dmi*_*nov 11

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

            Console.WriteLine(userPrincipalName);
Run Code Online (Sandbox Code Playgroud)