Доступ до шляху заборонено


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)

Я дав повний контроль над цією папкою (savehere) network serviceі iis_iusrsнавіть дав повний контроль над, everyoneале все ж отримую цей виняток. Я намагався надати доступ через Explorer і через менеджера IIS, все ще не пощастило

Я роблю це на Windows Server 2008 R2 та IIS 7.5, кому мені потрібно надати доступ?

Дякую


Чи спробували ви використовувати шлях, який стосується вашої програми? Я мало знаю про сервер 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дозволи на це, але все одно отримую ту ж помилку
Буржуа

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
@Hans Passant Дякуємо за ваше, трохи суворе, твердження. Це змусило мене заглянути в свій код, зрозумівши, що я допустив ту саму помилку.
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));

6

Моя проблема полягала в тому, що мені довелося просити доступ лише для читання:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);

1
Бінго - цей теж мене покусав! Дякую за пост!
paulsm4

4

Яка особа - ваш пул додатків для веб-додатків, який працює, як для усунення несправностей, спробуйте створити новий пул додатків із зазначенням мережевої служби як ідентичності та змусьте веб-додаток використовувати той новий пул додатків, який ви створили, і перевірте, чи помилка зберігається.


4

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

Я намагався отримати елемент управління ASP.Net FileUpload для завантаження файлу на мережеву адресу, яка містила " приховану спільну доступність ", а саме:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

Я цього не зрозумів. Якби я запустив веб-сторінку в режимі налагодження у Visual Studio, це буде добре. Але коли проект розгорнувся та працював через користувача пулу додатків, він відмовився знаходити цей мережевий каталог.

Я перевірив, під яким користувачем працює мій сайт IIS, дав цьому користувачеві повні дозволи для цього каталогу на сервері " MyNetworkServer " тощо тощо, але нічого не працювало.

Причина (звичайно!) В тому, що лише адміністратори можуть "бачити" ці приховані спільні диски.

Моє рішення полягало в тому, щоб просто створити "нормальну" частку

\ MyNetworkServer \ SomeDirectoryOrOther

і це позбулося помилки "Доступ до шляху ... відмовлено". FileUpload вдалося успішно запустити команду

fileUpload.SaveAs(networkFilename);

Сподіваюсь, це допомагає іншим користувачам, які роблять ту саму помилку, яку я зробив!

Зауважте також, що якщо ви завантажуєте великі файли (понад 4 Мб), IIS7 вимагає змінити файл web.config у двох місцях. Натисніть на це посилання, щоб прочитати, що вам потрібно зробити: Завантаження великих файлів в ASP.Net


4

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


Погана порада. Довільно надати IIS_USERS "повний контроль" - без уважного розгляду - це моральний еквівалент
вимови

4

Я вирішив цей параметр:

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


2
Це дає дозволи для вашого веб-сайту LocalAdmin. Це турбота про безпеку.
Річ-Ланг

1
НІКОЛИ не запускайте веб-сайт під обліковим записом LocalSystem. ВСЕ. ПЕРІОД.
Михайло Шишков


2
@MohammadHosseinGanjyar LocalSystem має права адміністратора над системою. Запустивши веб-сайт під цим обліковим записом, ви в основному надаєте йому ключі до всієї системи та, ймовірно, всієї локальної мережі, в якій проживає сервер. Це означає, що якщо зловмисник знайде спосіб експлуатувати ваш веб-сайт - веб-сайт і вся система накручуються. Ось чому в першу чергу існують пільги / права та рахунки. Як правило, пам’ятайте про це - жодне програмне забезпечення не повинно працювати з більшими привілеями, тоді воно повинно виконувати свою роботу. Наприклад, веб-сайт блогу не потребує права форматування D: drive
Михайло Шишков

2

Моя проблема полягала в чомусь подібному:

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

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


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

0

Зробіть те, щоб каталог зберігався там, де він не був віртуальним каталогом, і дайте дозвіл на читання / запис з панелі управління


Запустіть InetMgr.exe, тоді перейдіть до своєї папки, де зберігається під mysite (веб-додаток / веб-сайт в IIS), це буде ліворуч, де знаходиться DefaultApp, я сподіваюся, що у вас є, що я говорю
Harsh Baid

0

Мав каталог з тим же ім'ям, що і файл, який я намагався записати, тому люди також можуть на це стежити.


0

Я зіткнувся з цією проблемою під час розвитку на своїй місцевій робочій станції.

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

Зрештою, відкрита ручка файлу, можливо, викликала проблеми.


0

У моєму випадку мені довелося додати Правило авторизації .NET для веб-сайту в IIS.

Я додав правило, щоб дозволити анонімним користувачам.

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


0

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


0

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

щось подібне, перш ніж викликати метод, який використовує папку

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

        if (!exists)
            System.IO.Directory.CreateDirectory("mypath");

0

Якщо ви отримуєте цю помилку під час завантаження файлів у піддомен і працюєте правильно у своєму localhost, то виконайте нижче дії

Рішення:

Панель Plesk

  • Увійдіть на панель Plesk. Виберіть свій домен Sub, який дає помилку.
  • Клацніть на налаштуваннях хостингу .
  • Виберіть Додаткові дозволи на запис / зміну та застосуйте.

CPanel

  • Я не впевнений у варіантах, доступних у CPanel. Але якщо ви дасте дозвіл директорії (у CPanel це повинно бути десятковий номер, як 777, 755), це вирішить помилку.

Детальніше дивіться тут

Причина помилки:

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

  • Отже, якщо ви надаєте дозвіл субдомену на доступ до дозволу на запис / зміну, це вирішить проблему.


0

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


0

Переконайтеся, що ваша мета в System.IO.Delete(string file)файлі, який існує. Можливо, у вашому коді помилка; як ви не передаєте правильне ім'я файлу методу, або ваша мета - папка. У цих випадках ви побачите: "у доступі до шляху відхилено помилку".


-1

Я створив віртуальний редактор з повним дозволом і додав туди джерело та відеофайли ffmpeg, тож нарешті це мало сенс, оскільки це може отримати будь-хто.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.