Как получить информацию о текущем пользователе 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]'.
Любые идеи?
Ответы
Ответ 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, он получил все.
Брент