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
может работать намного хуже в некоторых случаях.