2010-07-07 16 views
6

में उपयोगकर्ताओं की सूची मैं उपयोगकर्ताओं की एक सूची और सक्रिय निर्देशिका समूह के भीतर से कुछ गुणों की एक सूची प्राप्त करने का प्रयास कर रहा हूं।विशिष्ट सक्रिय निर्देशिका वितरण समूह

अपडेट:,

Dim adGroup As New DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com") 
    Dim adMembers As Object 
    Dim objUser As ActiveDirectoryUser 
    Dim objUserList As New List(Of ActiveDirectoryUser) 
    Dim directoryEntry As DirectoryEntry 

    adMembers = adGroup.Invoke("Members", Nothing) 

    For Each adMember As Object In CType(adMembers, IEnumerable) 
     directoryEntry = New DirectoryEntry(adMember) 
     objUser = New ActiveDirectoryUser 

     objUser.UserId = directoryEntry.Properties.Item("sAMAccountName").Value.ToString() 
     objUser.Contract = directoryEntry.Properties.Item("ou").Value.ToString() 
     objUser.LastName = directoryEntry.Properties.Item("sn").Value.ToString() 
     objUser.FirstName = directoryEntry.Properties.Item("givenName").Value.ToString() 
     objUser.Email = directoryEntry.Properties.Item("mail").Value.ToString() 

     objUserList.Add(objUser) 
    Next 

पहले टुकड़ा काम करता है, हालांकि यह काफी अप्रभावी लगता है:

यहां ऐसी दो विधियां मैं वर्तमान में कर रहे हैं। मेरी मेमोरी उपयोग चढ़ाई और चढ़ाई के रूप में चढ़ता है और मुझे this त्रुटि मिल रही थी, हालांकि ऐसा लगता है कि इसे ठीक किया जा सकता है। दूसरी विधि:

Dim results As SearchResultCollection 
    Dim directoryEntry2 As New DirectoryEntry("LDAP://DC=domain,DC=com") 
    Dim directorySearcher As New DirectorySearcher(directoryEntry2) 
    directorySearcher.PageSize = 1000 

    directorySearcher.Filter = "(&(objectCategory=person)" & _ 
          "(objectClass=user)" & _ 
          "(memberOf=CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com))" 


    directorySearcher.PropertiesToLoad.Add("ou") 
    directorySearcher.PropertiesToLoad.Add("sn") 
    directorySearcher.PropertiesToLoad.Add("givenName") 
    directorySearcher.PropertiesToLoad.Add("sAMAccountName") 
    directorySearcher.PropertiesToLoad.Add("mail") 

    results = directorySearcher.FindAll 

परिणाम गणना प्रत्येक आवेदन के निष्पादन से भिन्न होती है जो मुझे अजीब लगता है। मुझे यकीन नहीं है कि क्या यह उपयोगकर्ताओं को वापस पाने का एक विश्वसनीय तरीका है या यदि मुझे अपनी खोज पर कुछ संशोधित करने की आवश्यकता है?

उत्तर

14

आप, .NET 3.5 में अपग्रेड कर सकते हैं और भी बहुत कुछ नया का उपयोग System.DirectoryServices.AccountManagement नामस्थान में सुधार हुआ। उन नए वर्गों के लिए महान परिचय Managing Directory Security Principals in the .NET Framework 3.5 में पाया गया है।

इस के साथ, अपनी नौकरी तुच्छ हो जाता है:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"); 
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "MyGroup"); 
PrincipalSearchResult<Principal> members = group.GetMembers(); 

आप के लिए है कि काम करता है?

यदि आप .NET 3.5 का उपयोग नहीं कर सकते हैं, तो आपको समूह की member संपत्ति का निरीक्षण करना चाहिए। समूह के सदस्य पदानुक्रम में समूह के नीचे तर्कसंगत रूप से बच्चों के रूप में संग्रहीत नहीं हैं, इसलिए आप उन्हें DirectorySearcher का उपयोग करके नहीं ढूंढ सकते हैं।

DirectoryEntry group = new DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com"); 

foreach(object groupMemberDN in group.Properties["member"]) 
{ 
    // grab the group member's DN 
} 

इस स्निपेट और अधिक के लिए MSDN लाइब्रेरी में सक्रिय निर्देशिका (या Visual Basic .NET के लिए एक ही) के लिए Quick List of C# Code Examples देखें।

अद्यतन: जो एक memberOf संपत्ति बराबर करने के लिए है सभी उपयोगकर्ताओं के लिए खोज: अगर आप उपयोगकर्ताओं एक विशेष समूह से संबंधित (जब से तुम उनके गुणों या कुछ और अपडेट करना चाहते हैं) की जरूरत है, तो आप दृष्टिकोण रिवर्स सकता है समूह के डीएन:

DirectoryEntry root = new DirectoryEntry("LDAP://dc=domain,dc=com"); 
DirectorySearcher searcher = new DirectorySearcher(root); 

searcher.Filter = "(&(objectCategory=user)(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))"; 
// set other properties on the searcher 

foreach(object result in searcher.FindAll()) 
{ 
    // do whatever you need to do with the entry 
} 
+0

सदस्य संपत्तियों के माध्यम से लूपिंग ने मुझे करीब बंद कर दिया। मुझे अभी भी सदस्य ऑब्जेक्ट से संपत्तियों को खींचने की आवश्यकता होगी (पहला नाम, ई-मेल, आदि)। मुझे लगता है कि मुझे आपके उदाहरण में groupmemberDN को किसी विशिष्ट ऑब्जेक्ट प्रकार में डालना होगा ताकि मैं इससे गुण खींच सकूं? –

+0

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

+0

@ Ek0nomik: आप ** अपने सभी सदस्यों को खोजने के लिए समूह को गणना नहीं कर सकते हैं, क्योंकि एक समूह ** ** ** एडी में एक कंटेनर नहीं है जिसे आप समझा सकते हैं। इसमें अपने सदस्यों को बाल वस्तुओं के रूप में शामिल नहीं किया गया है। हालांकि आप एक निर्देशिका शाखा का आकलन कर सकते हैं और उन सभी उपयोगकर्ताओं को ढूंढ सकते हैं जो एक विशिष्ट समूह के सदस्य हैं। –

2

स्कोप अपनी खोज को व्यापक, जहाँ भी सदस्य हो सकते हैं:

Dim directoryEntry As New DirectoryEntry("LDAP://OU=All,DC=Domain,DC=com") 

फ़िल्टर समूह सदस्यता के आधार पर:

directorySearcher.Filter = "(&(objectCategory=person)" & _ 
          "(objectClass=user)" & _ 
          "(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))" 
+0

आप शायद directorySearcher.PageSize = 1000 स्थापित करने के लिए यदि आप गुंजाइश को चौड़ा कर रहे हैं की आवश्यकता होगी। – decompiled

+0

अभी भी कोई भाग्य नहीं है। मैंने जो कुछ दिया है, मैंने अपने विशिष्ट मूल्यों में गिरा दिया, लेकिन मुझे कोई परिणाम नहीं मिल रहा है। –

+0

@ Ek0nomik - मेरा मूल उत्तर एक टाइपो था। मुझे लगता है कि "सदस्य ओएफ" में कोई स्थान नहीं है। – Greg

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