以编程方式修改ACL,将应用程序池的所有权限授予应用程序(IIS)

以编程方式修改ACL,将应用程序池的所有权限授予应用程序(IIS),iis,asp.net-core,permissions,application-pool,asp.net-core-2.1,Iis,Asp.net Core,Permissions,Application Pool,Asp.net Core 2.1,我有一个使用Microsoft.Web.Administration命名空间中的Server Manager对象创建应用程序和应用程序池的过程,首先创建应用程序池,然后创建应用程序,将新创建的应用程序池分配给应用程序,代码如下 protected TResult UseServerManagerWrapper<TResult>(Func<ServerManager, TResult> func) { using (var serverManager

我有一个使用Microsoft.Web.Administration命名空间中的Server Manager对象创建应用程序和应用程序池的过程,首先创建应用程序池,然后创建应用程序,将新创建的应用程序池分配给应用程序,代码如下

protected TResult UseServerManagerWrapper<TResult>(Func<ServerManager, TResult> func)
    {
        using (var serverManager = new ServerManager())
        {
            return func(serverManager);
        }
    }
和应用程序池创建

public Boolean CreateApplicationPool(String applicationPoolName)
    {
        return UseServerManagerWrapper(serverManager =>
            {
                var appPool = serverManager.ApplicationPools.Add(applicationPoolName);

                appPool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
                appPool.ManagedRuntimeVersion = "";
                serverManager.CommitChanges();
                return true;
            });
    }
这一切都很好,唯一的问题是我必须进入应用程序文件夹并手动分配应用程序池的权限

我在ServerManager文档中看不到任何可以帮助我的内容,也找不到使用Directory.SetAccessControl方法授予应用程序池权限的方法。在代码中是否有这样做的方法


抱歉,如果我使用了错误的术语或任何东西,我一般都是新手。如果您需要更多信息,请告诉我。

好的,经过大量搜索和尝试,我找到了解决方案,与ServerManager对象无关。首先,要在ASP.NET Core 2.1(1.x/2.x)中实现这一点,我需要System.IO.FileSystem.AccessControl Nuget和下面的名称空间

using System.Security.AccessControl;
using System.Security.Principal;
通过这些功能,可以修改文件和文件夹的ACL,然后CreateApplication函数变为如下所示

public void CreateApplication(String siteName, String parentApplicationName, String organisationName, String applicationName, String applicationPoolName)
    {
        UseServerManagerWrapper(serverManager =>
            {
                var site = serverManager.Sites[siteName];
                var generatedPath = this.GetGeneratedApplicationPhysicalPath(siteName, parentApplicationName, organisationName, applicationName);
                var newApplication =
                    site.Applications.Add(
                        GetApplicationPath(parentApplicationName, organisationName, applicationName),
                        generatedPath);

                newApplication.ApplicationPoolName = applicationPoolName;

                var dInfo = new DirectoryInfo(generatedPath);
                var acl = dInfo.GetAccessControl();
                var acct = new NTAccount($"IIS APPPOOL\\{applicationPoolName}");
                acl.AddAccessRule(new FileSystemAccessRule(acct, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
                dInfo.SetAccessControl(acl);

                serverManager.CommitChanges();
                return true;
            });
    }
“newApplication.ApplicationPoolName=ApplicationPoolName”和“serverManager.CommitChanges()”之间的代码从新生成的目录中获取ACL,从而允许修改它并使用新的FileSystemAccessRule重新分配

public void CreateApplication(String siteName, String parentApplicationName, String organisationName, String applicationName, String applicationPoolName)
    {
        UseServerManagerWrapper(serverManager =>
            {
                var site = serverManager.Sites[siteName];
                var generatedPath = this.GetGeneratedApplicationPhysicalPath(siteName, parentApplicationName, organisationName, applicationName);
                var newApplication =
                    site.Applications.Add(
                        GetApplicationPath(parentApplicationName, organisationName, applicationName),
                        generatedPath);

                newApplication.ApplicationPoolName = applicationPoolName;

                var dInfo = new DirectoryInfo(generatedPath);
                var acl = dInfo.GetAccessControl();
                var acct = new NTAccount($"IIS APPPOOL\\{applicationPoolName}");
                acl.AddAccessRule(new FileSystemAccessRule(acct, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
                dInfo.SetAccessControl(acl);

                serverManager.CommitChanges();
                return true;
            });
    }