Комплексная фильтрация поиска с PrincipalSearcher
Я ищу в Active Directory конкретные SamAccountName
значения с использованием PrincipalSearcher
объект, потому что я хочу вернуть UserPrincipal
"S. Мне было интересно, как я могу применить два фильтра для этого поиска; одна из них является началом имени учетной записи, начинается с xx, а другая - не заканчивается _c.
В настоящее время я могу искать все результаты, начиная с хх, используя xx*
но я не могу понять, как добавить другой поисковый термин или даже применить поисковый термин для не равно. Это то, с чем я сейчас работаю.
protected override void RunTests()
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "NAME", "OU=OUName",OU=name,DC=name,DC=net"))
{
UserPrincipal searchTemplate = new UserPrincipal(context);
searchTemplate.Enabled = true;
searchTemplate.SamAccountName = "xx*";
PrincipalSearcher search = new PrincipalSearcher(searchTemplate);
var principals = search.FindAll();
int total = principals.Count();
int numInvalidUsers = RunChecks(principals, new Check[]{
Check1
, Check2
, Check3
});
Score = numInvalidUsers == 0 ? 1 : 0;
}
}
Я думаю, что мне нужно добавить еще один параметр в searchTemplate.SamAccountName
Я просто не знаю как.
Обновление: я разговаривал с кем-то из Reddit, который давал мне полезные советы, но этот пользователь погас. Кажется, что наиболее распространенным предложением является как-то реализовать фильтры LDAP. Так что если кто-то знает, как реализовать их, возвращая при этом основные объекты, это было бы очень полезно.
1 ответ
Итак, я наконец-то ответил на этот вопрос с помощью пользователя Reddit из этого поста.
Из-за того, что у меня в идеале есть настройки моей программы, мне нужно было возвращать главные объекты, хотя было доступно некоторое приведение или преобразование. Решением для возврата объектов принципалов с некоторой дополнительной фильтрацией было использование оператора LINQ для еще большей фильтрации возвращаемых результатов.
Чтобы включить оператор LINQ, все, что мне нужно было сделать, это изменить одну строку, строку, где я search.FindAll();
что делает следующим образом,
var principals = search.FindAll().Where(p => !p.SamAccountName.EndsWith("_c", StringComparison.OrdinalIgnoreCase)).ToList();
Поскольку первоначальная фильтрация выполняется, чтобы найти все xx*, мне нужно было удалить только те учетные записи, которые заканчиваются на _c этим оператором, однако в LINQ доступно множество вариантов фильтрации.
Пользователь Reddit также предложил мне несколько других советов, поскольку LINQ может быть медленным, если вам нужно отфильтровать большое количество возвращаемых результатов, но я пошел быстрее и проще. Если вы хотите увидеть эти предложения, просто перейдите по ссылке на сообщение Reddit.