2016-09-20 7 views
0

Я ищу в Active Directory значения SamAccountName с использованием объекта PrincipalSearcher, потому что хочу вернуть UserPrincipal. Мне было интересно, как я могу применить два фильтра к этому поиску; один из которых начинается с имени учетной записи, начинается с xx, а другой - с _c.Комплексная поисковая фильтрация с PrincipalSearcher

В настоящее время я могу найти все результаты, начинающиеся с xx, с помощью 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, я просто не знаю, как.

Update: Я разговаривал с кем-то на Reddit который дает мне некоторые полезные предложения, но этот пользователь потемнели. Похоже, наиболее распространенное предложение - каким-то образом реализовать фильтры LDAP. Поэтому, если кто-то знает, как реализовать те, которые все еще возвращают основные объекты, которые будут очень полезны.

ответ

0

Так что я, наконец, ответ на этот вопрос с помощью пользователя Reddit from this post

Из-за того, как у меня есть программа установки в идеале я должен был вернуть основные объекты, хотя некоторые литья или преобразования было. Решение для возврата объектов принципалов с некоторой дополнительной фильтрацией использовало оператор LINQ для фильтрации возвращаемых результатов еще больше.

Чтобы включить заявление LINQ все, что мне нужно сделать, это изменить одну строку, строку, в которой я search.FindAll();, который делает следующее,

var principals = search.FindAll().Where(p => !p.SamAccountName.EndsWith("_c", StringComparison.OrdinalIgnoreCase)).ToList(); 

Поскольку первоначальная фильтрация делается, чтобы найти все ое * Я нужен только для удаления учетных записей, заканчивающихся на _c, с этим оператором, однако в LINQ имеется множество параметров фильтрации.

Пользователь Reddit также предложил мне несколько других предложений, поскольку LINQ может быть медленным, если у вас есть большое количество возвращенных результатов, которые нужно отфильтровать, но я пошел на более быстрый и легкий ответ. Если вы хотите увидеть эти предложения, просто следуйте ссылке на пост Reddit.