यदि उपयोगकर्ता किसी समूह का सदस्य है तो परीक्षण करने के लिए LDAP क्वेरी कैसे लिखें?


129

मैं एक LDAP क्वेरी लिखना चाहता हूं जो यह परखती है कि कोई उपयोगकर्ता (sAMAccountName) किसी विशेष समूह का सदस्य है या नहीं। क्या ऐसा करना संभव है ताकि मुझे 0 या 1 परिणाम रिकॉर्ड मिल जाए?

मुझे लगता है कि मैं उपयोगकर्ता के लिए सभी समूहों को प्राप्त कर सकता हूं और प्रत्येक को एक मैच के लिए परीक्षण कर सकता हूं, लेकिन मैं सोच रहा था कि क्या मैं इसे एक एलडीएपी अभिव्यक्ति में पैक कर सकता हूं।

कोई विचार?

धन्यवाद


जवाबों:


177

आपको इस फ़िल्टर के साथ एक क्वेरी बनाने में सक्षम होना चाहिए:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))

और जब आप अपने LDAP सर्वर के खिलाफ दौड़ते हैं, यदि आपको परिणाम मिलता है, तो आपका उपयोगकर्ता "yourUserName" वास्तव में समूह का सदस्य है "CN = YourGroup, OU = उपयोगकर्ता, DC = YourDomain, DC = com

कोशिश करो और देखो अगर यह काम करता है!

यदि आप C # / VB.Net और System.DirectoryServices का उपयोग करते हैं, तो इस स्निपेट को चाल चलनी चाहिए:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");

DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;

srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";

SearchResultCollection res = srch.FindAll();

if(res == null || res.Count <= 0) {
    Console.WriteLine("This user is *NOT* member of that group");
} else {
    Console.WriteLine("This user is INDEED a member of that group");
}

सावधानी का शब्द: यह केवल तत्काल समूह सदस्यता के लिए परीक्षण करेगा, और यह आपके डोमेन में "प्राथमिक समूह" (आमतौर पर "cn = उपयोगकर्ता") कहा जाता है में सदस्यता के लिए परीक्षण नहीं करेगा। यह नेस्टेड सदस्यता को नहीं संभालता है, उदाहरण के लिए उपयोगकर्ता ए ग्रुप ए का सदस्य है जो ग्रुप बी का सदस्य है - यह तथ्य कि उपयोगकर्ता ए वास्तव में ग्रुप बी का सदस्य है और साथ ही यहां प्रतिबिंबित नहीं होता है।

न घुलनेवाली तलछट


1
कोशिश की, लेकिन फिर भी मेरे लिए काम नहीं कर रहा है। क्या यह 'OU = उपयोगकर्ता' या 'OU = समूह' का होना चाहिए?
पॉल

3
यह मेरी क्वेरी है: (& (objectClass = person) (sAMAccountName = USERID) (सदस्य) = 'CN = SPSADMins, OU = समूह, OU = MYTOWN, OU = जर्मनी, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) डीएन वास्तव में वह लंबा है। मैं मानता हूं कि यह काम करना चाहिए । मदद के लिए धन्यवाद!
पउल

3
किसके कहने पर मैंने मेम्बरफ के बाद सिंगल कोट्स निकाले और मुझे अब परिणाम मिला है! साभार
पॉल

2
अच्छा उत्तर। लेकिन यह बताया जाना चाहिए कि यह केवल LDAP सर्वरों में काम करेगा जो एक 'सदस्‍यता' विशेषता को बनाए रखेगा। अधिक सामान्य तकनीक समूह वस्तु को प्राप्त करना और उसके अनूठे परीक्षण, रोलऑक्युपेंट आदि की जांच करना है, जो उपयोगकर्ता के डीएन के लिए गुणधर्म पर निर्भर करता है कि समूह वस्तु का उपयोग क्या है।
Lorne

1
@Gunslinger LDAP गुण नाम और मान केस-संवेदी नहीं हैं, और न ही DN हैं, लेकिन AD के अपने नियम हैं ...
Lorne का Marquis

35

यदि आप OpenLDAP (यानी स्लैपड) का उपयोग कर रहे हैं, जो लिनक्स सर्वरों पर आम है, तो आपको सदस्य (ओवरऑल = एक्सएक्सएक्स) विशेषता का उपयोग करके फिल्टर के खिलाफ मैच करने में सक्षम होने के लिए सदस्य ओवरले को सक्षम करना होगा।

इसके अलावा, एक बार जब आप ओवरले को सक्षम करते हैं, तो यह मौजूदा समूहों के लिए सदस्य विशेषताओं को अपडेट नहीं करता है (आपको मौजूदा समूहों को हटाने और उन्हें फिर से जोड़ने की आवश्यकता होगी)। यदि आपने ओवरले को शुरू करने में सक्षम किया है, जब डेटाबेस खाली था, तो आपको ठीक होना चाहिए।


8
किसी पृष्ठ का लिंक जो यह बताता है कि कैसे मेम्बर ओवरले को सक्षम करना उपयोगी होगा, मुझे लगता है।
गोखानी साड़ी

5
ट्यूटोरियल जिसने मेरे लिए काम किया: schenkels.nl/2013/03// @ टेलफोर्ड ने, दोस्त ने कहा कि आपने पहले से मौजूद समूहों के बारे में इस नोटिस से मेरी जान बचाई। बहुत धन्यवाद!
atकासज़बचमैन '

21

मैं मार्क के उत्तर में एक और बात जोड़ूंगा: सदस्यऑफ विशेषता में वाइल्डकार्ड नहीं हो सकते हैं, इसलिए आप "मेंबर = सीएन = एसपीएस *" जैसा कुछ नहीं कह सकते हैं, और यह उम्मीद कर सकते हैं कि "एसपीएस" से शुरू होने वाले सभी समूहों को ढूंढें।


उस सूचना के लिए आपका धन्यवाद। मैं वह करने की कोशिश कर रहा हूं जो आप कहते हैं कि नहीं किया जा सकता है। मैं PHP के साथ कैसे कर सकता हूँ? क्या दूसरे तरीके से एक ही परिणाम होना संभव है? सभी समूहों को खोजने के लिए SPS से शुरू करें और फिर जो भी हो ... मैं हमेशा सब कुछ पकड़ सकता हूं और अपनी सरणी को लूप कर सकता हूं, फिर CN को जो मैं चाहता हूं उससे मेल खाता हूं, लेकिन यदि संभव हो तो मैं इसे सीधे खोजना पसंद करता हूं।
ओडेलीबाल्टा

15

आपको प्रश्न में उपयोगकर्ता के डीएन पर अपना क्वेरी बेस सेट करना होगा, फिर अपना फ़िल्टर उस समूह के डीएन पर सेट करें जिसे आप सोच रहे हैं कि वे किसके सदस्य हैं। यह देखने के लिए कि क्या jdoe कार्यालय समूह का सदस्य है तो आपकी क्वेरी कुछ इस तरह दिखाई देगी:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'

यदि आप उन सभी समूहों को देखना चाहते हैं, जिनका वह सदस्य है, तो अपनी खोज में केवल 'सदस्य' विशेषता का अनुरोध करें, जैसे:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.