38

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

即在 Web.config 中:

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

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


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

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

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

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

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

有任何想法吗?

4

4 回答 4

54

“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();
   }
}

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

于 2009-03-12T05:53:10.070 回答
44

Alan 已经给了您正确的答案 - 使用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

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

于 2009-03-12T06:06:06.560 回答
11

添加对 COM“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);
于 2009-06-16T18:45:16.703 回答
4

如果您使用的是 .NET 3.5 SP1+,更好的方法是查看

System.DirectoryServices.AccountManagement namespace.

它具有查找人员的方法,您几乎可以传递您想要的任何用户名格式,然后返回您需要的大部分基本信息。如果您在加载更复杂的对象和属性方面需要帮助,请查看http://umanage.codeplex.com的源代码,它得到了一切。

布伦特

于 2011-04-15T04:52:20.730 回答