Доступ к пути запрещен

165

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

Access to the path 'C:\inetpub\wwwroot\mysite\images\savehere' is denied.The error occured at mscorlib because    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode)

Я дал полный контроль над этой папкой (сохранить здесь) network serviceи iis_iusrsдаже дал полный контроль, everyoneно все еще получал это исключение. Я пытался дать доступ через проводник и через диспетчер IIS, до сих пор не повезло

Я делаю это на Windows Server 2008 R2 и IIS 7.5, кому мне нужно дать доступ?

Спасибо

Burjua
источник
Вы пытались использовать путь относительно вашего приложения? Я не знаю много о Windows-сервере, но, возможно, он не разрешает доступ к корневому пути `C:`.
Майкл К
1
Будущие читатели: проверьте права доступа к файлу.
Раскин

Ответы:

94

Вам необходимо узнать из пула приложений для веб-сайта, под каким именем он работает (по умолчанию это так Application Pool Identity) и предоставить ему правильные разрешения.

Одед
источник
Хорошо, спасибо, у меня есть 5 пулов, все они имеют идентичность ApplicationPoolIdentity, как я могу дать разрешения на это?
Буржуа
22
@Burjua - ищите IIS APPPOOL\DefaultAppPoolпользователя. Смотрите эту статью на официальном сайте IIS: learn.iis.net/page.aspx/624/application-pool-identities
Одед
1
Хорошо, как написано в этой статье, я добавил DefaultAppPoolи дал full controlразрешения на это, но все равно получаю ту же ошибку
Burjua
2
Я знаю, что я опоздал. Но я сталкиваюсь с той же проблемой. ОП четко упомянул, что он дал everyoneполный контроль. Если мы предоставим everyoneПолный контроль, даже тогда нам нужно предоставить доступ к DefaultAppPool? Это сбивает с толку.
Курбан
3
@stom - конечно, это не лучшая практика. Вы открываете сайт для всех видов уязвимостей. Вам просто нужны разрешения на чтение / запись для Imagesкаталога для пользователя / удостоверения, на котором работает веб-сайт (вам нужно будет спросить об этом вашего хост-провайдера).
Одед
223

Доступ к пути 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere' запрещен

Прочитайте сообщение внимательно. Вы пытаетесь сохранить файл, имя которого совпадает с именем каталога. Это не может работать, вы не можете перезаписать каталог, заполненный файлами, одним новым файлом. Это может привести к неустранимой потере данных: «Доступ к пути запрещен» - это файловая система, которая пытается предотвратить это.

Сообщение об исключении не является идеальным, но оно пришло прямо из ОС и было отлито из камня. Платформа часто добавляет дополнительные проверки для создания более качественных сообщений, но это дорогостоящий тест в сети. Перф это тоже особенность.

Вам нужно использовать имя типа «C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg». Рассмотрим Path.Combine (), чтобы надежно генерировать имя пути.

Ганс Пассант
источник
19
@ Ханс Пассант Спасибо за ваше, немного резкое заявление. Это заставило меня заглянуть в мой код и понять, что я сделал ту же ошибку.
LosManos
для меня проблема была в том, что файл существовал и пользователь мог его заменить
VinnyG
Хах! Я сделал то же самое.
jakejgordon
Может быть, эта тема должна быть заблокирована для защиты от "Я тоже!" ответы. Потому что я тоже! В моем случае я должен добавить, что меня раздражает, что метод SaveAs объекта HttpPostedFileBase требует имени в дополнение к пути, учитывая, что имя является еще одним свойством объекта. Конечно, я думаю, вы могли бы дать ему другое имя таким образом.
Ральф
1
Я получил эту ошибку при попытке записать файл в модульном тесте (ничего общего с IIS или чем-либо связанным с Интернетом), и сообщение об ошибке настолько расплывчато. Почему в строке «Не удается открыть \ путь \ к \ файлу как файлу» ничего не сказано?
MarioDS
22

У меня возникла та же проблема при попытке создать файл на сервере (на самом деле файл, который является копией из шаблона).

Вот полное сообщение об ошибке:

{ERROR} 08/07/2012 22:15:58 - System.UnauthorizedAccessException: Access to the path 'C:\inetpub\wwwroot\SAvE\Templates\Cover.pdf' is denied.

Я добавил новую папку Templatesвнутри папки приложения IIS. В моем случае очень важно то, что мне нужно было дать разрешение на запись (Gravar) для пользователя IUSR в этой папке. Вам также может понадобиться дать Network Serviceи ASP.NET v$.#то же разрешение на запись.

введите описание изображения здесь

После этого все работает как положено.

Лениэль Маккаферри
источник
12

У меня была точно такая же проблема.

Решение было то , что файл я пытался получить доступ был только для чтения , так как он был скопирован из файла шаблона , который был доступен только для чтения.

<facepalm />

Раскин
источник
Класс приложений Altova AltovaXML (DCOM) делает это. Вызвала у меня проблемы.
Майк Д
Я имею в виду, что он должен использовать что-то похожее на следующую строку, то есть XSLT не должен быть доступен только для чтения. 'FileStream ms = новый FileStream (путь, FileMode.Open, FileAccess.ReadWrite);'
Майк Д
1
Вот еще и <facepalm /> от меня. Ох и .. Спасибо, только для чтения была моя проблема также.
Cătălin Rădoi
7

Эта проблема возникает при попытке сохранить файл без указания имени файла.

Старый код

File.WriteAllBytes(@"E:\Folder", Convert.FromBase64String(Base64String));

Рабочий код

File.WriteAllBytes(@"E:\Folder\"+ fileName, Convert.FromBase64String(Base64String));
MarceloBarbosa
источник
6

Моя проблема заключалась в том, что мне нужно было запрашивать только доступ для чтения:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
jesal
источник
1
Бинго - это тоже меня! Спасибо вам за публикацию!
paulsm4
4

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

TA01
источник
4

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

Я пытался получить элемент управления ASP.Net FileUpload для загрузки его файла на сетевой адрес, который содержал « скрытый общий ресурс », а именно:

\ MyNetworkServer \ с $ \ SomeDirectoryOrOther

Я не поняла это. Если бы я запускал веб-страницу в режиме отладки в Visual Studio, она бы работала нормально. Но когда проект был развернут и работал через пользователя пула приложений, он отказался найти этот сетевой каталог.

Я проверил, под каким пользователем работает мой сайт IIS, дал ему полные права доступа к этому каталогу на сервере « MyNetworkServer » и т. Д. И т. Д., Но ничего не получалось.

Причина (конечно!) В том, что только администраторы могут «видеть» эти скрытые общие папки.

Моим решением было просто создать «нормальную» акцию для

\ MyNetworkServer \ SomeDirectoryOrOther

и это избавило от ошибки «Доступ к пути ... запрещен». FileUpload смог успешно выполнить команду

fileUpload.SaveAs(networkFilename);

Надеюсь, что это поможет некоторым другим пользователям, которые совершают ту же ошибку, что и я!

Также обратите внимание, что если вы загружаете большие файлы (более 4 МБ), то IIS7 требует, чтобы вы изменили файл web.config в двух местах. Нажмите на эту ссылку, чтобы прочитать, что вам нужно сделать: Загрузка больших файлов в ASP.Net

Майк Гледхилл
источник
4

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

Али Расули
источник
Плохой совет Произвольное предоставление IIS_USERS «полного контроля» - без тщательного рассмотрения - является моральным эквивалентом высказывания «Медсестра - бензопила»;)
paulsm4
4

Я решил с этой настройкой:

IIS> Пулы приложений> [ваш сайт]> Расширенные настройки ...> Идентификация> Встроенный доступ> LocalSystem

Мохаммад Хоссейн Гянджяр
источник
2
Это дает вашему сайту полномочия LocalAdmin. Это проблема безопасности.
Рич-Ланг
1
НИКОГДА не запускайте свой сайт под учетной записью LocalSystem. КОГДА-ЛИБО. СРОК.
Михаил Шишков
@MihailShishkov почему?
Мохаммад Хоссейн Ганджяр
2
@MohammadHosseinGanjyar LocalSystem имеет права администратора системы. Запустив веб-сайт под этой учетной записью, вы в основном даете ему ключи для всей системы и, вероятно, всей локальной сети, в которой находится сервер. Это означает, что если злоумышленник найдет способ использовать ваш сайт - сайт и вся система будут испорчены. Вот почему привилегии / права и учетные записи существуют в первую очередь. Как правило, запомните это: ни одно программное обеспечение не должно работать с более высокими привилегиями, чем оно должно выполнять свою работу. Например блог-сайт не нуждается в праве на форматирование диска D:
Михаил Шишков
2

Моя проблема была что-то вроде этого:

FileStream ms = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);

но вместо использования пути я должен использовать File.FullName ... Я не знаю, поможет ли он кому-то еще, просто передам свой собственный опыт с данной ошибкой!

Tarcísio Luna
источник
2
  1. Измените настройку со встроенной учетной записи на настраиваемую учетную запись и введите имя пользователя и пароль другого сервера.

  2. Сохраняйте настройку как интегрированную (вместо классического режима).

Удай
источник
1

Может быть, это поможет тебе.

string tempDirectoryPath = @"C:\Users\HOPE\Desktop\Test Folder";
string zipFilePath = @"C:\Users\HOPE\Desktop\7za920.zip";
Directory.CreateDirectory(tempDirectoryPath);
ZipFile.ExtractToDirectory(zipFilePath, tempDirectoryPath);
umutcakar
источник
0

Сделайте директорию сохранения здесь виртуальной директорией и дайте разрешение на чтение / запись с панели управления

Суровая Baid
источник
Запустите InetMgr.exe, затем перейдите в свою папку, сохраненную здесь, под mysite (веб-приложение / веб-сайт в IIS), она будет находиться слева, где находится DefaultApp, я надеюсь, вы поняли
Harsh Baid
0

У меня был каталог с тем же именем, что и файл, который я пытался записать, так что люди тоже могли бы позаботиться об этом.

Самуил
источник
0

Я столкнулся с этой проблемой при разработке на своей локальной рабочей станции.

После нескольких неудачных iisresetвызовов я исправил ситуацию, перезагрузив компьютер.

Оглядываясь назад, дескриптор открытого файла мог вызывать проблемы.

Джим Г.
источник
0

В моем случае мне пришлось добавить Правило авторизации .NET для веб-сайта в IIS.

Я добавил правило, разрешающее анонимным пользователям.

Правила авторизации .NET

GerardBeckerleg
источник
0

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

Самуэль Нде
источник
0

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

как-то так, прежде чем вызывать свой метод, который использует папку

bool exists = System.IO.Directory.Exists("mypath");

        if (!exists)
            System.IO.Directory.CreateDirectory("mypath");
AtLeastTheresToast
источник
0

Если вы получаете эту ошибку при загрузке файлов в суб-домене и работают правильно в вашем localhost, то выполните следующие действия:

Решение:

Панель Plesk

  • Войдите в свою панель Plesk. Выберите свой поддомен, который дает ошибку.
  • Нажмите на Настройки хостинга .
  • Выберите Дополнительные права на запись / изменение и Применить.

CPanel

  • Я не уверен в вариантах, доступных в CPanel. Но если вы дадите разрешение на каталог (в CPanel это должно быть десятичное число, например, 777, 755), это устранит ошибку.

Для более подробной информации обратитесь сюда

Причина ошибки:

  • Давайте предположим FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*)) это будет ваш код для перемещения ваших файлов на путь загрузки.
  • Server.MapPathдаст вам физический путь (реальный путь) каталога. Но ваш субдомен может не иметь разрешения на доступ к физическому пути.

  • Таким образом, если вы дадите разрешение субдомену на доступ к записи / изменению, это решит проблему.

Гурупрасад Бхат
источник
0

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

AMykowski
источник
0

Убедитесь, что ваша цель System.IO.Delete(string file)- это файл, который существует. Возможно, в вашем коде есть ошибка, как будто вы не передаете правильное имя файла методу или ваша цель - папка. В этих случаях вы увидите: «ошибка доступа к пути запрещена».

Мухаммед Юсфиян
источник
-1

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

Камила
источник