Комплексная фильтрация поиска с 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.

Другие вопросы по тегам