Как изменить правило авторизации IIS FTP для определенного пути в С#?

В Server 2008+ я программно создаю новые папки в виртуальном каталоге Reports на FTP-сайте. Я могу создать новое правило авторизации FTP для каждого нового пути к файлу с помощью:

using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection authorizationSection = config.GetSection("system.ftpServer/security/authorization", "FTP/LDNClient/Reports/aClientPath");
ConfigurationElementCollection authorizationCollection = authorizationSection.GetCollection();

ConfigurationElement addElement = authorizationCollection.CreateElement("add");
addElement["accessType"] = @"Allow";
addElement["users"] = @"LDNClient";
addElement["roles"] = @"";
addElement["permissions"] = @"Read, Write";
authorizationCollection.Add(addElement);

serverManager.CommitChanges();
}

Где «FTP/LDNClient/Reports/aClientPath» — это путь к правилу. Но есть большое количество элементов для одного и того же пользователя с разными путями. Если я открою applicationHost.config, я увижу разные ConfigurationElements с такими путями, как «aClientPath»:

<location path="FTP/LDNClient/Reports/aClientPath">
    <system.ftpServer>
        <security>
            <authorization>
                <remove users="LDNClient" roles="" permissions="Write" />
                <add accessType="Allow" users="LDNClient" permissions="Read, Write" />
            </authorization>
        </security>
    </system.ftpServer>
</location>

Но я не могу понять, как сослаться на этот элемент, поэтому я могу либо (1) удалить его, либо (2) изменить разрешения. Я могу прокрутить каждый узел с помощью:

foreach (ConfigurationElement item in authorizationCollection)  
{
   // Do something with item here
}

Но я могу найти путь для aClientPath в «элементе». Используя указанный выше узел местоположения, как мне удалить его или изменить его разрешения?


person Velocedge    schedule 04.12.2019    source источник
comment
Что именно вы хотите сделать, говоря, как ссылаться на этот элемент? Вы хотите повторить все теги местоположения? Если да, то прямое редактирование XML должно быть гораздо более быстрым способом.   -  person Lex Li    schedule 05.12.2019
comment
Я хочу найти узел/элемент местоположения с определенным путем, например FTP/LDNClient/Reports/aClientPath   -  person Velocedge    schedule 05.12.2019


Ответы (2)


Это пример кода, предоставленный диспетчером конфигурации для изменения разрешения. Он будет искать элемент на основе нескольких атрибутов.

Не уверен, что это соответствует вашему требованию.

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample {

    private static void Main() {

        using(ServerManager serverManager = new ServerManager()) { 
            Configuration config = serverManager.GetApplicationHostConfiguration();

            ConfigurationSection authorizationSection = config.GetSection("system.ftpServer/security/authorization", "ftp/LDNClient/Reports/aClientPath");

            ConfigurationElementCollection authorizationCollection = authorizationSection.GetCollection();

            ConfigurationElement addElement = FindElement(authorizationCollection, "add", "users", @"LDNClient", "roles", @"", "permissions", @"3");
            if (addElement == null) throw new InvalidOperationException("Element not found!");

            addElement["permissions"] = @"Read";

            serverManager.CommitChanges();
        }
    }

    private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues) {
        foreach (ConfigurationElement element in collection) {
            if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase)) {
                bool matches = true;

                for (int i = 0; i < keyValues.Length; i += 2) {
                    object o = element.GetAttributeValue(keyValues[i]);
                    string value = null;
                    if (o != null) {
                        value = o.ToString();
                    }

                    if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase)) {
                        matches = false;
                        break;
                    }
                }
                if (matches) {
                    return element;
                }
            }
        }
        return null;
    }
}
person Jokies Ding    schedule 05.12.2019
comment
Я могу найти тип доступа, пользователей, роли и разрешения. Что я не могу найти, так это путь к атрибуту местоположения, например: ‹путь к местоположению=FTP/LDNClient/Reports/aClientPath› - person Velocedge; 05.12.2019
comment
@Velocedge Когда вы загружаете config.GetSection(system.ftpServer/security/authorization, ftp/LDNClient/Reports/aClientPath); Он всегда читает «путь к местоположению», потому что раздел авторизации доступен только для чтения в web.config и доступен только для записи в applicationhost.config. - person Jokies Ding; 06.12.2019

Я не совсем понимаю, почему так должно быть, но я заглянул внутрь файла applicationHost.config и продублировал его. Было удалено «запись» и добавлено «читать, писать». Работает, так что я буду называть это достаточно хорошо.

                ConfigurationElement addElement = authorizationCollection.CreateElement("remove");
                addElement["users"] = @"LDNClient";
                addElement["roles"] = @"";
                addElement["permissions"] = @"Write";
                authorizationCollection.Add(addElement);

                addElement = authorizationCollection.CreateElement("add");
                addElement["accessType"] = @"Allow";
                addElement["users"] = @"LDNClient";
                addElement["roles"] = @"";
                addElement["permissions"] = @"Read, Write";
                authorizationCollection.Add(addElement);

                serverManager.CommitChanges();
person Velocedge    schedule 08.12.2019