मैं सक्रिय निर्देशिका से उपयोगकर्ताओं की सूची कैसे प्राप्त कर सकता हूं?


109

मैं सक्रिय निर्देशिका से उपयोगकर्ताओं की सूची कैसे प्राप्त कर सकता हूं? क्या उपयोगकर्ता नाम, firstname, lastname खींचने का कोई तरीका है? मैंने एक ऐसी ही पोस्ट देखी जहाँ इसका इस्तेमाल किया गया था:

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

मैंने सक्रिय निर्देशिका के साथ कभी कुछ नहीं किया है इसलिए मैं पूरी तरह से खो गया हूं। किसी भी तरह की सहायता का स्वागत किया जाएगा!


3
.NET फ्रेमवर्क 3.5 के साथ AD का उपयोग करने के लिए एक महान परिचय के लिए .NET फ्रेमवर्क 3.5 में उत्कृष्ट MSDN लेख प्रबंध निर्देशिका सुरक्षा प्रिंसिपलों को पढ़ें
marc_s

ऐसा लगता है कि @ marc_s के लेख को संग्रहीत किया गया है, यहां एक अद्यतन लिंक है
jb।

@marc_s मुझे पढ़ना अच्छा लगेगा सर, लेकिन लिंक एक मृत है। मैं इस कोशिश की blogs.msdn.microsoft.com/msdnmagazine/2008/01/16/... माइक्रोसॉफ्ट पत्रिका के लिए एक आनुवंशिक पृष्ठ पर लेकिन उस लेख सुराग पर भी लिंक
मैल्कम साल्वाडोर

1
@ मल्की.क्या मुझे लेख के लिए अपना रास्ता मिल गया। इस प्रश्न के लिए पहली टिप्पणी के लिंक का उपयोग करें और जनवरी 2008 के अंक को डाउनलोड करें । पढ़ने से पहले एक्सप्लोरर गुण पृष्ठ में chm-file को अनब्लॉक करना न भूलें।
OneWorld

जवाबों:


229

यदि आप सक्रिय निर्देशिका में नए हैं, तो मेरा सुझाव है कि आपको यह समझना चाहिए कि कैसे सक्रिय निर्देशिका पहले डेटा संग्रहीत करती है।

सक्रिय निर्देशिका वास्तव में एक LDAP सर्वर है। LDAP सर्वर में संग्रहीत वस्तुएँ पदानुक्रम में संग्रहीत की जाती हैं। यह बहुत समान है कि आप अपनी फाइल को अपने फाइल सिस्टम में स्टोर करें। इसलिए इसे डायरेक्टरी सर्वर और एक्टिव डायरेक्टरी का नाम मिला

सक्रिय निर्देशिका पर कंटेनरों और वस्तुओं को एक द्वारा निर्दिष्ट किया जा सकता है distinguished name। प्रतिष्ठित नाम इस प्रकार है CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com। एक पारंपरिक संबंधपरक डेटाबेस की तरह, आप LDAP सर्वर के खिलाफ क्वेरी चला सकते हैं। इसे LDAP क्वेरी कहा जाता है।

.NET में LDAP क्वेरी को चलाने के कई तरीके हैं। आप से या SearchRequest से DirectorySearcher का उपयोग कर सकते हैं ।System.DirectoryServicesSystem.DirectoryServices.Protocol

अपने प्रश्न के लिए, चूंकि आप विशेष रूप से उपयोगकर्ता प्रिंसिपल ऑब्जेक्ट को खोजने के लिए कह रहे हैं, मुझे लगता है कि सबसे सहज तरीका प्रिंसिपलसर्चर से उपयोग करना है System.DirectoryServices.AccountManagement। आप आसानी से Google से कई अलग-अलग उदाहरण पा सकते हैं। यहां एक नमूना है जो आप के लिए पूछ रहे हैं वही कर रहा है।

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

ध्यान दें कि AD उपयोगकर्ता ऑब्जेक्ट पर, कई विशेषताएँ हैं। विशेष रूप से, givenNameआपको देंगे First Nameऔर snआपको देंगे Last Name। उपयोगकर्ता नाम के बारे में। मुझे लगता है कि आप उपयोगकर्ता लॉगऑन नाम का मतलब है। ध्यान दें कि AD उपयोगकर्ता ऑब्जेक्ट पर दो लॉगऑन नाम हैं। एक है samAccountName, जिसे पूर्व-विंडोज 2000 उपयोगकर्ता लॉगऑन नाम के रूप में भी जाना जाता है। userPrincipalNameआमतौर पर विंडोज 2000 के बाद उपयोग किया जाता है।


2
क्या होगा यदि सर्वर में डोमेन नहीं है

AD समूह के उपयोगकर्ताओं को सूचीबद्ध करने के लिए आप समान कोड का उपयोग कैसे करते हैं?
n जोशी

क्या इस पद्धति का उपयोग करके खोज को केवल उसी निर्देशिका में सीमित करना है, जिसे ईमेल पता सौंपा गया है?
ARIDder101

कोई बात नहीं, मैंने इसका हल निकाल लिया। मुझे if (((UserPrincipal)result).EmailAddress != null)अपनी सूची में परिणाम जोड़ने से पहले बस जोड़ना था ।
ARIDder101

2
और क्या होगा यदि वर्तमान कंप्यूटर डोमेन से संबंधित नहीं है?
मार्कस

23

यदि आप y सक्रिय खातों को फ़िल्टर करना चाहते हैं तो इसे हार्वे के कोड में जोड़ें:

 UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;

पहले उपयोग के बाद। फिर जोड़िए

  searcher.QueryFilter = userPrin;

सभी को खोजने से पहले। और वह आपको सक्रिय होना चाहिए।


मुझे नहीं लगता है कि आपको searcher.QueryFilter = userPrin;पहले से ही उपयोगकर्ता प्रिंसिपल को प्रिंसिपल खोजकर्ता के पास भेजने की आवश्यकता है, लेकिन अन्यथा केवल सक्रिय उपयोगकर्ताओं को फ़िल्टर करने की टिप के लिए धन्यवाद!
एंड्री

1
हाँ, एंड्री सही है, इसलिए मूल रूप से इस संपत्ति को दूसरे का उपयोग करते हुए बयान में जोड़ा जा सकता है:using (var searcher = new PrincipalSearcher(new UserPrincipal(context){ Enabled = true }))
मार्को जोवानोव

लेकिन मुझे लगा कि अगर आपको Enabledपहले मान लेना है तो परीक्षण करना होगा :if (userPrincipal.Enabled.HasValue)
जॉन बीबीक्यू १18'१

4

निश्चित रूप से इसका श्रेय @Harvey Kwok को जाता है, लेकिन मैं सिर्फ इस उदाहरण को जोड़ना चाहता था क्योंकि मेरे मामले में मैं UserPrincipals की एक वास्तविक सूची प्राप्त करना चाहता था। इस क्वेरी को पहले से फ़िल्टर करना शायद अधिक कुशल है, लेकिन मेरे छोटे वातावरण में, सब कुछ खींचना और फिर बाद में मेरी सूची से आवश्यकतानुसार फ़िल्टर करना आसान है।

आपको जो चाहिए, उसके आधार पर, आपको DirectoryEntry को कास्ट करने की आवश्यकता नहीं हो सकती है, लेकिन कुछ गुण UserPrincipal से उपलब्ध नहीं हैं।

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}

'ई' क्या है?
फैंडैंगो 68

1
धन्यवाद, उस पर कभी गौर नहीं किया। मैंने इसे बदल दिया, "यू" माना जाता था। यदि संपत्ति गायब है, तो मैं भी शून्य मानों को संभालने के लिए जोड़ा गया।
जॉर्डन

1

System.DirectoryServices.dll को शामिल करें, फिर नीचे दिए गए कोड का उपयोग करें:

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="Users: ";

foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);

1
@ Fandango68: LOL, हाँ यह है !!! System.Windows.Forms.MessageBox.Show (ex.Message + ex.StackTrace);
झोलमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.