2017-02-20 13 views
11

Próbuję wykonać zapytanie LDAP dotyczące usług AD LDS, aby użytkownicy zostali posortowani według atrybutu cn. Reguła porządku sortowania nie powinna być domyślnym językiem angielskim, ale powinna być zgodna z językiem szwedzkim. Robię to z API System.DirectoryServices.Protocols w .Net.LDAP Sortowanie z nieudaną regułą zamówienia

Aby odtworzyć Mam zainstalowany usług AD LDS nasłuchuje na porcie 389, oraz zainstalowane klasy obiektu użytkownika.

Następujący kod jest używany (podstawa jest kopiowany z Performing a Simple Search). Reguła zamówienia została zaczerpnięta z 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); 
      } 
     } 
    } 
} 

To wyjście:

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 

W przypadku korzystania z jednego z dwóch kontroli żądanie sortowania, które są odkomentowanymi zamiast, to działa, ale z angielskim porządku sortowania.

+0

Czy musisz ustawić wartość ProtocolVersion na 3, aby obsługiwać sortowanie w wersji 3? – david

+0

Co to jest polecenie LDAP, które tworzysz dla wyszukiwania, czy możesz podać przykład odniesienia? Z wyjątku lub śledzenia wygląda na to, że problem występuje przed dotarciem do serwera LDAP. –

Odpowiedz

0

Tak, mam 2 główne przypuszczenia co do tego, jakie może być. Po pierwsze, (wygląda na to, że już to masz) spójrz na ten post.

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

chcieć spróbować część auth i zobacz czy to coś zmienia dla Ciebie.

Po drugie, OID, którego używasz do sortowania jest dla szwedzkiego (może być celowy), ale jest możliwe, że serwer nie może sortować po szwedzku bez szwedzkiego pakietu językowego (lub czegoś podobnego). Możesz wypróbować opcję "Angielski (Stany Zjednoczone)" (1.2.840.113556.1.4.1499) i sprawdzić, czy to daje inny wynik.

EDIT: Nieważne, myślę, że brakowało mi ostatnie zdanie Twojego posta :) Zakładam, że podłączenie do systemu Windows Server, aby uruchomić te kwerendy LDAP? Jeśli tak, domyślam się, że serwer nie ma zainstalowanego szwedzkiego pakietu językowego, ale nie mam doświadczenia z LDAP i językami obcymi, więc nie ma gwarancji, że to naprawi.