Как изменить разрешения для папок в проекте веб-настройки? - PullRequest
4 голосов
/ 28 октября 2009

Я использую проект веб-установки для установки моего приложения ASP.NET, которое должно записывать в папку, которая находится в папке основного виртуального каталога. Как настроить проект установки для предоставления пользователю ASPNET разрешений на эту папку?

1 Ответ

6 голосов
/ 28 октября 2010

Способ сделать это - создать класс, полученный из System.Configuration.Install.Installer. Переопределите метод Install(). Ниже приведен пример изменения прав доступа к каталогу и файлу, вы, вероятно, не хотите быть таким разрешающим, но это зависит от контекста безопасности Чтобы это работало, проект установки должен выполнить это как пользовательское действие. Добавьте «Первичный вывод» из любого проекта, в котором находится этот класс. Вам также нужно будет передать каталог настраиваемому действию в его свойствах. Имя первой переменной должно соответствовать коду. Как это: /targetdir="[TARGETDIR]\"

[RunInstaller(true)]
public partial class SetPermissions : Installer
{
    private const string STR_targetdir = "targetdir";
    private const string STR_aspnetUser = "ASPNET";

    public SetPermissions()
    {
        InitializeComponent();
    }

    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        Context.LogMessage(
            Context.Parameters
                .Cast<DictionaryEntry>()
                .Select(entry => String.Format("String = {0} Value = {1}", entry.Key, entry.Value))
                .Aggregate(new StringBuilder("From install\n"), (accumulator, next) => accumulator.AppendLine(next))
                .ToString()
        );

        string targetDir = Context.Parameters[STR_targetdir];
        string dbDir = Path.Combine(targetDir, "db");

        AddFullControlPermissionToDir(dbDir, STR_aspnetUser);
        string rimdbSqliteFilename = Path.Combine(dbDir, "db.sqlite");
        AddFullControlPermissionToFile(rimdbSqliteFilename, STR_aspnetUser);
        string logsDir = Path.Combine(targetDir, "logs");
        AddFullControlPermissionToDir(logsDir, STR_aspnetUser);
    }

    private static void AddFullControlPermissionToDir(string dir, string user)
    {
        DirectorySecurity directorySecurity = Directory.GetAccessControl(dir);
        directorySecurity.AddAccessRule(
            new FileSystemAccessRule(
                user,
                FileSystemRights.FullControl,
                InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
                PropagationFlags.None,
                AccessControlType.Allow));
        Directory.SetAccessControl(dir, directorySecurity);
    }

    private static void AddFullControlPermissionToFile(string filename, string user)
    {
        FileSecurity fileSecurity = File.GetAccessControl(filename);
        fileSecurity.AddAccessRule(
            new FileSystemAccessRule(
                user,
                FileSystemRights.FullControl,
                AccessControlType.Allow));
        File.SetAccessControl(filename, fileSecurity);
    }
}
...