2009-06-30 7 views
8

मैं सी # में एलडीएपी निर्देशिका से कनेक्ट कर रहा हूं, इसलिए मैंने DirectoryEntry क्लास का उपयोग किया है।कैसे पता चलेगा कि मेरी निर्देशिका एंटर्री वास्तव में मेरी एलडीएपी निर्देशिका से जुड़ी है या नहीं?

जब आप पता, लॉगिन और पासवर्ड के साथ "नई निर्देशिका एंटर्री" करते हैं तो इसे एलडीएपी निर्देशिका से कनेक्ट करना माना जाता है।

हालांकि, अगर कनेक्शन काम नहीं करता है, तो यह बिना किसी समस्या के लौटाता है, और Directoryentry चर सेट है।

तो क्या मुझे पता है कि मेरा कनेक्शन वास्तव में खोला गया है? अभी, मैं एक बहुत ही बदसूरत हैक का उपयोग कर रहा हूं: मैंने "अगर (mydirectory.SchemaEntry)" रखा है, जो कनेक्शन अपरिवर्तित नहीं किया गया है, तो अपवाद उत्पन्न करता है, क्योंकि DirectoryEntry के कुछ सदस्यों, जैसे SchemaEntry, aren कनेक्शन विफल होने पर सेट नहीं है। लेकिन 1: यह कुरूपता पैमाने पर 11/10 होना चाहिए 2: असफल होने से पहले बहुत समय लगता है।

तो ऐसा करने का अच्छा तरीका क्या है? निश्चित रूप से, माइक्रोसॉफ्ट ने कुछ भी प्रदान किया होगा (भले ही मैं एलडीएपी निर्देशिका का उपयोग कर रहा हूं और एक सक्रिय निर्देशिका नहीं) यह जानने के लिए कि क्या मैं वास्तव में जुड़ा हुआ हूं?

उत्तर

1

ठीक है तो marc_s के समाधान मैं लगभग क्या कर रहा था (सिवाय मैं SchemaEntry और नहीं NativeObject लिए देख रहा था) था। लेकिन टाइमआउट विलंब बहुत लंबा है (क्वेरी को फ़ॉर्म के लिए स्वत: पूर्णता मान भरने के लिए चलाया जाता है)। मुझे लगता है कि मैं वास्तव में कनेक्शन को नाटक करना पसंद करता हूं और क्वेरी को चलाने देता है। इस तरह, मैं अपना खुद का, छोटा, टाइमआउट देरी सेट कर सकता हूं।

11

डायरेक्टरीएन्ट्री को बस "नया" करना एलडीएपी स्टोर से कनेक्शन बनाता है।

केवल एक बार जब आप अपनी संपत्तियों का उपयोग शुरू करते हैं, या जब आप .NativeObject संपत्ति को स्पष्ट रूप से एक्सेस करते हैं, तो आपको वास्तव में एलडीएपी स्टोर से कनेक्शन मिल जाएगा।

यह सुनिश्चित करने के लिए कि आप कनेक्ट हैं, बस (DirectoryEntry).NativeObject को एक प्रयास में पढ़ें ... पकड़ो खंड - यदि यह बाहर निकलता है, तो आपको कोई समस्या है, अन्यथा आपका कनेक्शन अब ऊपर और सक्रिय है।

दुर्भाग्यवश, मेरे ज्ञान के लिए, कोई संपत्ति या विधि नहीं है जिसे आप यह पता लगाने के लिए कह सकते हैं कि आपने DirectoryEntry का उपयोग करके एलडीएपी से सफलतापूर्वक कनेक्ट किया है या नहीं।

मार्क

+0

+1 में मदद करता है का उपयोग कर इसे पकड़ कर सकते हैं। धन्यवाद। – Ksempac

+0

स्वच्छ स्पष्टीकरण – Roshe

2

आप DirectoryEntry.Properties.Count की जांच कर सकते हैं। यदि यह> 0 है, तो यह एक वैध वस्तु है। .Properties कभी शून्य नहीं है - यदि आप एक वैध DirectoryEntry से कनेक्ट नहीं हैं, तो भी आप गिनती को पढ़ने में सक्षम होंगे, और एक वैध डी में हमेशा कम से कम एक संपत्ति होगी।

कोई प्रयास/पकड़ या अपवाद आवश्यक नहीं है।

+0

दुर्भाग्य से सच नहीं है (2015 में .NET 4 के तहत परीक्षण किया गया); जो मेरे लिए शर्म की बात है, क्योंकि मैं अपवाद अपवाद की तलाश में हूं। जबकि DirectoryEntry.Properties स्वयं में गैर-शून्य है, यहां तक ​​कि इसकी गणना तक पहुंचने का प्रयास करने का भी मूल्यांकन मूल्यांकन होता है, और उस समय त्रुटि के साथ बाहर (उदाहरण के लिए "डिस्कनेक्ट होने पर सर्वर चालू नहीं होता है)। – JonBrave

1

आप DirectoryEntry.Properties.Count की जांच कर सकते हैं। यदि यह मान्य वस्तु के लिए> 0 है। लेकिन फिर भी कहें कि आपका एलडीएपी सर्वर नीचे है। आप अपने properties.Instead से किसी के साथ यह पहचान नहीं कर सकते आप कोशिश कैच ब्लॉक

try   
{  
    entry = new DirectoryEntry("priorityLDAPServer", sUserName, sPassword, AuthenticationTypes.None);  
    if(entry.Properties.Count > 0) 
    {    
     object o = entry.NativeObject;   
    ` next need to check user record in application database`  
    } 
}   
    catch (System.Runtime.InteropServices.COMException comex)  
{  

//throws you the error if LDAP server is down or wrong "Server is invalid "   
// you can further do a nested try catch within this block if you to try a  optional LDAP server.* 
}  

आशा यह आप परिशुद्धता के लिए

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