Я пытаюсь сделать запрос 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
При использовании одного из двух элементов управления запросом сортировки, которые закомментированные вместо этого, то он работает, но с английским порядком сортировки.
Нужно ли установить ProtocolVersion в 3 для поддержки сортировки по версии 3? – david
Что такое команда LDAP, которую вы производите для поиска, можете ли вы привести пример для справки? Из исключения или трассировки, похоже, ваша проблема до того, как вы достигнете сервера LDAP. –