Программно изменить ACL, чтобы предоставить пулу приложений все разрешения для приложения (IIS) - PullRequest
0 голосов
/ 13 июня 2018

У меня есть процесс, который создает приложение и пул приложений, используя объект диспетчера сервера в пространстве имен Microsoft.Web.Administration, сначала создается пул приложений, а затем приложение, назначая вновь созданный пул приложений приложению, кодниже.

protected TResult UseServerManagerWrapper<TResult>(Func<ServerManager, TResult> func)
    {
        using (var serverManager = new ServerManager())
        {
            return func(serverManager);
        }
    }

Функция создания приложения

public void CreateApplication(String siteName, String parentApplicationName, String organisationName, String applicationName, String applicationPoolName)
    {
        UseServerManagerWrapper(serverManager =>
            {
                var site = serverManager.Sites[siteName];

                var newApplication =
                    site.Applications.Add(
                        GetApplicationPath(parentApplicationName, organisationName, applicationName),
                        this.GetGeneratedApplicationPhysicalPath(siteName, parentApplicationName, organisationName, applicationName));

                newApplication.ApplicationPoolName = applicationPoolName;
                serverManager.CommitChanges();
                return true;
            });
    }

и создание пула приложений.

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 для предоставления разрешений пулу приложений.Есть ли способ сделать это в коде?

Извинения, если я использую неправильную терминологию или что-то еще, я новичок в публикации в целом.Дайте мне знать, если вам нужна дополнительная информация.

1 Ответ

0 голосов
/ 14 июня 2018

Хорошо, поэтому после долгих поисков и проб и ошибок я нашел разрешение, и оно никак не связано с объектом ServerManager.Прежде всего, чтобы заставить это работать в ASP.NET Core 2.1 (1.x / 2.x), мне понадобился Nuget System.IO.FileSystem.AccessControl и пространства имен ниже.

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.

...