2011-08-30 6 views
13

किसी दिए गए एडी समूह में सभी सदस्यों/उपयोगकर्ताओं की सूची प्राप्त करने का सबसे तेज़ तरीका क्या है और यह निर्धारित करना है कि कोई उपयोगकर्ता सक्षम है या नहीं?सक्रिय निर्देशिका समूह के सदस्य प्राप्त करें और जांचें कि क्या वे सक्षम हैं या अक्षम हैं

हम संभावित रूप से 20K उपयोगकर्ताओं के बारे में बात कर रहे हैं, इसलिए मैं प्रत्येक व्यक्तिगत उपयोगकर्ता के लिए एडी को मारने से बचना चाहता हूं।

+0

मैं यह जोड़ना भूल गया कि मैं .NET 4 पर हूं (वैकल्पिक रूप से 3.5) –

उत्तर

30

यदि आप .NET 3.5 और ऊपर हैं, तो आपको System.DirectoryServices.AccountManagement (S.DS.AM) नामस्थान देखना चाहिए। इसके बारे में यहाँ सब पढ़ें:

मूल रूप से, आप एक डोमेन संदर्भ को परिभाषित करने और आसानी से ईस्वी में उपयोगकर्ताओं और/या समूहों पा सकते हैं:

// set up domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// find the group in question 
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere"); 

// if found.... 
if (group != null) 
{ 
    // iterate over members 
    foreach (Principal p in group.GetMembers()) 
    { 
     Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName); 

     // do whatever you need to do to those members 
     UserPrincipal theUser = p as UserPrincipal; 

     if(theUser != null) 
     { 
      if(theUser.IsAccountLockedOut()) 
      { 
       ... 
      } 
      else 
      { 
       ... 
      } 
     } 
    } 
} 

नया एसडीएस.एएम एडी में उपयोगकर्ताओं और समूहों के साथ खेलने के लिए वास्तव में आसान बनाता है!

+0

धन्यवाद, मैं इसे देख लूंगा। –

+2

इसका उपयोग करने वाले किसी को भी ध्यान दें: यह ट्रांजिटिव समूह सदस्यता के साथ काम नहीं करता है, यानी यदि समूह बी समूह ए का सदस्य है, और उपयोगकर्ता सी समूह बी का सदस्य है, तो उपयोगकर्ता सी परिणाम में दिखाई नहीं देगी। –

+0

डोमेन, उपयोगकर्ता नाम और pswd कहां निर्दिष्ट करें? – Shesha

1

कृपया आप निम्नलिखित कोड का प्रयास कर सकते हैं। यह एक एलडीएपी क्वेरी में और फिर से प्राप्त करने के लिए Search Filter Syntax का उपयोग करें। ब्याज यह है कि सर्वर पर क्वेरी की जाती है। मुझे यकीन नहीं है कि यह @marc_s समाधान से तेज़ है लेकिन यह मौजूद है, और यह ढांचे पर काम करता है .NET 2.0 (W2K3 SP2 शुरू करना)।

string sFromWhere = "LDAP://WM2008R2ENT:389/dc=dom,dc=fr"; 
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "dom\\jpb", "test.2011"); 

/* To find all the users member of groups "Grp1" : 
* Set the base to the groups container DN; for example root DN (dc=societe,dc=fr) 
* Set the scope to subtree 
* Use the following filter : 
* (member:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=X) 
* coupled with LDAP_MATCHING_RULE_BIT_AND on userAccountControl with ACCOUNTDISABLE 
*/ 
DirectorySearcher dsLookFor = new DirectorySearcher(deBase); 
dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=MonGrpSec,OU=MonOu,DC=dom,DC=fr)(userAccountControl:1.2.840.113556.1.4.803:=2))"; 
dsLookFor.SearchScope = SearchScope.Subtree; 
dsLookFor.PropertiesToLoad.Add("cn"); 

SearchResultCollection srcUsers = dsLookFor.FindAll(); 

/* Just to know if user is present in an other group 
*/ 
foreach (SearchResult srcUser in srcUsers) 
{ 
    Console.WriteLine("{0}", srcUser.Path); 
} 
संबंधित मुद्दे