2009-11-23 6 views

उत्तर

79

दरअसल, सवाल था कि कैसे एक .NET 3.5 (System.DirectoryServices.AccountManagement.)UserPrincipal के लिए गुणों के दो पाने के लिए एक userPrincipalName नहीं दिया -object।

यहाँ एक extension method साथ कि कैसे करना है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.DirectoryServices; 
using System.DirectoryServices.AccountManagement; 

namespace MyExtensions 
{ 
    public static class AccountManagementExtensions 
    { 

     public static String GetProperty(this Principal principal, String property) 
     { 
      DirectoryEntry directoryEntry = principal.GetUnderlyingObject() as DirectoryEntry; 
      if (directoryEntry.Properties.Contains(property)) 
       return directoryEntry.Properties[property].Value.ToString(); 
      else 
       return String.Empty; 
     } 

     public static String GetCompany(this Principal principal) 
     { 
      return principal.GetProperty("company"); 
     } 

     public static String GetDepartment(this Principal principal) 
     { 
      return principal.GetProperty("department"); 
     } 

    } 
} 

ऊपर कोड ज्यादातर मामलों में काम करेंगे (है कि यह मानक पाठ के लिए काम करेगा/स्ट्रिंग एकल मूल्य सक्रिय निर्देशिका विशेषताएँ)। आपको कोड को संशोधित करने और अपने पर्यावरण के लिए अधिक त्रुटि हैंडलिंग कोड जोड़ने की आवश्यकता होगी।

आप द्वारा इसका इस्तेमाल अपनी परियोजना के लिए "विस्तार कक्षा" जोड़ने और फिर आप यह कर सकते हैं:

PrincipalContext domain = new PrincipalContext(ContextType.Domain); 
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(domain, "youruser"); 
Console.WriteLine(userPrincipal.GetCompany()); 
Console.WriteLine(userPrincipal.GetDepartment()); 
Console.WriteLine(userPrincipal.GetProperty("userAccountControl")); 

(BTW, यह एक्सटेंशन गुण के लिए एक महान प्रयोग हो गया होता - too bad it won't be in C# 4 either।)

+1

इसके अलावा आप प्रिंसिपल एक्सटेंशंस (http://msdn.microsoft.com/en-us/library/bb552835.aspx) पर विशिष्ट प्रिंसिपल बनाने के लिए कस्टम प्रिंसिपल बनाने के लिए देख सकते हैं। –

+0

आप "सेट" विधि और मूल्य को सहेजने के बारे में कैसे जाएंगे? – JustinStolle

+0

@PerNoalt कोड के लिए धन्यवाद लेकिन क्या कोई संपत्ति प्राप्त करने के लिए कोई छोटा रास्ता नहीं है उदाहरण के लिए: उपयोगकर्ता प्रिंसिपल से सीधे एक्सटेंशन का उपयोग किए बिना विभाग? – Rama

13

ऐसा कुछ ऐसा करना चाहिए यदि उपयोगकर्ता के लिए विभाग और कंपनी गुण मौजूद हैं।

DirectoryEntry de = new DirectoryEntry(); 
de.Path = "LDAP://dnsNameOfYourDC.my.company.com"; 
DirectorySearcher deSearch = new DirectorySearcher(de); 
deSearch.PropertiesToLoad.Add("department"); 
deSearch.PropertiesToLoad.Add("company"); 

deSearch.SearchScope = SearchScope.Subtree; 
deSearch.Filter = "(&(objectClass=User)(userPrincipalName=MyPrincipalName))"; 
SearchResultCollection results = deSearch.FindAll(): 

foreach (SearchResult result in results) 
{ 
    ResultPropertyCollection props = result.Properties; 
    foreach (string propName in props.PropertyNames) 
    { 
     //Loop properties and pick out company,department 
     string tmp = (string)props[propName][0]; 
    } 
} 
+2

एक छोटा नाइटपिक: एलडीएपी फ़िल्टर में, मैं ऑब्जेक्ट क्लास के बजाय "ऑब्जेक्ट श्रेणी" का उपयोग करना पसंद करूंगा। क्यूं कर? ऑब्जेक्ट श्रेणी एकल मूल्यवान है, और यह सक्रिय निर्देशिका में अनुक्रमित है, इस प्रकार खोजकर्ता ऑब्जेक्ट श्रेणी का उपयोग कर तेज़ी से है। –

+2

दरअसल, ऑब्जेक्ट क्लास-विशेषता डिफ़ॉल्ट रूप से अनुक्रमित होती है यदि आप Windows Server 2008 पर हैं। यह नहीं है कि आप Windows Server 2000 या 2003 पर हैं। –

+0

यह एक अच्छा समाधान है और धन्यवाद। मुझे नीचे दिए गए एक को सही के रूप में चिह्नित करना था, हालांकि मैं सिस्टम से निपट रहा हूं। डायरेक्टरी सर्विसेज। खाता प्रबंधन। उपयोगकर्ता प्रिंसिपल विशेष रूप से। – wgpubs

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