Подтвердить что ты не робот

Как получить информацию о текущем пользователе Active Directory в С#

Я работаю над приложением С# и 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]'.

Любые идеи?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Добавить ссылку на 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);

Ответ 4

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

System.DirectoryServices.AccountManagement namespace.

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

Брент