Как вы создаете папки и одновременно указываете на них права доступа? - PullRequest
1 голос
/ 03 апреля 2009

У меня есть приложение Windows Forms, которое служит своего рода административным модулем для веб-приложения ASP.NET. Веб-приложение обслуживает несколько стран, и папки создаются при добавлении новых стран в данные приложения.

К сожалению, во вновь добавленных странах я сталкиваюсь с исключением из-за веб-приложения при попытке записать файлы в папки:

System.UnauthorizedAccessException: Access to the path 'C:\...' is denied.

В веб-приложении, использующем олицетворение ASP.NET, очевидно, что пользователь IIS по умолчанию (MACHINENAME \ IUSR_MACHINENAME) не имеет разрешений для записи в папку.

Как предоставить разрешение пользователю IIS по умолчанию при создании папки?

Я понимаю, что

System.IO.Directory.CreateDirectory(string path, DirectorySecurity directorySecurity)

должен сделать это, но я не понимаю, как указать имя входа в систему для объекта DirectorySecurity.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2009

Предоставьте разрешение на создание каталогов и файлов (чтение / запись / изменение / ...) для группы рабочих процессов (sysname\iis_wpg) в родительский каталог, в котором вы хотите создать новые каталоги. Убедитесь, что вы установили разрешения для применения к this folder, subfolders, and files, тогда разрешения будут наследоваться для новых папок, которые вы создаете, и вам не нужно будет применять их специально. Вместо того, чтобы делать это для всех App_Data, я бы предложил создать определенный подкаталог и предоставлять только разрешения для этого подкаталога. Если у вас запущено несколько приложений, вы можете создать нового пользователя для запуска приложения, изменить идентификатор группы рабочих процессов и предоставить разрешение только этому конкретному пользователю.

0 голосов
/ 15 апреля 2009

Это решение, которое я использовал в конце концов:

        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
            DirectoryInfo info = new DirectoryInfo(path);
            DirectorySecurity security = info.GetAccessControl();

            security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow));
            security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));

            info.SetAccessControl(security); 
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...