PrincipalSearcher фильтрует все записи, которые не совпадают

Есть ли способ выполнить поиск всех записей, которые НЕ совпадают, используя PrincipalSearcher. Используя DirectorySearcher, вы можете применить фильтр, например (!sn="\*Jay\*"). Другими словами, все записи, где фамилия НЕ содержит последовательность «Джей» где-либо в ней. Мне было интересно, можно ли это сделать с параметрами UserPrincipal.


person Jay Coffman    schedule 20.11.2012    source источник


Ответы (2)


К сожалению, это не вариант. Я потратил много времени, пытаясь найти способ легко/эффективно выполнять более сложные поиски. Ближе всего к расширенному поиску можно подобрать некоторые параметры даты, но ничего для текстового поиска.

В итоге я запустил DirectorySearcher отдельно, используя запрос LDAP. Единственный атрибут, который я возвращаю из поиска (чтобы свести к минимуму размер набора результатов и повысить скорость), — это DN и тип объекта (если тип объекта еще не отфильтрован). Затем я создаю новый объект Principal соответствующего типа, используя DN, и добавляю его в коллекцию.

Вся библиотека AccountManagement была разработана с учетом удивительно небольшого набора задач (очевидно), и ее очень трудно расширить. Я в значительной степени вернулся к использованию DirectoryServices для большинства задач, поскольку это настоящая библиотека, которую следует использовать.

person Peter    schedule 13.01.2013

Кажется, я всегда отвечаю на старые вопросы, но этот продолжал появляться в поиске, и я думаю, что понял это. На случай, если это поможет кому-то, кто его найдет, вот что мне удалось собрать воедино.

Что вы хотите сделать, так это создать пользовательский AdvancedFilter и создать некоторые настраиваемые правила поиска для ваших нужд. Наборы по умолчанию довольно ограничены, но вы можете создать практически все, что вам нужно.

Пример для вашего вопроса может быть обработан следующим образом

public class MyAdvancedFilter : AdvancedFilters
{
    public MyAdvancedFilter(Principal principal) : base(principal)
    {

    }

    public void WhereLastName(string lastName, MatchType match)
    {
        // The * is the normal wildcard for LDAP.
        // Remove *'s for an exact match, or create a parameter to choose what to do.
        this.AdvancedFilterSet("sn", "*" + lastName + "*", typeof(string), match);
    }
}

Чтобы использовать это, у вас также должен быть пользовательский объект UserPrincipal, реализующий это.

[DirectoryObjectClass("user")]
[DirectoryRdnPrefix("CN")]
public class MyUser : UserPrincipal
{
    public MyUser(PrincipalContext context) : base(context)
    {

    }

    private MyAdvancedFilter searchFilter;
    // use custom search filters
    public new MyAdvancedFilter AdvancedSearchFilter
    {
        get
        {
            if (searchFilter == null)
                searchFilter = new MyAdvancedFilter(this);

            return searchFilter;
        }
    }
}

Теперь вы готовы использовать этот код.

MyUser u = new MyUser();
// find users without the last name containing "Jay"
u.AdvancedSearchFilter.WhereLastName("Jay", MatchType.NotEquals);

PrincipalSearcher ps = new PrincipalSearcher(u);
var res = ps.FindAll().Cast<MyUser>();

foreach (MyUser p in res)
{
    // use the results here.
}

Надеюсь, это поможет кому-то.

person Kirk    schedule 08.06.2015