PrincipalSearcher не следует базовому фильтру DirectorySearcher

Я работал над небольшим количеством кода для поиска в Active Directory с использованием C# и System.DirectoryServices.AccountManagement Пространство имен.

Я столкнулся с проблемой PrincipalSearcher не может выполнить запрос ИЛИ, поэтому, если я хочу найти пользователей по их адресу электронной почты ИЛИ SamAccountName, это невозможно.

Чтобы обойти это, кажется, что PrincipalSearcher использования DirectorySearcher в фоновом режиме, так что вы можете получить доступ к DirectorySearcher и установите его так, как вы хотите (используя GetUnderlyingSearcher), хотя по какой-то причине DirectorySearcher фильтр, который я указал.

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "localhost");
UserPrincipal usrPrinc = new UserPrincipal(ctx);

PrincipalSearcher searchPrinc = new PrincipalSearcher { QueryFilter = usrPrinc };
DirectorySearcher searchdirectory = searchPrinc.GetUnderlyingSearcher() as DirectorySearcher;

searchdirectory.Filter = "(&(objectClass=user)(objectcategory=person)(|(name=*admin*)(samaccountname=*admin*)))";
searchdirectory.Sort.PropertyName = "name";
searchdirectory.SizeLimit = 10;

var results = searchPrinc.FindAll();

Выше приведено правильное количество результатов на основе SizeLimit (10) и сортирует его правильно по PropertyName, но он не будет использовать Filter вариант вообще.

Есть ли способ настроить PrincipalSearcher использовать фильтр ИЛИ (без запроса всех пользователей и фильтрации на стороне клиента) или заставить его правильно использовать Filter вариант?

У меня есть метод работы с использованием DirectoryEntry а также DirectorySearcher но искал простоту и методы, которые UserPrincipal обеспечивает.

1 ответ

Решение

Кажется, ты не можешь.

Я ищу исходный код реализации.NET Core, но я думаю, мы можем предположить, что реализация.NET 4.x похожа, если не совсем одинакова.

PrincipalSearcher.FindAll() звонки ADStoreCtx_Query.Query(), который вызывает внутренний метод с именем PushFilterToNativeSearcher(), который начинает возиться с фильтром, перезаписывая все, что вы могли бы положить туда.

Я немного искал альтернативу, но ничего хорошего. Вам лучше использовать DirectorySearcher непосредственно.

AccountManagement Пространство имен иногда делает вещи проще, но я продолжаю возвращаться к DirectoryServices по таким причинам Даже производительность - AccountManagement может работать намного хуже в некоторых случаях.

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