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

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

то есть в 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(
        "([email protected])");
SearchResult adSearchResult = adSearch.FindOne();

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

Любые идеи?


person Sophia    schedule 12.03.2009    source источник


Ответы (4)


Имя «до 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, но это необязательное поле.

person Alan    schedule 12.03.2009
comment
Нет, это не так. SAMAccountName не содержит части DOMAIN \, что делает его бесполезным для запросов на уровне леса. - person Chris KL; 20.07.2011
comment
Действительно, отсутствие DOMAIN \ проблематично. - person ; 20.06.2012
comment
К сожалению, комментарий не соответствует образцу кода. Да, sAMAccountName - это просто часть имени пользователя DOMAIN \ username. sAMAccountName не имеет концепции форреста, потому что это концепция до Windows2000. Если вам нужно выполнить поиск в лесу домена W2k +, используйте UPN username@DOMAIN - person Alan; 06.05.2013

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

person marc_s    schedule 12.03.2009

Добавить ссылку на 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 [email protected]
            nameTranslate.Set(nameTypeNT4, ntUser);
            String userPrincipalName = nameTranslate.Get(nameTypeUserPrincipalName);

            Console.WriteLine(userPrincipalName);
person Dmitri Kouminov    schedule 16.06.2009
comment
Использование NameTranslate для получения DSN - правильный путь. - person Johannes Kuhn; 13.05.2013
comment
Привет, я пытаюсь это сделать, но когда я добавляю Active DS Type Library, отображается желтый треугольник, как предупреждение. Я в windows 10, знаете, что случилось? Благодарность - person Lautaro Cozzani; 15.06.2016

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

System.DirectoryServices.AccountManagement namespace.

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

Brent

person Brent Pabst    schedule 15.04.2011