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

我正在使用Windows身份validation的C#和ASP.Net应用程序。

即在Web.config中:

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

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


我可以通过使用以前的Windows 2000用户login名(例如: SOMEDOMAIN\someuser

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

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

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

但是,我不知道如何使用他们的W2Klogin名login名searchAD,或者以“someuser@somedomain.com.au”格式获取他们的login名。

有任何想法吗?

“预Windows 2000”的名称即DOMAIN\SomeBodySomebody部分被称为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,但它不是必填字段。

艾伦已经给了你正确的答案 – 使用sAMAccountName过滤你的用户。

如果您只需要一两条信息,请将其添加到DirectorySearcher"PropertiesToLoad"集合中。

而不是检索整个大的用户对象,然后挑选一个或两个项目,这只会返回你所需要的位。

样品:

 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属性名称。

添加对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); 

如果你使用的是.NET 3.5 SP1 +,那么更好的方法是看看

 System.DirectoryServices.AccountManagement namespace. 

它有find人的方法,你几乎可以通过任何你想要的用户名格式,然后返回你需要的大部分基本信息。 如果你需要加载更复杂的对象和属性的帮助,请查看http://umanage.codeplex.com的源代码。;

黑雁