2010-03-22 12 views
7

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

"SELECT GroupComponent FROM Win32_GroupUser WHERE PartComponent = \"Win32_UserAccount.Domain='" + accountDomain + "',Name='" + accountName + "'\"" 

Win32_Group वस्तुओं यह तार के रूपों में आते हैं रिटर्न, और वे केवल डोमेन और नाम (भले ही Win32_Group एक सिड संपत्ति है) है।

मैं इस डूबने लग रहा है करने के लिए मैं होगा:

  1. Win32_SID पूछताछ की एक खाता नाम में सिड करें;
  2. ऊपर दिए गए प्रश्न को निष्पादित करें;
  3. बारी जिसके परिणामस्वरूप समूह के नाम से प्रत्येक Win32_Group पूछताछ की SIDs में।

उत्तर

3

आप System.DirectoryServices.AccountManagement नाम स्थान कक्षाओं का उपयोग कर सकते हैं?

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
    using (var user = UserPrincipal.FindByIdentity(context, accountName)) 
    { 
     var groups = user.GetAuthorizationGroups(); 
     ...iterate through groups and find SIDs for each one 
    } 
} 

यह ContextType.Machine साथ काम करना चाहिए, हालांकि आप मशीन नाम निर्दिष्ट करना होगा और उचित विशेषाधिकार होगा।

using (var context = new PrincipalContext(ContextType.Machine, 
              "MyComputer", 
              userid, 
              password)) 
{ 
    ... 
} 

वहाँ एक अच्छा MSDN article (, दीर्घाकार हालांकि) नई .NET 3.5 खाता प्रबंधन नाम स्थान का उपयोग करने पर है।

+0

मुझे स्थानीय उपयोगकर्ताओं और समूहों के साथ ऐसा करने में सक्षम होना चाहिए। – JCCyC

+1

ContextType.Machine प्रिंसिपल कॉन्टेक्स्ट बनाते समय नाम से निर्दिष्ट मशीन पर उपयोगकर्ताओं और समूहों को स्थानीय रूप से समझा जाना चाहिए। – tvanfosson

+0

मुझे कल्पना है, अगर मैं उचित रिमोट क्रेडेंशियल्स के साथ mpr.dll से WNetUseConnection() के साथ \\ MACHINENAME से कनेक्ट करता हूं, तो मुझे जानकारी प्राप्त करने में सक्षम होना चाहिए भले ही मैं और दूरस्थ मशीन एक ही डोमेन का हिस्सा न हो, है ना? – JCCyC

3

हां वहाँ कुछ विधियां डोमेन होने पर निर्भर करती हैं।

  1. कैसे पी/आह्वान और Windows API, या .NET 2.0+ और कोई पी/आह्वान का उपयोग कर एक प्रयोक्ता आईडी के लिए एक सिड कन्वर्ट करने के लिए इस page देखें।

    सिस्टम.Security.Principal का उपयोग कर; ।

    // उपयोगकर्ता sid एक डोमेन \ नाम के स्ट्रिंग खाते = नए SecurityIdentifier (stringSid) .Translate (typeof (NTAccount)) toString() कन्वर्ट;

  2. यदि आपके पास AD और उपयोगकर्ता आईडी है तो समूह खोजने के लिए the DirectorySearcher method या खाता प्रबंधन API का उपयोग करें। अन्यथा स्थानीय समूहों को प्राप्त करने के लिए this आलेख में उल्लिखित विधि का उपयोग करें।

  3. अब समूह को पुन: स्थापित करने और एसआईडी प्राप्त करने के लिए @tvanfosson द्वारा सुझाए गए एपीआई का उपयोग करें। या नीचे दी गई जानकारी का पालन करें।

एएसपी.NET अनुप्रयोग में समूह की जानकारी तक पहुंचने के लिए इस तरह के कोड का उपयोग करना संभव है, बशर्ते उपयोगकर्ता द्वारा विंडोज़ द्वारा प्रमाणित किया गया हो और फॉर्म प्रमाणीकरण न हो। इस उदाहरण में मैं अपवाद है कि वातावरण में फेंक दिया जाता है के बारे में एक दिलचस्प टिप्पणी छोड़ दिया है, लेकिन यह अन्य उपयोगकर्ताओं के लिए आवेदन कर सकते हैं:

public List<string> GetGroupsFromLogonUserIdentity() 
{ 
    List<string> groups = new List<string>(); 
    HttpRequest request = HttpContext.Current.Request; 

    if (request.LogonUserIdentity.Groups != null) 
    { 
     foreach (IdentityReference group in request.LogonUserIdentity.Groups) 
     { 
      try 
      { 
       groups.Add(group.Translate(typeof(NTAccount)).ToString()); 
      } 
      catch (IdentityNotMappedException) 
      { 
       // Swallow these exceptions without throwing an error. They are 
       // the result of dead objects in AD which are associated with 
       // user accounts. In this application users may have a group 
       // name associated with their AD profile which cannot be 
       // resolved in the Active Directory. 
      } 
     } 
    } 

    return groups; 
} 

LogonUserIdentity WindowsIdentity वर्ग पर आधारित है। आप WindowsIdentity का उपयोग करने और गैर-वेब अनुप्रयोग में फ़ंक्शन का उपयोग करने के लिए अपने कोड नमूना को संशोधित कर सकते हैं।एक बार जब आप एक समूह में पुन: प्रयास करते हैं तो आपको सुरक्षा आईडीडिएंटर प्राप्त करने के लिए ऐसा कुछ करने में सक्षम होना चाहिए:

SecurityIdentifier secid = group as SecurityIdentifier; 
संबंधित मुद्दे