2012-06-26 15 views
5

मैं डोमेन उपयोगकर्ताओं और उनके संबंधित एडी सुरक्षा समूहों को खोजने के लिए System.DirectoryServices.AccountManagement नामस्थान का उपयोग कर रहा हूं। यह अच्छी तरह से काम करता है।स्थानीय समूह खोजें जो एक डोमेन उपयोगकर्ता से संबंधित है?

मैं रिमोट सर्वर पर स्थानीय सुरक्षा समूहों से पूछताछ के लिए उस नामस्थान का भी उपयोग कर रहा हूं। मैं एक सुरक्षा समूह खोजने में सक्षम हूं और फिर उस समूह के उपयोगकर्ताओं को कोई समस्या नहीं सूचीबद्ध करता हूं।

क्या मैं के साथ प्रदर्शित कर रहा है समस्याएं आ रही हैं जो स्थानीय समूहों एक डोमेन उपयोगकर्ता शामिल है के लिए:

PrincipalContext localmachine = new PrincipalContext(ContextType.Machine, "ServerName"); 
PrincipalContext domain = new PrincipalContext(ContextType.Domain); 

// find the user using the domain context (Works fine) 
UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 

// if found - grab its groups 
if (user != null) 
{ 
    // The get groups method is the only method that would accept a new context 
    PrincipalSearchResult<Principal> groups = user.GetGroups(localMachine); 

    // no groups are returned .... removed rest of code 
} 

मैं GetGroups विधि localMachine PrincipalContext में गुजर उपयोग करने का प्रयास कर रहा हूँ, लेकिन कोई समूह दिए जाते हैं।

उपयोगकर्ता केवल डोमेन एडी में मौजूद हैं। स्थानीय उपयोगकर्ताओं में स्थानीय मैचिन पर इस उपयोगकर्ता के लिए कोई प्रविष्टि नहीं है। डोमेन उपयोगकर्ता स्थानीय सुरक्षा समूहों में जोड़े जाते हैं।

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

+0

इसी प्रकार के प्रश्न यहाँ http://stackoverflow.com/questions/4809460/determine-nested-groups-of-windowsidentity-instance – dash

+0

मैंने इसे इस तरह से करने का प्रयास किया है। मशीन पर उपयोगकर्ता की तलाश करते समय FindByIdentity विधि शून्य हो जाती है। मुझे लगता है कि ऐसा इसलिए है क्योंकि वास्तविक स्थानीय उपयोगकर्ता नहीं बनाया गया है। यह एक डोमेन उपयोगकर्ता है। मैंने डोमेन नाम के साथ और उसके बिना उपयोगकर्ता नाम में गुजरने का प्रयास किया है। –

+0

कुछ पुराने कोड के माध्यम से खुदाई, मुझे लगता है कि मैंने इसे ठीक तरह से वर्णन किया था; स्थानीय मशीन समूहों (निर्देशिका खोजकर्ता के माध्यम से) को समझाते हुए, और फिर यह देखने के लिए कि क्या मैं एक समूह ढूंढ सकता हूं जिसे उपयोगकर्ता का सदस्य है। हमारे पास एक सुंदर उथले पदानुक्रम भी था। क्षमा करें और अधिक मदद नहीं हो सकती है। – dash

उत्तर

2

निम्नलिखित कोड स्थानीय समूहों है कि एक डोमेन उपयोगकर्ता सदस्य की है वापस आ जाएगी:

 PrincipalContext domain = new PrincipalContext(ContextType.Domain); 
     UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 
     foreach (GroupPrincipal group in user.GetAuthorizationGroups()) 
     { 
      if (group.Context.ConnectedServer == serverName) 
       Console.Out.WriteLine("{0}\\{1}", group.Context.Name, group.SamAccountName); 
     } 
+1

मेरी स्थानीय मशीन से यह कोड केवल 30 समूहों के लिए एक कनेक्टेड सर्वर लौटाता है। मुझे GetPuthorizationGroups() विधि केवल उपयोगकर्ता प्रिंसिपल ऑब्जेक्ट में निर्दिष्ट संदर्भ से समूह लौटने की उम्मीद है। क्या वह विधि उस मशीन से पूछताछ करता है जिस पर कोड चल रहा है? –

1

मैं जानता हूँ कि मेरा उत्तर देर हो चुकी है, लेकिन यह मेरे लिए काम किया (बाद मैं क्रमपरिवर्तन के सभी प्रकार की कोशिश की):

private static IList<string> GetUserLocalGroups(string userAccountName, string computerName, string domainName) 
{ 
    List<string> groups = new List<string>(); 

    // We have to deal with a local computer 
    DirectoryEntry root = new DirectoryEntry(String.Format("WinNT://{0},Computer", computerName), null, null, AuthenticationTypes.Secure); 


    foreach (DirectoryEntry groupDirectoryEntry in root.Children) 
    { 
    if (groupDirectoryEntry.SchemaClassName != "Group") 
     continue; 

    string groupName = groupDirectoryEntry.Name; 
    Console.WriteLine("Checking: {0}", groupName); 
    if (IsUserMemberOfGroup(groupDirectoryEntry, String.Format("WinNT://{0}/{1}", domainName, userAccountName))) 
    { 
     groups.Add(groupName); 
    } 
    } 

    return groups; 
} 

private static bool IsUserMemberOfGroup(DirectoryEntry group, string userPath) 
{ 
    return (bool)group.Invoke(
     "IsMember", 
     new object[] { userPath } 
    ); 
} 

कॉल कुछ इस तरह है: - कुछ उपयोग की उम्मीद है -

GetUserLocalGroups("samaccountname", "computerName.yourdomain", "yourdomain"); 
संबंधित मुद्दे