2010-08-15 12 views
5
रिटर्न

संभव डुप्लिकेट:
Can I get more than 1000 records from a DirectorySearcher in Asp.Net?सी # सक्रिय निर्देशिका सेवा findAll() केवल 1000 प्रविष्टियों

मैं विज्ञापनों का उपयोग कर निर्देशिका खोजकर्ता findAll() विधि मौजूदा लॉगिन के लिए तलाश कर रहा हूँ (के रूप में निम्नलिखित कोड)। ऐसा लगता है कि निष्कर्ष विधि केवल 1000 प्रविष्टियां लौटाती है हालांकि उससे अधिक प्रविष्टियां होती हैं। मैं प्रत्येक लॉगिन के सभी() कैसे ढूंढूं?

IList<string> adslist = new List<string>(); 
    using (DirectoryEntry de = new DirectoryEntry("LDAP://armlink.com", null, null, AuthenticationTypes.Secure)) 
    using (DirectorySearcher ds = new DirectorySearcher(de, "(objectclass=user)", new string[] { "samaccountname" })) 

     foreach (SearchResult sr in ds.FindAll()) 
     { 
      string[] e = sr.Path.Split(new string[] { "LDAP://", "OU=", ",", "DC=", ".com", "/CN=" }, StringSplitOptions.RemoveEmptyEntries); 
      ResultPropertyCollection pc = sr.Properties; 
      adslist.Add(e[0] + "/" + pc["samaccountname"][0].ToString()); 
      // Debug.WriteLine(adslist.Last()); 
     } 
+0

आपके पास कितने कुल प्रविष्टियां हैं? क्या यह 1001 से अधिक था? धन्यवाद –

+0

ठीक है, अगर यह आपको संतुष्ट करता है तो लगभग 12,000 .. (गंभीरता से) यदि आप चाहें तो मैं आपको एक बेहतर आंकड़ा दे सकता हूं .. – TonyP

उत्तर

10

यह सर्वर-साइड सीमा के कारण है। DirectorySearcher.SizeLimit प्रलेखन से:

ऑब्जेक्ट की अधिकतम संख्या है कि एक खोज में सर्वर रिटर्न। डिफ़ॉल्ट मान शून्य है, जिसका अर्थ है सर्वर-निर्धारित डिफ़ॉल्ट आकार 1000 प्रविष्टियों की सीमा का उपयोग करें।

और:

आप 1000 प्रविष्टियों में से सर्वर-निर्धारित डिफ़ॉल्ट से भी बड़ा है कि एक मूल्य के लिए SizeLimit सेट करते हैं, सर्वर-निर्धारित डिफ़ॉल्ट प्रयोग किया जाता है।

मूल रूप से इससे, ऐसा लगता है कि सर्वर-साइड डिफ़ॉल्ट को बदलने का कोई तरीका नहीं है, तो आप 1000 प्रविष्टियों तक सीमित होने जा रहे हैं। यह संभव है कि PageSize निर्दिष्ट करने से आपको एक समय में एक निश्चित संख्या मिल जाएगी, कुल 1000 से अधिक ... सुनिश्चित नहीं है।

वैसे, ऐसा लगता है कि आप भी SearchResultCollection के चारों ओर एक using निर्देश होना चाहिए:

using (SearchResultCollection results = ds.FindAll()) 
{ 
    foreach (SearchResult sr in results) 
    { 
     ... 
    } 
} 
+0

प्रत्येक संभव सीमा में क्वेरी को तोड़ने के लिए एक संभावित कामकाज हो सकता है। –

+0

@ स्टेवन: हां। यह इस बात पर निर्भर करता है कि विश्वसनीय तरीके से करना कितना आसान है। –

+0

जॉन: SearchResultCollection के आस-पास उपयोग करने के लिए कोड को संशोधित किया गया। धन्यवाद – TonyP

14

इस सीमा के आस-दो तरीके हैं - विवरण के लिए MSDN docs on DirectorySearcher:

  • आपको DirectorySearcher.SizeLimit संपत्ति को कुछ मूल्यों पर सेट करें - यह एक ही खोज में प्रविष्टियों की संख्या को वापस कर देगा; हालांकि, आप एक ही ऑपरेशन में सर्वर सीमा (डिफ़ॉल्ट: 1'000 प्रविष्टियों) से अधिक नहीं प्राप्त कर सकते हैं - हालांकि, सर्वर सीमा एक कॉन्फ़िगर करने योग्य विकल्प है - आप इसे उच्च सेट कर सकते हैं, और फिर अपनी निर्देशिका खोजकर्ता की आकार सीमा को उच्च सेट कर सकते हैं - लेकिन जितनी अधिक प्रविष्टियां आप एक बार में वापस लौटना चाहते हैं, उतनी देर तक आपका कॉल होगा!

  • कुछ मूल्यों के लिए DirectorySearcher.PageSize सेट करें, उदा। 250 या तो, "पेजेड खोज" करने के लिए, उदा। आपको एक ही ऑपरेशन में 250 प्रविष्टियां मिलती हैं, और यदि आप 251 वें प्रविष्टि में फिर से जाते हैं, तो निर्देशिका खोजकर्ता एक और 250 प्रविष्टियां प्राप्त करने के लिए (दूसरी, तीसरी, चौथी कॉल में) वापस चला जाता है।यह आमतौर पर बेहतर विकल्प के बाद से तुम वापस प्रविष्टियों की संख्या जल्दी है, लेकिन आप निश्चित रूप से पृष्ठांकित है आवश्यकतानुसार

स्थितियों में, जहां आप एक से अधिक उन 1000 प्रविष्टियों की जरूरत है संभाल करने के लिए पसंदीदा तरीका अधिक प्रविष्टियों के लिए खोज रख सकते खोजें - MSDN दस्तावेज़ देख सकेंगे:

के बाद सर्वर ऑब्जेक्ट PageSize संपत्ति द्वारा निर्दिष्ट की संख्या पाया गया है, यह खोज बंद करो और ग्राहक के लिए परिणाम देगा। जब ग्राहक अधिक डेटा का अनुरोध करता है, तो सर्वर खोज को फिर से चालू कर देगा जहां यह छोड़ा गया था।

+2

धन्यवाद .. सभी प्रविष्टियों को पुनर्प्राप्त करने के लिए पृष्ठ आकार को सेट करना .. – TonyP

+2

पृष्ठ आकार के रूप में 1001 सेट करना सभी 3000+ प्रविष्टियों को पुनः प्राप्त किया गया .. मेरे कोड में लूप नहीं है, केवल पृष्ठ का आकार .. और यह किया (और करता है) सभी प्रविष्टियों को पुनः प्राप्त करें ..! – TonyP

+0

@ टोनीपी, आप बहुत सही हैं। मैंने SizeLimit = 0 और PageSize = 10000 सेट किया है, तो मुझे 4187 उपयोगकर्ताओं के लिए सभी प्रविष्टियां मिलीं, अन्यथा PageSize = 0 और SizeLimit = 10000 के साथ, मुझे केवल 2000 मिल रहा था। यह बहुत अजीब है और यह लॉजिकल प्रतीत नहीं होता है। माइक्रोसॉफ्ट द्वारा ऐसा क्यों होता है या यह कुछ खराब एपीआई है? – Sunil

संबंधित मुद्दे