У меня есть некоторые проблемы с кодом, который предназначается для нахождения пользователя в Active Directory путем поиска на их адресе электронной почты. Я попробовал 2 метода, но я иногда нахожу, что FindOne () метод не возвратит результатов в некоторых случаях. Если я ищу пользователя в GAL в Outlook, я вижу перечисленный адрес электронной почты SMTP.
Моя конечная цель должна подтвердить, что пользователь существует в AD. У меня только есть адрес электронной почты как критерии поиска, таким образом, никакой способ использовать имя или фамилию.
Метод 1: Используя почтовое свойство:
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(mail=" + email + ")";
search.PropertiesToLoad.Add("mail");
SearchResult result = search.FindOne();
Метод 2: свойство proxyAddresses:
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(proxyAddresses=SMTP:" + email + ")"; // I've also tried with =smtp:
search.PropertiesToLoad.Add("mail");
SearchResult result = search.FindOne();
Я попытался изменить случай входа адреса электронной почты, но он все еще не возвращает результат. Существует ли проблема здесь с чувствительностью к регистру? Если так, что лучший способ состоит в том, чтобы разрешить его?
Если вы используете Exchange Server, proxyAddresses является наиболее надежным средством получения их адресов электронной почты. Основной smtp-адрес обозначается заглавными буквами "SMTP:", а дополнительные адреса электронной почты будут иметь префикс из строчных букв "smtp:". Атрибут "mail" не обязательно должен быть основным SMTP-адресом, хотя обычно это так.
Вот вариант кода, который я использовал:
public static SearchResult FindAccountByEmail(string email)
{
string filter = string.Format("(proxyaddresses=SMTP:{0})", email);
using (DirectoryEntry gc = new DirectoryEntry("GC:"))
{
foreach (DirectoryEntry z in gc.Children)
{
using (DirectoryEntry root = z)
{
using (DirectorySearcher searcher = new DirectorySearcher(root, filter, new string[] { "proxyAddresses", "objectGuid", "displayName", "distinguishedName" }))
{
searcher.ReferralChasing = ReferralChasingOption.All;
SearchResult result = searcher.FindOne();
return result;
}
}
break;
}
}
return null;
}
static void Main(string[] args)
{
SearchResult result = FindAccountByEmail("someone@somewhere.com");
string distinguishedName = result.Properties["distinguishedName"][0] as string;
string name = result.Properties["displayName"] != null
? result.Properties["displayName"][0] as string
: string.Empty;
Guid adGuid = new Guid((byte[]) (result.Properties["objectGUID"][0]));
string emailAddress;
var emailAddresses = (from string z in result.Properties["proxyAddresses"]
where z.StartsWith("SMTP")
select z);
emailAddress = emailAddresses.Count() > 0 ? emailAddresses.First().Remove(0, 5) : string.Empty;
Console.WriteLine(string.Format("{1}{0}\t{2}{0}\t{3}{0}\t{4}",
Environment.NewLine,
name,
distinguishedName,
adGuid,
emailAddress));
}
У меня никогда не было проблем с поиском адресов электронной почты пользователей с учетом регистра - что произойдет, если вы будете искать адрес, точно такой, как он отображается в ADSIEDIT? Находит ли он адрес, когда он правильно обозначается?
Кстати, я всегда использовал свойство «mail», так как оно возвращает единственный исходящий адрес электронной почты пользователя по умолчанию, даже если к учетной записи прикреплено несколько адресов. Свойство "proxyAddresses" на самом деле является многозначным свойством, и вы просто ищете значение, начинаюе с "smtp:" (в свойстве оно находится в нижнем регистре). Тем не менее, пользователь может иметь несколько SMTP-адресов в своей учетной записи AD (мы это делаем), поэтому между ними свойство "mail" может быть тем, что вы ищете.
Я обнаружил, что использование SysInternals ADExplorer отлично подходит для тестирование / отладка запросов Active Directory. Поскольку вы можете создавать запросы и запускать их в Active Directory, вы можете видеть результаты, а также легко просматривать объекты и видеть все их свойства ...