6

Sorun: Yeni IIS Uygulama Havuzları oluşturulduğunda ve Uygulama Havuzu Kimliği'ni izinler için kullanacak şekilde ayarlandığında, bu kimliklerin Kullanıcı Gruplarına nasıl ekleneceğinden emin değilim. Yönetici veya Performans Sayacı Kullanıcıları.Gruplar için IIS Uygulama Havuzu Kimliği "kullanıcılar" ı Programlı Olarak Atama

Amaç: Şu anda aşağıdakileri yapmak amacıyla Microsoft.Web.Administration kullanan bir C# .NET kitaplığı yazıyorum:

  • IIS 7.x yüklüyse Algılama ve eğer Yani, hangi bileşenleri.
  • IIS 7.x'i, gerekli bileşenlerin sağlanan bir listesine yükleyin veya yükseltin.
  • IIS aracılığıyla bir veya daha çok web sitesi oluşturun/yönetin. Otomatik olarak
  • oluşturmak/web sitesinin başına bir uygulama havuzu yönetmek

bağlam bu kütüphane Windows Server işletim sistemleri üzerinde bir web sunucusu ve web siteleri/hizmetler olarak otomatik dağıtımını sağlamak üzere çalıştırılabilir montajcılar tarafından kullanılmak üzere olmasıdır Daha büyük bir yazılım dağıtımının parçası. Şimdiye kadar, yukarıdakilerin hepsi uygulanmış, test edilmiş ve Uygulama Havuzu/Web Sitesi oluşturma üzerinde yapılması gereken bazı izinlerin otomasyonu hariç (çoğunlukla) işlevseldir. Yeni bir web sitesi yüklemek için benim yöntemde

, yeni bir uygulama havuzunu oluşturmak ve Uygulama Havuzu Kimliğini kullanmaya zorlamak: Anladığım kadarıyla

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 ... 
} 

, bu iyi güvenlik uygulaması olacak ve Daha sonra, minimum sistem erişiminden daha fazlası için belirli web sitelerine izinler ekleyeceğim. Bu işlemin bir kısmı, Uygulama Havuzu kimliklerini Yönetici veya Performans İzleyicisi Kullanıcıları gibi Kullanıcı Gruplarına eklemektir. Komplikasyonların ortaya çıktığı yer burasıdır.

Şimdi documented elsewhere gibi her Uygulama Havuzu Kimliği IIS AppPool\\<pool_name> biçiminde var ama bu sahte kullanıcı, normal GUI kullanıcı yönetimi denetimler arasında yer almıyorsa ve this example on SO izlerken böyle System.DirectoryServices.AccountManagement olarak kütüphaneler aracılığıyla erişilebilir görünmüyor . Ayrıca, Uygulama Havuzu Kimliği ile ilgili diğer sorular, bir yükleme kapsamında değil, referencing it from within a child website ile ilişkili görünmektedir.

Yani, herkes uygun yöntemler başvuruda bulunma ve programlı Uygulama Havuzu Kimlikleri erişen

  • a) ne olduğunu gelmez.
  • b) Kullanıcı Havuzları ekleyerek Uygulama Havuzu Kimliklerinin verilmesi.

cevap

1

Tercih ettiğimden değil, beklediğimden daha kısa sürede bir çözüm sunuldu. İlgilenen herkes için, this pinvoke page üzerinde bir çift ek seçenek vardır. Yönetilen çözüm benim için çalışmadı, ancak DllImport kullanan örnek çalıştı.

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); 
} 

: şuna benzer

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

modifiye (çalışma) fonksiyonu: Ben başka DllImport SID dizeleri için bir enum haritalama ve dahil dayalı keyfi grupları işlemek için örnek ayarlama sona erdi Umarım bu bir başkasının ilgisini çeker ve hala, herkes tarafından yönetilen, tamamen yönetilen bir çözümden gelip gelmediğini bilmek isterim.

5

Yazılı sorunuz için teşekkür ederiz. Tam olarak, dün geceyi çözmeye çalıştığım sorun oldu ve sonunda yönetilen kodları kullanan bir cevabı bir araya getirebildiğim kadarıyla bana yeteri kadar verdim. hesabına ele almak için new System.Security.Principal.NTAccount(@"IIS APPPOOL\<appPoolName>") kullanılarak

  • : Üç bulabildiğim ve sanal kullanıcı ile çalışmak için çerçeveyi alma bulundu adımlar vardı.
  • bir grup, yerine bir kullanıcı gibi SID

Son bir çalışma programı (Windows benim test için Sunucusu 2012) olarak olduğunu Principal.FindByIdentity() davranır anlayış bir SID

  • dönüştürmek .Translate(typeof (System.Security.Principal.SecurityIdentifier)) kullanarak aşağıdaki sonuçları verir:

    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

    Sonuçların çoğaltılması için benim çözümümüzü değiştirmeyi deneyeceğim. Bu umut verici görünüyor, paylaşım için teşekkürler! – jmsb

    İlgili konular