6

समस्या: नई आईआईएस आवेदन ताल बनाया है और अनुमतियों के लिए आवेदन पूल पहचान का उपयोग करने के लिए सेट कर रहे हैं, मैं इस तरह के रूप उपयोगकर्ता समूह के लिए उन पहचान जोड़ने के बारे में अनिश्चित हूं प्रशासक या प्रदर्शन काउंटर उपयोगकर्ता।प्रोग्राम आईआईएस आवेदन पूल पहचान "उन" बताए समूह को

पृष्ठभूमि: मैं वर्तमान में जो निम्न कार्य करने के क्रम में Microsoft.Web.Administration का उपयोग करता है एक सी # नेट पुस्तकालय लिख रहा हूँ:

  • यदि आईआईएस 7.x स्थापित किया गया है का पता लगाने, और अगर तो, क्या घटक।
  • आईआईएस 7.x को आवश्यक घटकों की एक प्रदान की गई सूची में स्थापित या अपग्रेड करें।
  • आईआईएस के माध्यम से एक या एक से अधिक वेब साइट बनाएं/प्रबंधित करें।
  • स्वचालित रूप से/बनाने वेब साइट प्रति एक अनुप्रयोग पूल का प्रबंधन

संदर्भ है कि इस पुस्तकालय निष्पादन संस्थापक द्वारा प्रयोग की जाने के रूप में एक वेब सर्वर और वेब साइटों/सेवाओं पर Windows सर्वर OSes के स्वचालित तैनाती प्रदान करना है एक बड़े सॉफ्टवेयर परिनियोजन का हिस्सा। अब तक, उपर्युक्त सभी को आवेदन पूल/वेबसाइट निर्माण पर किए जाने वाले कुछ अनुमतियों के स्वचालन को छोड़कर कार्यान्वित किया गया है, परीक्षण किया गया है, और (ज्यादातर) कार्यात्मक है।

एक नई वेबसाइट स्थापित करने के लिए मेरी विधि में, मैं एक नया आवेदन पूल बना सकते हैं और आवेदन पूल पहचान का उपयोग करने के लिए मजबूर यह:

static public void InstallSite(string name, string path, int port) 
{ 
    Site site; 
    var appPoolName = ApplicationPoolBaseName + name; 

    using (var iisManager = new ServerManager()) 
    { 
     // Set up a custom application pool for any site we run. 
     if (!iisManager.ApplicationPools.Any(pool => pool.Name.Equals(appPoolName))) 
     { 
      iisManager.ApplicationPools.Add(appPoolName); 
      iisManager.ApplicationPools[appPoolName].ManagedRuntimeVersion = "v4.0"; 
     } 
     iisManager.CommitChanges(); 
    } 

    // ... other code here ('site' gets initialized) ... 

    using (var iisManager = new ServerManager()) 
    { 
     // Set anonymous auth appropriately 
     var config = iisManager.GetWebConfiguration(site.Name); 
     var auth = config.GetSection("system.web/authentication"); 
     auth.SetMetadata("mode", "Windows"); 
     var authSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication"); 
     authSection.SetAttributeValue("enabled", true); 
     authSection.SetAttributeValue("userName", string.Empty); // Forces the use of the Pool's Identity. 
     authSection = config.GetSection("system.webServer/security/authentication/basicAuthentication"); 
     authSection.SetAttributeValue("enabled", false); 
     authSection = config.GetSection("system.webServer/security/authentication/digestAuthentication"); 
     authSection.SetAttributeValue("enabled", false); 
     authSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication"); 
     authSection.SetAttributeValue("enabled", false); 

     iisManager.CommitChanges(); 
    } 

    // ... other code here ... 
} 

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

अब, documented elsewhere के रूप में, प्रत्येक आवेदन पूल पहचान IIS AppPool\\<pool_name> के प्रारूप में मौजूद है, लेकिन इस छद्म-उपयोगकर्ता सामान्य जीयूआई उपयोगकर्ता प्रबंधन पर नियंत्रण के माध्यम से सूचीबद्ध नहीं है, और जब this example on SO निम्नलिखित ऐसे System.DirectoryServices.AccountManagement के रूप में पुस्तकालयों के माध्यम से सुलभ हो प्रतीत नहीं होता है । साथ ही, अनुप्रयोग पूल पहचान के बारे में अन्य प्रश्न referencing it from within a child website से संबंधित हैं, जो कि किसी स्थापना संदर्भ से नहीं हैं।

तो, किसी को पता है क्या उचित तरीके के लिए

  • क) संदर्भित और प्रोग्राम के रूप में आवेदन पूल पहचान पहुंच रहे हैं।
  • बी) उन्हें उपयोगकर्ता समूह जोड़कर एप्लिकेशन पूल पहचान अनुमतियां देना।

उत्तर

1

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

static public bool AddUserToGroup(string user, UserGroup group) 
{ 
    var name = new StringBuilder(512); 
    var nameSize = (uint)name.Capacity; 
    var refDomainName = new StringBuilder(512); 
    var refDomainNameSize = (uint)refDomainName.Capacity; 
    var sid = new IntPtr(); 
    switch (group) 
    { 
     case UserGroup.PerformanceMonitorUsers: 
      ConvertStringSidToSid("S-1-5-32-558", out sid); 
      break; 
     case UserGroup.Administrators: 
      ConvertStringSidToSid("S-1-5-32-544", out sid); 
      break; 
     // Add additional Group/cases here. 
    } 

    // Find the user and populate our local variables. 
    SID_NAME_USE sidType; 
    if (!LookupAccountSid(null, sid, name, ref nameSize, 
     refDomainName, ref refDomainNameSize, out sidType)) 
     return false; 

    LOCALGROUP_MEMBERS_INFO_3 info; 
    info.Domain = user; 

    // Add the user to the group. 
    var val = NetLocalGroupAddMembers(null, name.ToString(), 3, ref info, 1); 

    // If the user is in the group, success! 
    return val.Equals(SUCCESS) || val.Equals(ERROR_MEMBER_IN_ALIAS); 
} 

:

[DllImport("advapi32.dll", SetLastError = true)] 
static extern bool ConvertStringSidToSid(
    string StringSid, 
    out IntPtr ptrSid); 

संशोधित (कार्य) समारोह कुछ इस तरह दिखता है: मैं के लिए सिड तार करने के लिए एक enum मानचित्रण, और सहित अन्य DllImport के आधार पर मनमाने ढंग से समूहों को संभालने के लिए नमूना का समायोजन समाप्त हो गया उम्मीद है कि यह किसी और के लिए ब्याज की बात होगी, और मैं अभी भी जानना चाहूंगा कि कोई कामकाजी, पूरी तरह से प्रबंधित समाधान में आता है या नहीं।

5

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

  • new System.Security.Principal.NTAccount(@"IIS APPPOOL\<appPoolName>") का उपयोग कर खाते पर एक संभाल पाने के लिए: वहाँ तीन चरण हैं, जो मुझे लगता है और आभासी उपयोगकर्ता के साथ काम करने के लिए ढांचा हो रही पाए गए।
  • .Translate(typeof (System.Security.Principal.SecurityIdentifier)) का उपयोग कर इसे एक सिड
  • समझने कि Principal.FindByIdentity() व्यवहार करता है कि सिड जैसे कि यह एक समूह है, बजाय एक उपयोगकर्ता है

एक अंतिम काम कर कार्यक्रम (विंडोज सर्वर 2012 अपने परीक्षण के लिए) के रूप में है कन्वर्ट करने के लिए निम्नानुसार है:

using System; 
using System.DirectoryServices.AccountManagement; 

namespace WebAdminTest 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var user = new System.Security.Principal.NTAccount(@"IIS APPPOOL\10e6c294-9836-44a9-af54-207385846ebf"); 
      var sid = user.Translate(typeof (System.Security.Principal.SecurityIdentifier)); 

      var ctx = new PrincipalContext(ContextType.Machine); 

      // This is weird - the user SID resolves to a group prinicpal, but it works that way. 
      var appPoolIdentityGroupPrincipal = GroupPrincipal.FindByIdentity(ctx, IdentityType.Sid, sid.Value); 

      Console.WriteLine(appPoolIdentityGroupPrincipal.Name); 
      Console.WriteLine(appPoolIdentityGroupPrincipal.DisplayName); 

      GroupPrincipal targetGroupPrincipal = GroupPrincipal.FindByIdentity(ctx, "Performance Monitor Users"); 

      // Making appPoolIdentity "group" a member of the "Performance Monitor Users Group" 
      targetGroupPrincipal.Members.Add(appPoolIdentityGroupPrincipal); 
      targetGroupPrincipal.Save(); 

      Console.WriteLine("DONE!"); 
      Console.ReadKey(); 
     } 
    } 
} 
+0

मैं परिणाम पुन: उत्पन्न करने के लिए इस के लिए अपना समाधान स्वैप करने का प्रयास करने जा रहा हूं। यह आशाजनक लग रहा है, साझा करने के लिए धन्यवाद! – jmsb