2011-07-20 16 views
5

मुझे निम्नलिखित प्रारूप में विशिष्ट स्थानीय समूह के सभी उपयोगकर्ताओं को सूचीबद्ध करने की आवश्यकता है: "डोमेन \ उपयोगकर्ता नाम"। मैं समूह के लिए समूह प्रिंसिपल ऑब्जेक्ट्स का संग्रह निकाल सकता हूं, लेकिन मुझे नहीं पता कि उपयोगकर्ताओं को आवश्यक प्रारूप में कैसे प्राप्त किया जाए। GroupPrincipal में संपत्ति डोमेन नहीं है।समूह प्रिंसिपल से डोमेन कैसे प्राप्त करें?

निम्न कोड डोमेन के बिना उपयोगकर्ताओं को आउटपुट करता है (उदा। "उपयोगकर्ता नाम")।

using (var context = new PrincipalContext(ContextType.Machine, null)) 
{ 
    using (var group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, @"My Local Group")) 
    { 
     if (group != null) 
     { 
      foreach (var p in group.GetMembers(false)) 
      { 
       Console.WriteLine(p.SamAccountName); 
      } 
     } 
    } 
} 

क्या मूल वस्तु से डोमेन नेटबीओस नाम प्राप्त करना संभव है? और यदि हां, तो इसे कैसे प्राप्त करें?

+0

क्या आपको वास्तव में इसे 'DOMAIN \ उपयोगकर्ता नाम' फ़ॉर्म में चाहिए? क्या आप 'उपयोगकर्ता @ डोमेन' भी स्वीकार कर सकते हैं? –

+0

@Damien_The_Unbeliever मुझे उसी फ़ॉर्म में उपयोगकर्ता नाम चाहिए क्योंकि इसे HttpContext.User.Identity.Name द्वारा समर्थित विंडोज प्रमाणीकरण (DOMAIN \ UserName) के साथ वापस किया गया है। – altso

+0

'पी' एक एसआईडी संपत्ति का खुलासा करता है, जो आपको सुरक्षा पहचानकर्ता देता है। इसी प्रकार, पहचान उपयोगकर्ता संपत्ति को उजागर करती है (यदि उपयुक्त रूप से WindowsIdentity ऑब्जेक्ट पर डाली जाती है), जो एक सुरक्षा पहचानकर्ता भी है। क्या आप उन पर आधारित तुलना नहीं कर सकते? –

उत्तर

9

आप प्रिंसिपल के संदर्भ से डोमेन विवरण प्राप्त कर सकते हैं। उदा .:

foreach (var p in group.GetMembers(false)) 

    { 
     Console.Write(p.SamAccountName); 
     if (p.ContextType == ContextType.Domain) 
     { 
      Console.Write(" ({0})", p.Context.Name); 
     } 

     Console.WriteLine(); 
    } 

तुम सिर्फ डोमेन पर किसी मशीन से "डोमेन \ उपयोगकर्ता" प्रारूप में उत्पादन खाते के नाम करना चाहते हैं, तो आप एक NTAccount को प्राचार्य के SecurityIdentifier अनुवाद कर सकते हैं। उदाहरण के लिए:

foreach (var p in group.GetMembers(false)) 
{ 
    Console.WriteLine(p.Sid.Translate(typeof(NTAccount)).ToString()); 
} 
+1

क्या आप इसके बारे में निश्चित हैं! नाम विशेषता पहली डीसी विशेषता के समान है, लेकिन क्या यह डोमेन के Netbios नाम हर समय है? याद रखें कि स्थापना के दौरान एक अलग डोमेन नेटबीओस नाम का चयन किया जा सकता है। यह ज्यादातर समय काम करना चाहिए, लेकिन यह सुनिश्चित नहीं है कि उत्तर – JPBlanc

+0

हाँ, प्रिंसिपल का संदर्भ मुझे एक अलग नाम देता है। मेरे मामले में यह 'location.company.com' रूप में है, लेकिन मुझे 'LOCATION' की उम्मीद है। – altso

+0

@ जेपीब्लैंक: नाम का उपयोग सिर्फ एक उदाहरण था। ओपी ने कहा कि वह प्रिंसिपल से "डोमेन जानकारी" प्राप्त करना चाहता था, लेकिन यह स्पष्ट नहीं था कि कौन सी जानकारी वांछित थी। –

0

एक शुद्ध LDAP पर, जिस तरह से नहीं निकाला जा एक डोमेन विभाजन के NetBIOS नाम निम्नलिखित (यह देखते हुए कि I'am डीसी = डोम, डीसी = fr विभाजन पर काम कर रहा है):

/* Connection to Active Directory 
*/ 
DirectoryEntry deConf = new DirectoryEntry("LDAP://WM2008R2ENT:389/CN=Partitions,CN=Configuration,DC=dom,DC=fr", "user", "password"); 

/* Directory Search 
*/ 
DirectorySearcher dsLookForNetb = new DirectorySearcher(deConf); 
dsLookForNetb.Filter = "(nCName=dc=dom,dc=fr)"; 
dsLookForNetb.SearchScope = SearchScope.Subtree; 
dsLookForNetb.PropertiesToLoad.Add("nETBIOSName"); 

SearchResult RefObj = dsLookForNetb.FindOne(); 

Console.WriteLine(RefObj.Properties["nETBIOSName"][0]); 
संबंधित मुद्दे