Как получить адрес электронной почты пользователя из Active Directory?
Я пытаюсь получить адрес электронной почты пользователя в AD безуспешно.
String account = userAccount.Replace(@"Domain\", "");
DirectoryEntry entry = new DirectoryEntry();
try {
DirectorySearcher search = new DirectorySearcher(entry);
search.PropertiesToLoad.Add("mail"); // e-mail addressead
SearchResult result = search.FindOne();
if (result != null) {
return result.Properties["mail"][0].ToString();
} else {
return "Unknown User";
}
} catch (Exception ex) {
return ex.Message;
}
Может ли кто-нибудь увидеть проблему или указать правильное направление?
Ответы
Ответ 1
Отказ от ответственности: Этот код не ищет одно точное совпадение, поэтому для domain\j_doe
он может вернуть адрес электронной почты domain\j_doe_from_external_department
, если такая учетная запись с таким же именем также существует. Если такое поведение нежелательно, либо используйте фильтр samAccountName вместо целого ana, использованного ниже, либо дополнительно отфильтруйте результаты.
Я успешно использовал этот код (где "account" - это имя пользователя для входа без домена (домен\account):
// get a DirectorySearcher object
DirectorySearcher search = new DirectorySearcher(entry);
// specify the search filter
search.Filter = "(&(objectClass=user)(anr=" + account + "))";
// specify which property values to return in the search
search.PropertiesToLoad.Add("givenName"); // first name
search.PropertiesToLoad.Add("sn"); // last name
search.PropertiesToLoad.Add("mail"); // smtp mail address
// perform the search
SearchResult result = search.FindOne();
Ответ 2
Вы, ребята, слишком много работаете:
// Look up the current user email address
string eMail = UserPrincipal.Current.EmailAddress;
Ответ 3
Вы забыли фильтр.
Попробуйте добавить это перед вызовом FindOne:
search.Filter = String.Format("(sAMAccountName={0})", account);
Ответ 4
Вы можете попробовать приведенный ниже метод GetUserEmail. Если вы хотите найти адрес электронной почты для вошедшего в систему пользователя в MVC, вызовите функцию GetUserEmail() с User.Identity.Name.
using System.DirectoryServices;
using System.Linq;
public string GetUserEmail(string UserId)
{
var searcher = new DirectorySearcher("LDAP://" + UserId.Split('\\').First().ToLower())
{
Filter = "(&(ObjectClass=person)(sAMAccountName=" + UserId.Split('\\').Last().ToLower() + "))"
};
var result = searcher.FindOne();
if (result == null)
return string.Empty;
return result.Properties["mail"][0].ToString();
}
GetUserEmail(User.Identity.Name) //Get Logged in user email address
Ответ 5
Кроме того, где вы извлекаете имя пользователя из (сохраненного, пользовательского ввода, текущего идентификатора)? Имя пользователя может легко меняться (быть переименованным) - идентификация входа в систему SID/Windows с другой стороны не изменяется - так что вам лучше будет делать фильтры/поиски по SID, а не samaccountname - если это возможно и/или необходимо по дизайну...
Ответ 6
update: fredrick прибил его...
Якоб прав. Вам нужно отфильтровать поиск. Вы можете делать всевозможные and
и or
там тоже, если вам нужно, но я думаю, что sAMAccountName
достаточно. Возможно, вы захотите запустить ADSI-инструмент (он, как мне кажется, в наборе ресурсов), который позволяет вам ходить по AD, как в реестре. это отлично подходит для просмотра свойств. Затем найдите пользователя, определите, какую поддержку вы хотите (в этом случае почта), а что это primary key
- sAMAccountName
, но вы также можете фильтровать по типу node.
Я нахожусь на mac, поэтому я не могу проверить его для вас, но каждый node в AD имеет тип, и вы можете добавить его в свой фильтр. Я думаю, это выглядит так:
((sAMAccountName=bob) & (type=User))
Опять же, проверьте, что - я знаю, что это не type = user, а что-то вроде этого.