2017-02-20 49 views
11

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

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

Используется следующий код (база скопирована с Performing a Simple Search). Правило заказа взято с here.

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 

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

+0

Нужно ли установить ProtocolVersion в 3 для поддержки сортировки по версии 3? – david

+0

Что такое команда LDAP, которую вы производите для поиска, можете ли вы привести пример для справки? Из исключения или трассировки, похоже, ваша проблема до того, как вы достигнете сервера LDAP. –

ответ

0

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

How to resolve "The server does not support the control. The control is critical." Active Directory error

Может хотите попробовать часть аутентификации и посмотреть, если он изменяет что-нибудь для вас.

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

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