Directory.CreateDirectory доступ к пути запрещен? - PullRequest
3 голосов
/ 25 февраля 2012

enter image description here

У меня сервер-клиентское приложение, это файловый менеджер
моя проблема в том, что когда я захожу в папку, которая требует контроля доступа, например системных папок, она становится доступной только для чтения, но мне нужно переместить / удалить или создать новую папку, как я могу получить разрешение на это?

вот как я создаю новую папку на стороне сервера

public void NewFolder(string path)
    {
        try
        {
            string name = @"\New Folder";
            string current = name;
            int i = 0;
            while (Directory.Exists(path + current))
            {
                i++;
                current = String.Format("{0} {1}", name, i);
            }
            Directory.CreateDirectory(path + current);
            Explore(path); //this line is to refresh the items in the client side after creating the new folder
        }
        catch (Exception e)
        {
            sendInfo(e.Message, "error");
        }
    }

Ответы [ 7 ]

4 голосов
/ 25 февраля 2012

Часто на диске есть каталоги, к которым даже пользователь с правами администратора не может получить доступ.Каталог с таким именем, как «HDDRecovery», весьма вероятно, будет таким хлопотным.Конечно, он содержит конфиденциальные данные, которые помогают пользователю восстановиться после сбоя диска.Другой каталог, который соответствует этой категории, это «c: \ system volume information», он содержит данные о точках восстановления.

Администратор может изменить разрешения для папок, подобных этой.Но, конечно, это не решает реальную проблему и не является мудрой вещью.Ваш пользователь не может и не должен.Обязательно напишите код, который решает такие проблемы с разрешениями, просто перехватите IOExeption.Избавьте пользователя от неприятностей, никогда не показывая каталог, в котором установлен атрибут Скрытый или Системный.Это атрибуты "не связывайся со мной".

4 голосов
/ 25 февраля 2012

Если вы хотите удалить каталог, доступный только для чтения, используйте это: http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/cb75ea00-f9c1-41e5-ac8e-296c302827a4

Если вы хотите получить доступ к системным папкам, вы можете запустить программу от имени локального администратора.

3 голосов
/ 03 февраля 2014

Я также столкнулся с проблемой, похожей на эту, но мне удалось вручную перемещаться по проводнику Windows и создавать каталоги.

Однако мое веб-приложение, работающее в VS на моем ноутбуке, размещенное через локальный IIS, а не встроенное соглашение IIS для VS, вызывало проблему отказа в доступе.

Поэтому, когда я нажимал на ошибку в коде, я углубился в поиск дополнительных данных из объекта System.Environment и нашел пользователя, которым, конечно, был пул приложений, под которым мое приложение выполнялось в IIS.

Итак, я открыл IIS, открыл расширенные настройки для рассматриваемого пула приложений и изменил удостоверение для запуска в сетевой службе. Нажмите ОК. "cmd -> iisreset" для хорошей меры. Попробуйте приложение еще раз и УСПЕХА !!!!

1 голос
/ 24 июля 2018

У меня была похожая проблема (asp.net MVC vs2017) с этим кодом:

Directory.CreateDirectory ("~ / temp");

Вот мое решение:

System.IO.Directory.CreateDirectory (System.Web.HttpContext.Current.Server.MapPath ("~ / temp"));

1 голос
/ 09 февраля 2015

У меня была такая же проблема при создании каталога.Я использовал DirectorySecurity, как показано ниже:

DirectorySecurity securityRules = new DirectorySecurity();
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\AdminAccount1", FileSystemRights.Read, AccessControlType.Allow));
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\YourAppAllowedGroup", FileSystemRights.FullControl, AccessControlType.Allow));

DirectoryInfo di = Directory.CreateDirectory(path + current, securityRules);

Также помните о безопасности, как объяснено Ответ Ханса Пассанта .

Полную информацию можно найти на MSDN .

Итак, полный код:

public void NewFolder(string path)
{
    try
    {
        string name = @"\New Folder";
        string current = name;
        int i = 0;
        while (Directory.Exists(path + current))
        {
            i++;
            current = String.Format("{0} {1}", name, i);
        }
        //Directory.CreateDirectory(path + current);
        DirectorySecurity securityRules = new DirectorySecurity();
        securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\AdminAccount1", FileSystemRights.Read, AccessControlType.Allow));
        securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\YourAppAllowedGroup", FileSystemRights.FullControl, AccessControlType.Allow));

        DirectoryInfo di = Directory.CreateDirectory(path + current, securityRules);

        Explore(path); //this line is to refresh the items in the client side after creating the new folder
    }
    catch (Exception e)
    {
        sendInfo(e.Message, "error");
    }
}
0 голосов
/ 15 марта 2017

Решено: Каталог, созданный на удаленном сервере с использованием приведенного ниже кода и настроек.

Предоставить общий доступ к папке и предоставить полные права доступа также в настройках Advance в папке.

DirectoryInfo di = Directory.CreateDirectory(@"\\191.168.01.01\Test\Test1");

Test - это папка назначения, где создается новая папка Test1 (каталог)

0 голосов
/ 25 февраля 2012

Я подозреваю, что когда вы запускаете приложение в режиме клиент / сервер, часть server должна быть запущена от имени администратора, в дополнение к возможному удалению только для чтения или системных флагов, чтобы иметь возможность делать то, что ты хочешь.

Тем не менее, я согласен с @ HansPassant - похоже, то, что вы пытаетесь сделать, является опрометчивым.

...