none
Zugriff auf LDAP "Das Größenlimit wurde überschritten." RRS feed

  • Frage

  • Hi,

    beim Zugriff auf LDAP-Server verwende ich das PageResultRequestControl. Ich erhalte bei manchen LDAP Servern eine Exception mit der Info "Das Größenlimit wurde überschritten.".

    Ich hatte gehofft, dass ich dieses Problem mit dem PageResultRequestControl umgehen kann.

    Wie kann ich bitte mit diesem Problem umgehen?

    Vielen Dank

    Christian

    Donnerstag, 11. November 2010 11:49

Antworten

Alle Antworten

  • Hallo Christian,

    Vergleiche Deine Implementation ggf. mit:

    [Introduction to System.DirectoryServices.Protocols (S.DS.P)]
    http://msdn.microsoft.com/en-us/library/bb332056.aspx

    Ist überhaupt Paging unterstützt in dem von Dir benutzten LDAP-Kontext?

    [iPlanet LDAP and C# PageResultRequestControl - Stack Overflow]
    http://stackoverflow.com/questions/1646518/iplanet-ldap-and-c-pageresultrequestcontrol

    Weitere Hintergründe und Möglichkeiten:

    [Avoid changing the MaxPageSize LDAP query policy | JefTek.com]
    http://jeftek.com/219/avoid-changing-the-maxpagesize-ldap-query-policy/

    Bei Windows 2000 ist beispielsweise die: "Maximal unterstützte Seitengröße für LDAP-Antworten" = 1.000 Datensätze.
    [SO WIRD'S GEMACHT: Anzeigen und Einrichten von LDAP-Richtlinien mit Ntdsutil.exe in Windows 2000]
    http://support.microsoft.com/kb/315071

    Der Fehlernummer ist hier IMHO: 0x04 (LDAP_SIZELIMIT_EXCEEDED)
    Englische Meldung gem. MSDN:  "Size limit has exceeded"
    [Appendix C: Kerberos and LDAP Error Messages]
    http://technet.microsoft.com/en-us/library/bb463166.aspx
     
    [Extemporaneous Mumblings]
    http://dunnry.com/blog/CategoryView,category,Protocols.aspx
    Hier die Meldung: "The size limit was exceeded"


    ciao Frank

    Sonntag, 14. November 2010 18:42
  • Hi Frank,

    vielen Dank für die Infos!

    Ich prüfe zuvor, ob der LDAP-Server das Paging-Control unterstützt. Bei dem LDAP-Server ist dies der Fall.

    Host: pksldap.tttc.de
    Port: 389
    BaseDN: ou=T-Systems PKS Test CA 1:PN,o=T-Systems Enterprise Services GmbH,c=DE
    Authentication: Anonym

    Meinen SearchRequest erstelle ich wie folgt:

    new SearchRequest("ou=T-Systems PKS Test CA 1:PN,o=T-Systems Enterprise Services GmbH,c=DE",
                    "(objectClass=*)", SearchScope.Subtree, new string[] { "*" });

    Meine Abfrage:

                var pageRequestCtrl = new PageResultRequestControl(10);

                a_request.Controls.Add(pageRequestCtrl);

                try
                {
                    while (true)
                    {
                        var searchResponse = a_connection.SendRequest(a_request) as SearchResponse;
    // <- Hier wird bereits die "DirectoryOperatoionException" (Das Größenlimit wurde überschritten) geworfen .

    Ich habe auch schon versucht beim Request die Eigenschaft SizeLimit zu reduzieren bis auf den Wert 1. Die Größe der Pages habe ich immer entsprechend angepasst. Das Verhalten ist unverändert.

    Bei einem weiteren Test habe ich auf das PagingControl verzichtet und die Abfrage direkt mittels connection.SendRequest(...) abgesetzt.

    Das SizeLimit vom Request habe ich hierzu auf 1 und den SearchScope auf OneLevel gesetzt. Das Verhalten ist unverändert.

    Das ich bei der Abfrage ohne PagingControl ebenfalls die Probleme habe, verwiert mich doch ein bischen.

    Hast Du evtl. noch eine Idee oder fällt Dir an meinem Code etwas auf?

    Viele Grüße

    Christian

    Montag, 15. November 2010 09:13
  • Hallo Christian315,

    Ich konnte nachvollziehen alles was Du sagst und bekomme die Fehlermeldung: „The size limit was exceeded“.

    Wenn ich aber string baseDN = "ou=TTC Test CA 12:PN,o=Deutsche Telekom AG,c=DE"; verwende (Public LDAP servers) bekomme ich 12 Einträge.

    Schau Dir mal folgende Links an. Vielleicht können sie Dir weiter helfen.

    LDAP Paged Search Technology Sample

    Paging in System.DirectoryServices.Protocols

    Asynchronous Stream Processing

    http://www.tttc.de/verzeichnisdienst/root/index.htm

    Paged Asynchronous LDAP Searches Revisited à es läuft Asynchron aber das mit den Cookies funktioniert nicht und das steht auch in dem oberen Link LDAP Paged Search Technology Sample am Ende „LDAP Paged Search Technology Sample Does Not Work …System.DirectoryServices.Protocols.PageResultResponseControl NEVER returns a cookie.“

    [Test Code vom obigem Link]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.DirectoryServices.Protocols;
    using System.ComponentModel;
    using System.Threading;
    
    namespace LDAP2
    {
      class Program
      {
        static ManualResetEvent _resetEvent = new ManualResetEvent(false);
    
        static void Main(string[] args)
        {
          //set these to your environment
          string servername = "pksldap.tttc.de:389";
          //string baseDN = "ou=T-Systems PKS Test CA 1:PN,o=T-Systems Enterprise Services GmbH,c=DE";
          string baseDN = "ou=TTC Test CA 12:PN,o=Deutsche Telekom AG,c=DE";
    
          using (LdapConnection connection = CreateConnection(servername))
          {
            AsyncSearcher searcher = new AsyncSearcher(connection);
    
            searcher.BeginPagedSearch(baseDN, "(objectClass=*)", new string[] { "*" }, 1000, f => //runs per page
              {
                foreach (var item in f.Entries)
                {
                  var entry = item as SearchResultEntry;
    
                  if (entry != null)
                  {
                    Console.WriteLine(entry.DistinguishedName);
                  }
                }
    
              },
              c => //runs on error or when done
              {
                if (c != null) Console.WriteLine(c.ToString());
                Console.WriteLine("Done");
                _resetEvent.Set();
              }
            );
    
            _resetEvent.WaitOne();
    
          }
    
          Console.WriteLine();
          Console.WriteLine("Finished.... Press Enter to Continue.");
          Console.ReadLine();
    
        }
        static LdapConnection CreateConnection(string server)
        {
          LdapConnection connect = new LdapConnection(
            new LdapDirectoryIdentifier(server),
            null,
            AuthType.Anonymous
            );
    
          connect.SessionOptions.ProtocolVersion = 3;
          connect.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
    
          connect.SessionOptions.Sealing = true;
          connect.SessionOptions.Signing = true;
    
          return connect;
        }
        public class AsyncSearcher
        {
          LdapConnection _connect;
    
          public AsyncSearcher(LdapConnection connection)
          {
            this._connect = connection;
            this._connect.AutoBind = true; //will bind on first search
          }
    
          public void BeginPagedSearch(
              string baseDN,
              string filter,
              string[] attribs,
              int pageSize,
              Action<SearchResponse> page,
              Action<Exception> completed
              )
          {
            if (page == null)
              throw new ArgumentNullException("page");
    
            AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(null);
    
            Action<Exception> done = e =>
            {
              if (completed != null) asyncOp.Post(delegate
              {
                completed(e);
              }, null);
            };
    
            SearchRequest request = new SearchRequest(
              baseDN,
              filter,
              System.DirectoryServices.Protocols.SearchScope.Subtree,
              attribs
              );
    
            PageResultRequestControl prc = new PageResultRequestControl(pageSize);
    
            //add the paging control
            request.Controls.Add(prc);
    
            AsyncCallback rc = null;
    
            rc = readResult =>
            {
              try
              {
                var response = (SearchResponse)_connect.EndSendRequest(readResult);
    
                //let current thread handle results
                asyncOp.Post(delegate
                {
                  page(response);
                }, null);
    
                var cookie = response.Controls
                  .Where(c => c is PageResultResponseControl)
                  .Select(s => ((PageResultResponseControl)s).Cookie)
                  .Single();
    
                if (cookie != null && cookie.Length != 0)
                {
                  prc.Cookie = cookie;
                  _connect.BeginSendRequest(
                    request,
                    PartialResultProcessing.NoPartialResultSupport,
                    rc,
                    null
                    );
                }
                else done(null); //signal complete
              }
              catch (Exception ex) { done(ex); }
            };
    
    
            //kick off async
            try
            {
              _connect.BeginSendRequest(
                request,
                PartialResultProcessing.NoPartialResultSupport,
                rc,
                null
                );
            }
            catch (Exception ex) { done(ex); }
          }
    
        }
      }
    }
    

     

    Grüße,

    Robert

    Donnerstag, 25. November 2010 18:09
    Moderator