2012-03-23 18 views
13

मैं उस उपयोगकर्ता के प्रदर्शन नाम का उपयोग कर सक्रिय निर्देशिका में उपयोगकर्ता के उपयोगकर्ता आईडी प्राप्त करने में सक्षम होना चाहता हूं। प्रदर्शन नाम एक डेटाबेस से प्राप्त होता है, और प्रदर्शन नाम प्राप्त करने के लिए निम्नलिखित कोड का उपयोग कर उस उपयोगकर्ता के सत्र के दौरान संग्रहीत किया गया है:सी # में एक प्रदर्शन नाम से सक्रिय निर्देशिका में उपयोगकर्ता नाम कैसे प्राप्त करें?

using System.DirectoryServices.AccountManagement; 

    private string GetDisplayName() 
    { 
     // set up domain context 
     PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

     // find currently logged in user 
     UserPrincipal user = UserPrincipal.Current; 

     return user.DisplayName; 
    } 

इस बार, मैं एक विधि नामित GetUserIdFromDisplayName() कि रिटर्न करना चाहते हैं सक्रिय निर्देशिका लॉगिन नाम। कोई विचार?

+1

मैंने इसे सत्यापित नहीं किया है, इसलिए मुझे 100% निश्चित नहीं है, लेकिन मुझे लगता है कि आप 'SamAccountName' संपत्ति चाहते हैं। – CodingGorilla

+0

क्या आपको लगता है, यह संभव है? मुझे संदेह है कि उपयोगकर्ता प्रदर्शन नाम अद्वितीय हैं। संभवतः मल्टीपे परिणाम का नेतृत्व करेंगे। –

+0

सच है। अब मैं नीचे दिए गए उत्तर का उपयोग करके GUID का उपयोग करने पर विचार करता हूं। –

उत्तर

28

मेरा मानना ​​है कि आप System.DirectoryServices.AccountManagement (S.DS.AM) नामस्थान की अंतर्निहित कार्यक्षमता का उपयोग करके डेविड के उत्तर के मुकाबले इसे और अधिक आसानी से कर सकते हैं। वास्तव में

using System.DirectoryServices.AccountManagement; 

private string GetUserIdFromDisplayName(string displayName) 
{ 
    // set up domain context 
    using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
    { 
     // find user by display name 
     UserPrincipal user = UserPrincipal.FindByIdentity(ctx, displayName); 

     // 
     if (user != null) 
     { 
      return user.SamAccountName; 
      // or maybe you need user.UserPrincipalName; 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 
} 

मैं अंतर्निहित DirectoryEntry वस्तु पर जाने के लिए किसी भी आवश्यकता नहीं दिख रहा है, - जब तक में से कोई भी:

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

पुनश्च: यदि प्रदर्शन नाम से खोज काम नहीं करना चाहिए (मैं अभी यह परीक्षण करने के लिए हाथ में एक ई नहीं है) - आप हमेशा भी PrincipalSearcher उपयोग कर सकते हैं अपने उपयोगकर्ता को खोजने के लिए:

using System.DirectoryServices.AccountManagement; 

private string GetUserIdFromDisplayName(string displayName) 
{ 
    // set up domain context 
    using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
    { 
     // define a "query-by-example" principal - here, we search for a UserPrincipal 
     // and with the display name passed in 
     UserPrincipal qbeUser = new UserPrincipal(ctx); 
     qbeUser.DisplayName = displayName; 

     // create your principal searcher passing in the QBE principal  
     PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

     // find match - if exists 
     UserPrincipal user = srch.FindOne() as UserPrincipal; 

     if (user != null) 
     { 
      return user.SamAccountName; 
      // or maybe you need user.UserPrincipalName; 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 
} 
+2

+1, आसान और तेज़, और – smirkingman

+0

पर DOMAIN \ USERID प्रविष्टियों को भी पाता है, मैं उपयोगकर्ताओं को उनके उपयोगकर्ता \ USERNAME द्वारा 'UserPrincipal.FindByIdentity (ctx, IdentityTypes.SamAccountName, उपयोगकर्ता नाम) 'के साथ ढूंढने में सक्षम था, इसलिए मुझे लगता है कि आप चाहते हैं कोड राज्यों की तरह 'उपयोगकर्ता। सैमएक्साउंटनाम 'वापस करें। – Pakman

7

UserPrincipal एक विधि GetUnderlyingObject() जो DirectoryEntry वापस आ जाएगी है।

प्राप्त करें DirectoryEntry प्रधानाचार्य की ओर से:

private DirectoryEntry GetDirectoryEntryFromUserPrincipal(Principal user) 
{ 
    return (DirectoryEntry)user.GetUnderlyingObject(); 
} 

प्राप्त डोमेन से DirectoryEntry और खाता नाम:

private DirectoryEntry GetDirectoryEntryFromDomainAndUsername(string domainName, string userName) 
{ 
    // Get the sid from the NT account name 
    var sid = (SecurityIdentifier) new NTAccount(domainName, accountName) 
        .Translate(typeof(SecurityIdentifier)); 

    // Get the directory entry for the LDAP service account 
    var serviceEntry = new DirectoryEntry("LDAP://{address}", "serviceUsername", "servicePassword"); 

    var mySearcher = new DirectorySearcher(serviceEntry) 
     { 
      Filter = string.Format("(&(ObjectSid={0}))", sid.Value) 
     }; 

    return mySearcher.FindOne().GetDirectoryEntry(); 
} 

एक बार जब आप DirectoryEntryGuid संपत्ति का उपयोग प्राप्त करने के लिए प्रवेश के Object-Guid

private Guid GetObjectGuidFromDirectoryEntry(DirectoryEntry entry) 
{ 
    // return the Guid this is the Object-Guid (ignore NativeGuid) 
    return entry.Guid; 
} 

किसी निर्देशिका खाते के विरुद्ध एप्लिकेशन में उपयोगकर्ता खाते को ट्रैक करने के लिए: हमेशा ऑब्जेक्ट-गुइड का उपयोग करें "यह मान सेट किया गया है जब ऑब्जेक्ट बनाया गया है और बदला नहीं जा सकता है।"
यदि उपयोगकर्ता डोमेन बदलता है या अधिक सामान्य रूप से अपना नाम बदलता है (शादी, कानूनी नाम-परिवर्तन इत्यादि) और उपयोगकर्ता को ट्रैक करने के लिए उपयोग नहीं किया जाना चाहिए, तो एनटी और एसएएम खाता नाम बदल सकते हैं।

NT खाता नाम प्राप्त करने के लिए (डोमेन \ उपयोगकर्ता नाम):

private string GetNTAccountNameFromDirectoryEntry(DirectoryEntry entry) 
{ 
    PropertyValueCollection propertyValueCollection = entry.Properties["objectsid"]; 

    SecurityIdentifier sid = new SecurityIdentifier((byte[]) propertyValueCollection[0], 0); 

    NTAccount ntAccount = (NTAccount)sid.Translate(typeof (NTAccount)); 

    return account.ToString(); 
} 

सैम-खाता-नाम (उपयोगकर्ता नाम @ डोमेन) प्राप्त करने के लिए:

private string GetSAMAccountFromDirectoryEntry(DirectoryEntry entry) 
{ 
    return entry.Properties["Name"].Value; 
} 

और यहाँ है सभी सक्रिय निर्देशिका विशेषताओं के exhaustive listProperties
से मान प्राप्त करते समय "Ldap-Display-Name" का उपयोग करें उदा। Properties["Ldap-Display-Name"]

Display-Name (फर्स्टनाम एमआई लास्टनाम) काम में आ सकता है।

+0

धन्यवाद! तो मुझे लगता है कि आपको ऐसा कुछ करने से एडी समूह से 'उपयोगकर्ता प्रिंसिपल' ऑब्जेक्ट्स प्राप्त करना होगा: http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/ecb16a63-6619-4c68-a77c-8bb2682fc1be –

+0

यह काम करेगा। मैंने देखा कि आप अपने प्रश्न में 'UserPrincipal.Current' का उपयोग कर रहे थे। यह काम करता है यदि वेब ऐप डोमेन में होस्ट किया गया है, "विंडोज सुरक्षा" का उपयोग करके, या उपयोगकर्ता सत्र में चलने वाला मूल ऐप है। यदि आप केवल एडी पूछ सकते हैं, तो सीधे एसएएम-खाता-नाम द्वारा फ़िल्टर करके निर्देशिका प्रविष्टि प्राप्त करें। – David

+0

GetDirectoryEntryFromDomainAndUsername जोड़ा गया। इसे थोड़ा बदलाव करने की आवश्यकता हो सकती है क्योंकि मैं ऐसे माहौल में नहीं हूं जहां मैं एडी सर्वर के खिलाफ यह सब जांच सकता हूं। – David

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

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