Directory.CreateDirectory доступ к пути запрещен?

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

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

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");
        }
    }

8 ответов

Решение

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

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

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

Directory.CreateDirectory ("~ / Temp");

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

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

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

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

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

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

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

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

У меня была такая же проблема при создании каталога. Я использовал 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");
    }
}

У меня была такая же ошибка (доступ запрещен) в следующей ситуации:

У меня была следующая структура каталогов:

      root/
├─ Nodes.xml/
├─ MyApp.exe

В этой ситуации я попытался создать файл с именем вrootкаталог, и эта операция завершилась неудачей с исключением отказа в доступе , но на самом деле проблема заключалась в том, что существовал каталог с таким же именем.

После удаленияNodes.xml каталог , проблема исчезла.

Информация об исключениях, безусловно, может быть улучшена.

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

Предоставьте общий доступ к папке и предоставьте права полного доступа также в разделе "Дополнительные настройки" в папке.

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

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

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

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

Другие вопросы по тегам