В вашем коде есть пара проблем:
- Вы не фильтруете пользователей.Таким образом, этот код находит каждого пользователя в вашем домене каждый раз, когда вы запускаете его.Вы можете изменить это, используя текст, который пользователь уже ввел в качестве фильтра, и ограничив количество возвращаемых результатов (нет смысла отображать более 100 имен в элементе управления автозаполнением)
PrincipalSearcher
и все пространство имен System.DirectoryServices.AccountManagement
не очень эффективно.Например, в этом случае он загружает каждый атрибут для каждого результата, найденного за кулисами, даже если вы используете только имя и фамилию.Вы можете добиться большего успеха, напрямую используя пространство имен System.DirectoryServices
(DirectorySearcher
/ DirectoryEntry
, которое в любом случае использует пространство имен AccountManagement
).
Вот пример, которыйдолжно работать в вашем случае:
public List<string> ADUsers(string filter) {
if (string.IsNullOrEmpty(filter)) throw new ArgumentNullException(nameof(filter));
List<string> users = new List<string>();
var ds = new DirectorySearcher(
new DirectoryEntry("LDAP://abc.in"), //domain to search
$"(&(objectClass=user)(anr={filter}))", //search filter
new[] { "givenName", "sn" }) //attributes to load
{
SizeLimit = 25 //change this depending on how many you want to show
};
using (var results = ds.FindAll()) {
foreach (SearchResult result in results) {
users.Add($"{result.Properties["givenName"][0]} {result.Properties["sn"][0]}");
}
}
return users;
}
Вы можете передать любое частичное имя как filter
, и оно использует функцию в AD, называемую Разрешение неоднозначных имен , для поиска пользователей.Это будет искать частичные совпадения в имени, фамилии и других атрибутах (полный список в этой документации).
Я также ограничил результаты до 25, но вы можете изменить это по своему усмотрению.
Этот метод также указывает AD только возвращать атрибуты givenName
и sn
для каждого результата, так как это все, что нас волнует.Это уменьшит объем сетевого трафика между вашим приложением и контроллером домена.