Подтвердить что ты не робот

Сортировка LDAP с порядком упорядочения не выполняется

Я пытаюсь сделать ldap-запрос для AD LDS, чтобы отсортировать пользователей по атрибуту cn. Правило упорядочения сортировки не должно быть по умолчанию английским, но оно должно заказываться в соответствии со шведским языком. Я делаю это с помощью System.DirectoryServices.Protocols API в .Net.

Для воспроизведения я установил экземпляр AD LDS, прослушивающий порт 389, и установил класс пользовательских объектов.

Используется следующий код (база копируется из Выполнение простого поиска). Правило заказа было взято из здесь.

public class LdapSorter
{

    public void SearchUsersSorted()
    {
        string hostOrDomainName = "localhost";
        string targetOu = "cn=Test";

        // create a search filter to find all objects
        string ldapSearchFilter = "(objectClass=user)";

        // establish a connection to the directory
        LdapConnection connection = new LdapConnection(hostOrDomainName);
        connection.SessionOptions.ProtocolVersion = 3;

        Console.WriteLine("\r\nPerforming a simple search ...");

        try
        {
            SearchRequest searchRequest = new SearchRequest
                                            (targetOu,
                                              ldapSearchFilter,
                                              SearchScope.OneLevel,
                                              null);

            searchRequest.Controls.Add(new SortRequestControl("cn", "1.2.840.113556.1.4.1594", false));
            //searchRequest.Controls.Add(new SortRequestControl("cn", false));
            //searchRequest.Controls.Add(new SortRequestControl("cn", true));

            // cast the returned directory response as a SearchResponse object
            SearchResponse searchResponse =
                        (SearchResponse)connection.SendRequest(searchRequest);

            Console.WriteLine("\r\nSearch Response Entries:{0}",
                        searchResponse.Entries.Count);

            // enumerate the entries in the search response
            foreach (SearchResultEntry entry in searchResponse.Entries)
            {
                Console.WriteLine("{0}:{1}",
                    searchResponse.Entries.IndexOf(entry),
                    entry.DistinguishedName);
            }
        }
        catch (DirectoryOperationException e)
        {
            Console.WriteLine("\nUnexpected exception occured:\n\t{0}\n{1}",
                              e, e.Response.ErrorMessage);
            var control = e.Response.Controls.First(c => c is SortResponseControl) as SortResponseControl;
            if (control != null)
            {
                Console.WriteLine("\nControl result: " + control.Result);
            }
        }
    }
}

Это вывод:

Performing a simple search ...

Unexpected exception occured:
    System.DirectoryServices.Protocols.DirectoryOperationException: The server does not support the control. The control is critical.
   at System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32 messageId, LdapOperation operation, ResultAll resultType, TimeSpan requestTimeOut, Boolean exceptionOnTimeOut)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)
   at Sort.LdapSorter.SearchUsersSorted() in C:\Source\slask\DotNetSlask\Sort\LdapSorter.cs:line 41
00000057: LdapErr: DSID-0C090A3D, comment: Error processing control, data 0, v3839

Control result: InappropriateMatching

Если вы используете один из двух элементов управления запросом сортировки, то он работает, но с английским порядком сортировки.

4b9b3361

Ответ 1

Итак, у меня есть 2 основных догадки о том, что это может быть. Во-первых, (похоже, что у вас уже есть часть этого), посмотрите этот пост.

Как разрешить "Сервер не поддерживает элемент управления. Контроль имеет решающее значение." Ошибка Active Directory

Возможно, вы захотите попробовать часть auth и посмотреть, не изменит ли она что-либо для вас.

Во-вторых, OID, который вы используете для сортировки, относится к шведскому (может быть, преднамерен), но, возможно, сервер не может сортировать по-шведски без шведского языкового пакета (или что-то в этом роде). Вы можете попробовать вариант "Английский (США)" (1.2.840.113556.1.4.1499) и посмотреть, дает ли это другой результат.

EDIT: Nevermind, я думаю, я пропустил последнее предложение вашего сообщения:) Предполагаю, вы подключаетесь к Windows Server для запуска этих запросов LDAP? Если это так, я предполагаю, что на сервере не будет установлен пакет шведского языка, но у меня нет опыта работы с LDAP и иностранными языками, поэтому никаких гарантий, которые его исправят.