LDAP DirectorySearcher.sort пропущенные записи с ненулевыми значениями - PullRequest
2 голосов
/ 16 апреля 2011

При запросе к нашей AD мы получаем полный набор результатов по первоначальному запросу (samaccounttype=805306368).Если затем мы попытаемся отсортировать запрос по полю, значение которого может быть <not set>, например givenname, он вернет только записи с установленным значением и пропустит записи без значения.Мы попытались использовать приведенный ниже флаг присутствия для включения обоих наборов, но при сортировке все еще теряем не установленные значения:

(|(&(samaccounttype=805306368)(givenName=*))(&(samaccounttype=805306368)(!givenname=*)))

Не уверены, связано ли это с тем, как VirtualListView обрабатывает набор результатов или еслиесть другая проблема.Кто-нибудь сталкивался с этим раньше и какие-либо предложения о том, что мне не хватает?Вот фрагмент кода для сортировки ds.virtuallistview.

using (var ds = new DirectorySearcher(de))
            {
                ds.Filter = Filter;

                foreach (var p in Properties)
                {
                    ds.PropertiesToLoad.Add(p.LDAPName);
                }

                //get record count
                ds.PropertyNamesOnly = false;
                ds.Sort = new SortOption(this.Properties.PrimaryOrderBy.LDAPName, SortDirection.Ascending); //ldap must always return ascending so we can custom sort
                ds.VirtualListView = new DirectoryVirtualListView(0, 0, 0);
                foreach(SearchResult s in ds.FindAll()){ /*must enumerate the collection before calling approximate total*/ }
                Records = ds.VirtualListView.ApproximateTotal;
                results = ds.FindAll();
                //Records = results.Count;
            }

1 Ответ

0 голосов
/ 17 апреля 2011

Вот пример кода DirectorySearcher, который сортирует результат по givenName.

 static void Main(string[] args)
 {
   /* Connection to Active Directory
    */
   DirectoryEntry deBase = new DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr");

   /* Directory Search
    */
   DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
   dsLookFor.Filter = "(sn=users)";
   dsLookFor.SearchScope = SearchScope.Subtree;
   dsLookFor.PropertiesToLoad.Add("cn");
   dsLookFor.PropertiesToLoad.Add("givenName");
   dsLookFor.PropertiesToLoad.Add("telephoneNumber");

   dsLookFor.Sort = new SortOption("givenName", SortDirection.Descending);

   SearchResultCollection srcUsers = dsLookFor.FindAll();

   foreach (SearchResult sruser in srcUsers)
   {
     Console.WriteLine("{0}", sruser.Path);

     foreach (string property in sruser.Properties.PropertyNames)
     {
       Console.WriteLine("\t{0} : {1} ", property, sruser.Properties[property][0]);          
     }
   }
 }

В следующем результате вы можете видеть, что givenName не установлен для user1 users, но объектпоявляется в результате в конце списка.Я не использую VirtualListView.

LDAP://WM2008R2ENT:389/CN=user0 users,OU=MonOu,DC=dom,DC=fr
        givenname : user0
        telephonenumber : 88
        adspath : LDAP://WM2008R2ENT:389/CN=user0 users,OU=MonOu,DC=dom,DC=fr
        cn : user0 users
LDAP://WM2008R2ENT:389/CN=user2 users,OU=MonOu,DC=dom,DC=fr
        givenname : user2
        adspath : LDAP://WM2008R2ENT:389/CN=user2 users,OU=MonOu,DC=dom,DC=fr
        cn : user2 users
LDAP://WM2008R2ENT:389/CN=user1 users,OU=MonOu,DC=dom,DC=fr
        telephonenumber : 99
        adspath : LDAP://WM2008R2ENT:389/CN=user1 users,OU=MonOu,DC=dom,DC=fr
        cn : user1 users

Если добавить следующую строку:

dsLookFor.VirtualListView = new DirectoryVirtualListView (1, 0, 2);

Результат:

LDAP://WM2008R2ENT:389/CN=user0 users,OU=MonOu,DC=dom,DC=fr
        givenname : user0
        telephonenumber : 88
        adspath : LDAP://WM2008R2ENT:389/CN=user0 users,OU=MonOu,DC=dom,DC=fr
        cn : user0 users
LDAP://WM2008R2ENT:389/CN=user2 users,OU=MonOu,DC=dom,DC=fr
        givenname : user2
        telephonenumber : 55
        adspath : LDAP://WM2008R2ENT:389/CN=user2 users,OU=MonOu,DC=dom,DC=fr
        cn : user2 users

Результаты без указанного имени отсутствуют.

...