Как получить данные Active Directory текущего пользователя в C #

Я работаю над приложением C # и ASP.Net, которое использует проверку подлинности Windows.

т.е. в Web.config:

   

Я хочу получить информацию о текущем пользователе (полное имя, адрес электронной почты и т. Д.) Из Active Directory.


Я могу получить свое предварительное имя пользователя Windows 2000 (например: SOMEDOMAIN\someuser ), используя

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

Я разработал запрос LDAP для пользователя, используя их текущее имя для входа (а не их имя для входа в Windows 2000):

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

Тем не менее, я не знаю, как либо искать AD для пользователя, используя свое имя входа в W2K, либо получить свое имя пользователя в формате «[email protected]».

Есть идеи?

Имя «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(); } } 

[email protected] – это UserPrincipalName, но это не обязательное поле.

Алан уже дал вам правильный ответ – используйте 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, которые необходимо указать.

Добавить ссылку на COM «Библиотека Active DS Type»


  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); 

Если вы используете .NET 3.5 SP1 +, лучший способ сделать это – взглянуть на

 System.DirectoryServices.AccountManagement namespace. 

У него есть методы поиска людей, и вы можете в значительной степени пройти в любом формате имени пользователя, который хотите, а затем вернуть большую часть базовой информации, которая вам понадобится. Если вам нужна помощь по загрузке более сложных объектов и свойств, проверьте исходный код http://umanage.codeplex.com, он получил все.

казарка

Давайте будем гением компьютера.