8

से केवल सक्षम खाते प्राप्त करें मैं "डोमेन उपयोगकर्ता" समूह में सभी उपयोगकर्ताओं को प्राप्त करने के लिए सक्रिय निर्देशिका से निपटने के लिए System.DirectoryServices.AccountManagement.dll का उपयोग कर रहा हूं।सक्रिय निर्देशिका

यह डोमेन में सभी उपयोगकर्ताओं को वापस कर रहा है लेकिन मुझे केवल सक्षम लोगों को प्राप्त करने की आवश्यकता है।

यहां कुछ नमूना कोड है:

List<string> users = new List<string>(); 

PrincipalContext pcContext = GetPrincipalContext(); 

GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcContext, 
           IdentityType.Name, 
           "Domain Users"); 

foreach (Principal user in grp.GetMembers(true).OfType<UserPrincipal>()) 
{ 
    if (user.Enabled != false) 
    { 
     users.Add(user.Name); 
    } 
} 

अन्य समूहों अच्छा काम है, लेकिन जब समूह है "डोमेन उपयोगकर्ता", Enabled संपत्ति के मूल्य सभी उपयोगकर्ताओं के लिए false है। इससे प्रत्येक उपयोगकर्ता के लिए और पूछताछ किए बिना सक्षम और अक्षम उपयोगकर्ताओं के बीच अंतर करना असंभव हो जाता है।

+0

क्या आपको केवल खाता नाम चाहिए? क्या खाता प्रबंधन नामस्थान का उपयोग करने की आवश्यकता है? क्या आप नाम स्टोर करने के अलावा उपयोगकर्ता प्रिंसिपल ऑब्जेक्ट के साथ कुछ भी करते हैं? मैं केवल इसलिए पूछता हूं क्योंकि आपकी आवश्यकताओं को डायरेक्टरी सर्विसेज नेमस्पेस और डायरेक्टरीशियर का उपयोग एलडीएपी फ़िल्टर के साथ बेहतर तरीके से किया जा सकता है जैसे: (& (objectclass = user) (memberOf = CN = डोमेन उपयोगकर्ता, डीसी = कंपनी, डीसी = कॉम) (! (userAccountControl: 1.2.840.113556.1.4.803: = 2))) जो सक्षम हैं कि उस समूह के सभी उपयोगकर्ताओं को वापस कर देगा। – randcd

+1

randcd: मैं एएम नेमस्पेस का उपयोग करना पसंद करूंगा क्योंकि यह एक बहुत ही साफ एपीआई प्रदान करता है। मैं निश्चित रूप से एलडीएपी का उपयोग कर सकता हूं, लेकिन फिर सबकुछ अधिक जटिल हो जाता है (विशेष रूप से ऐसे मामले में जहां उपयोगकर्ता केवल डोमेन उपयोगकर्ताओं का सदस्य हैं क्योंकि यह उनका प्राथमिक समूह है, क्योंकि यह उस मामले में 'सदस्य ओएफ' में सूचीबद्ध नहीं है)। – RobSiklos

+0

फॉरएच लूप में "प्रिंसिपल" वास्तव में "उपयोगकर्ता प्रिंसिपल" होना चाहिए - "सक्षम" प्रिंसिपल ऑब्जेक्ट पर उपलब्ध एक विधि या संपत्ति नहीं है। कम से कम .NET 4.6.1 में नहीं। यह सब सिस्टम के साथ किया जा सकता है। निर्देशिका सेवा। खाता प्रबंधन नामस्थान। – DtechNet

उत्तर

1

उपयोगकर्ताप्रणाली वस्तुओं के लिए एक बूल सक्षम संपत्ति है।

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.userprincipal_properties.aspx

// Add this to GetUserDetails 
objUserDetails.EmployeeId = UserPrinical.EmployeeId; 


// Then condition the add to only add enabled 
if (objUserDetails.Enabled) { 
    objUserDetails.Add(GetUserDetails(p.Name)); 
} 
+0

यह समस्या का समाधान नहीं करता है, क्योंकि 'सक्षम' संपत्ति ठीक से पॉप्युलेट नहीं लगती है जब समूह पूछताछ की जाती है "डोमेन उपयोगकर्ता" – RobSiklos

0

वहाँ MSDN page of the Enabled property पर एक टिप्पणी करते हुए कहा है: प्रिंसिपल की दुकान में कायम नहीं किया गया है

हैं, तो इस संपत्ति अशक्त देता है। प्रिंसिपल जारी रखने के बाद, डिफ़ॉल्ट सक्षम सेटिंग स्टोर पर निर्भर करती है। एडी डीएस और एडी एलडीएस स्टोर्स नए प्रिंसिपल को निष्क्रिय करते समय अक्षम करते हैं, जबकि एसएएम नए प्रिंसिपल को तब तक सक्षम बनाता है जब वे बने रहते हैं। एप्लिकेशन स्टोर में बने रहने के बाद ही इस संपत्ति को मूल्य पर सेट कर सकता है।

शायद डिफ़ॉल्ट से जुड़ा हुआ है तो यह संबंधित है?

इसके अलावा, एमएसडीएन मंच पर UserPrincipal.Enabled returns False for accounts that are in fact enabled? पर एक पोस्ट है और यह वास्तव में आपके मुद्दे के समान लगता है। पद के अनुसार यहां शायद एक समाधान है:

मुझे लगता है कि मुझे गलत समझा जाता है। मैंने जो पोस्ट किया था उसे अनदेखा करें। मुझे लगता है कि मैं जानता हूं कि क्या हो रहा है। GetMembers विधि स्पष्ट रूप से उपयोगकर्ता प्रिंसिपल डेटा लोड नहीं कर रहा है।

foreach (UserPrincipal user in group.GetMembers(false)) 
{ 
    UserPrincipal tempUser = UserPrincipal.FindByIdentity(context, user.SamAccountName); 
    // use tempUser.Enabled 
    // other code here 
} 
+0

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

1

इस समस्या को हल एक विधि PrincipalSearcher का उपयोग कर सक्रिय उपयोगकर्ता के लिए पहले खोज करने के लिए हो सकता है: अगर वहाँ (अपने विज्ञापन पर कम से कम) एक बेहतर समाधान, लेकिन निम्न काम करता है मैं नहीं जानता कक्षा और फिर प्रधानाचार्य की विधि IsMemberOf()

List<string> users = List<string>(); 
PrincipalContext pcContext = GetPrincipalContext(); 
GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcContext, IdentityType.Name, "Domain Users"); 
UserPrincipal searchFilter = new UserPrincipal(pcContext){ Enabled = true } 
PrincipalSearcher searcher = new PrincipalSearcher(searchFilter); 
PrincipalSearchResult<Principal> results = searcher.FindAll(); 
foreach (Principal user in results) 
    if (user.IsMemberOf(grp)) 
     users.Add(user.SamAccountName); 
संबंधित मुद्दे