Как получить данные Active Directory текущего пользователя в C # - PullRequest
36 голосов
/ 12 марта 2009

Я работаю над приложением 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(
        "(userprincipalname=someuser@somedomain.com.au)");
SearchResult adSearchResult = adSearch.FindOne();

Однако я не знаю, как выполнить поиск AD для пользователя, используя его имя для входа до W2K, или получить его имя в формате someuser@somedomain.com.au.

Есть идеи?

Ответы [ 4 ]

52 голосов
/ 12 марта 2009

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

44 голосов
/ 12 марта 2009

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

11 голосов
/ 16 июня 2009

Добавить ссылку на 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);
4 голосов
/ 15 апреля 2011

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

System.DirectoryServices.AccountManagement namespace.

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

Brent

...