Как получить список имени пользователя AD по имени или фамилии (из одного текстового поля ввода)

Сценарий: пользователь вводит имя (которое может быть либо именем, либо фамилией) в текстовое поле и нажимает кнопку поиска. Система должна вернуть все имена пользователей (вместе с полным именем) везде, где имя или фамилия совпадают с существующими пользователями AD.

Проблема: вводимый текст не сверяется одновременно с именем и фамилией.

    List<string> GetUserDetails()
    {
        List<string> allUsers = new List<string>();
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "myDomain",
                                                    "OU=ounit,dc=myDC,dc=com");

        UserPrincipal qbeUser = new UserPrincipal(ctx);

        qbeUser.GivenName = _UITxtUserName.Text;
        qbeUser.Surname = _UITxtUserName.Text;

        PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
            foreach (var found in srch.FindAll())
            {

                allUsers.Add(found.DisplayName +"(" + found.SamAccountName+")");
            }

            allUsers.Sort();

        return allUsers;

    }

Я вижу, что проблема связана с _UITxtUserName (текстовое поле). Но не уверен, как это можно исправить. Использование .Net 3.5.


person shaz    schedule 14.10.2013    source источник
comment
Вы не можете сделать это таким образом — прямо сейчас ваш код проверяет пользователя с идентичными именем и фамилией, которые совпадают с тем, что ввел ваш пользователь. Крайне маловероятно, что вы когда-нибудь Пользователь. Вам нужно сначала найти совпадение по имени, а во втором поиске найти совпадение по фамилии, а затем соединить два полученных списка.   -  person marc_s    schedule 14.10.2013
comment
Как сказал @marc_s, выполните поиск 2 раза, передав разные критерии фильтра в PrincipalSearcher. Обязательно очистите фильтр перед вызовом второго поиска, установив для объекта qbeUser значение null.   -  person Rajesh    schedule 14.10.2013


Ответы (1)


Рабочий код

List<string> GetUserDetails()
    {
        List<string> allUsers = new List<string>();
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "myDomain",
                                                "OU=ounit,dc=myDC,dc=com");

        UserPrincipal qbeUser = new UserPrincipal(ctx);

        qbeUser.GivenName = _UITxtUserName.Text;

        PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
        foreach (var found in srch.FindAll())
        {

            allUsers.Add(found.DisplayName + "(" + found.SamAccountName + ")");
        }
        qbeUser = null; 
        qbeUser = new UserPrincipal(ctx);

        qbeUser.Surname = _UITxtUserName.Text;

        PrincipalSearcher srch1 = new PrincipalSearcher(qbeUser);
        foreach (var found in srch1.FindAll())
        {

            allUsers.Add(found.DisplayName + "(" + found.SamAccountName + ")");
        }

        allUsers.Sort();

        return allUsers;
    }
person shaz    schedule 14.10.2013