Akses ke jalan ditolak

164

Saya tahu pertanyaan ini ditanyakan berkali-kali di sini, tetapi saya tidak dapat menemukan solusi untuk masalah saya. Saya mencoba menyimpan gambar ke folder di .net c # tetapi dapatkan pengecualian ini:

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)

Saya memberikan kontrol penuh ke folder ini (savehere) ke network servicedan iis_iusrs, bahkan memberikan kontrol penuh untuk everyonetetapi masih mendapatkan pengecualian ini. Saya mencoba memberikan akses melalui explorer dan melalui manajer IIS, masih tidak berhasil

Saya melakukannya di Windows server 2008 R2 dan IIS 7.5, Siapa yang harus saya beri akses?

Terima kasih

Burjua
sumber
Sudahkah Anda mencoba menggunakan jalur relatif ke aplikasi Anda? Saya tidak tahu banyak tentang server Windows, tetapi mungkin itu tidak mengizinkan akses ke jalur root `C:`.
Michael K
1
Pembaca masa depan: Periksa izin pada file.
Ruskin

Jawaban:

94

Anda perlu mencari tahu dari kumpulan aplikasi untuk situs web apa identitas itu berjalan di bawah (secara default ini Application Pool Identity) dan memberikan izin yang benar.

Oded
sumber
Ok, terima kasih, saya memiliki 5 kelompok, mereka semua memiliki identitas ApplicationPoolIdentity, bagaimana saya memberikan izin untuk itu?
Burjua
22
@ Burjua - cari IIS APPPOOL\DefaultAppPoolpengguna Lihat artikel ini di situs IIS resmi: learn.iis.net/page.aspx/624/aplikasi-pool-identities
Oded
1
Ok, seperti yang tertulis dalam artikel ini saya menambahkan DefaultAppPooldan memberikan full controlizin untuk itu, tetapi masih mendapatkan kesalahan yang sama
Burjua
2
Saya tahu saya terlambat. Tapi saya menghadapi masalah yang sama. OP jelas menyebutkan bahwa dia telah memberikan everyonekontrol penuh. Jika kita memberikan everyonekontrol penuh, itupun kita perlu memberikan akses DefaultAppPool? Ini membingungkan.
qurban
3
@stom - tentu saja itu bukan praktik terbaik. Anda membuka situs web untuk semua jenis kerentanan. Anda hanya ingin izin baca / tulis ke Imagesdirektori untuk pengguna / identitas yang menjalankan situs web (Anda perlu bertanya pada penyedia host Anda tentang itu).
Oded
223

Akses ke jalur 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere' ditolak

Baca pesan dengan cermat. Anda mencoba menyimpan ke file yang memiliki nama yang sama dengan direktori. Itu tidak bisa, Anda tidak bisa menimpa direktori yang diisi dengan file dengan satu file baru. Itu akan menyebabkan kehilangan data yang tidak dapat didiagnosis, "Akses ke jalur ditolak" adalah sistem file yang berusaha mencegah hal itu terjadi.

Pesan pengecualian tidak ideal, tetapi datang langsung dari OS dan mereka dilemparkan ke batu. Kerangka kerja ini sering menambahkan pemeriksaan tambahan untuk menghasilkan pesan yang lebih baik, tetapi ini merupakan tes mahal pada jaringan. Perf juga merupakan fitur.

Anda perlu menggunakan nama seperti 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg'. Pertimbangkan Path.Combine () untuk menghasilkan nama path dengan andal.

Hans Passant
sumber
19
@Hans Passant Terima kasih atas pernyataan Anda, agak kasar. Itu membuat saya melihat kode saya menyadari bahwa saya telah membuat kesalahan yang sama.
LosManos
bagi saya, masalahnya adalah bahwa file tersebut sudah ada dan pengguna tidak dapat menggantinya
VinnyG
Hah! Saya melakukan hal yang persis sama.
jakejgordon
Mungkin utas ini harus dikunci untuk melindungi dari "Aku juga!" jawaban. Karena aku juga! Dalam kasus saya, saya harus menambahkan bahwa saya kesal karena metode SaveAs objek HttpPostedFileBase memerlukan nama selain path, mengingat nama adalah properti lain pada objek. Tentu saja saya kira Anda bisa memberikan nama yang berbeda dengan cara ini.
Ralph
1
Saya mendapatkan kesalahan ini ketika mencoba menulis file dalam unit test (tidak ada hubungannya dengan IIS atau apa pun yang berhubungan dengan web), dan pesan kesalahannya sangat samar. Mengapa tidak mengatakan sesuatu di antara baris "Tidak dapat membuka \ path \ ke \ file sebagai file"?
MarioDS
22

Saya mengalami masalah yang sama ketika mencoba membuat file di server (sebenarnya file yang merupakan salinan dari templat).

Inilah pesan kesalahan lengkapnya:

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

Saya menambahkan folder baru yang disebut Templatesdi dalam folder aplikasi IIS. Satu hal yang sangat penting dalam kasus saya adalah bahwa saya perlu memberikan izin Tulis (Gravar) untuk pengguna IUSR pada folder itu. Anda mungkin juga perlu memberi Network Servicedan ASP.NET v$.#izin menulis yang sama.

masukkan deskripsi gambar di sini

Setelah melakukan ini semuanya berfungsi seperti yang diharapkan.

Leniel Maccaferri
sumber
12

Saya memiliki masalah yang persis sama.

Solusinya adalah file yang saya coba akses dibaca hanya , karena disalin dari file template yang hanya dibaca.

<facepalm />

Ruskin
sumber
Kelas Aplikasi Altova AltovaXML (DCOM) sedang melakukan ini. Menyebabkan saya masalah.
Mike D
Maksud saya, itu harus menggunakan sesuatu yang mirip dengan baris berikut, artinya XSLT tidak boleh dibaca saja. 'FileStream ms = FileStream baru (path, FileMode.Open, FileAccess.ReadWrite);'
Mike D
1
Ini adalah <facepalm /> dari saya juga. Oh dan .. Terima kasih, hanya baca masalah saya juga.
Cătălin Rădoi
7

Saya mendapat masalah ini ketika saya mencoba untuk menyimpan file tanpa menetapkan nama file.

Kode Lama

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

Kode Kerja

File.WriteAllBytes(@"E:\Folder\"+ fileName, Convert.FromBase64String(Base64String));
MarceloBarbosa
sumber
6

Masalah saya adalah saya harus meminta akses Baca saja:

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
jesal
sumber
1
Bingo - yang satu ini juga menggangguku! Terima kasih untuk kirimannya!
paulsm4
4

Apa Identitas adalah Pool Aplikasi Anda untuk aplikasi Web yang berjalan, untuk memecahkan masalah, coba buat App Pool baru dengan mengatakan Layanan Jaringan sebagai identitasnya dan buat aplikasi web Anda menggunakan App Pool baru yang Anda buat dan lihat apakah kesalahannya masih ada.

Ta01
sumber
4

Kiat berikut bukan jawaban untuk pertanyaan asli utas ini, tetapi mungkin membantu beberapa pengguna lain yang berakhir di laman web ini, setelah melakukan kesalahan bodoh yang sama yang baru saja saya lakukan ...

Saya mencoba untuk mendapatkan kontrol ASP.Net FileUpload untuk mengunggah file itu ke alamat jaringan yang berisi " bagian tersembunyi ", yaitu:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

Saya tidak memahaminya. Jika saya menjalankan halaman web dalam mode Debug di Visual Studio, itu akan berfungsi dengan baik. Tetapi ketika proyek dikerahkan, dan berjalan melalui pengguna Application Pool, ia menolak untuk menemukan direktori jaringan ini.

Saya telah memeriksa pengguna mana yang menjalankan situs IIS saya, memberikan pengguna ini izin penuh ke direktori ini di server " MyNetworkServer ", dll, tetapi tidak ada yang berhasil.

Alasannya (tentu saja!) Adalah hanya Administrator yang dapat "melihat" share drive tersembunyi ini.

Solusi saya adalah dengan membuat saham "normal"

\ MyNetworkServer \ SomeDirectoryOrOther

dan ini menghilangkan kesalahan "Akses ke jalan ... ditolak". FileUpload berhasil menjalankan perintah

fileUpload.SaveAs(networkFilename);

Semoga ini bisa membantu beberapa pengguna lain yang membuat kesalahan yang sama saya lakukan!

Perhatikan juga bahwa jika Anda mengunggah file besar (lebih dari 4 MB), maka IIS7 mengharuskan Anda memodifikasi file web.config di dua tempat. Klik tautan ini untuk membaca apa yang perlu Anda lakukan: Mengunggah file besar di ASP.Net

Mike Gledhill
sumber
4

harap tambahkan IIS_IUSERS izin kontrol penuh ke folder Anda. Anda menemukan opsi ini dari tab keamanan di properti folder. temukan opsi ini dan pengguna di gambar ini

Ali Rasouli
sumber
Saran yang buruk. Sewaktu memberikan IIS_USERS "kendali penuh" secara sewenang-wenang - tanpa pertimbangan yang hati-hati - sama dengan mengatakan "Perawat - gergaji";)
paulsm4
4

Saya Selesaikan dengan pengaturan ini:

IIS> Kumpulan Aplikasi> [situs Anda]> Pengaturan Lanjut ...> Identitas> Akses internal> Sistem Lokal

Mohammad Hossein Ganjyar
sumber
2
Ini memberi Anda izin LocalAdmin Situs Web. Ini adalah masalah keamanan.
Rich-Lang
1
JANGAN PERNAH menjalankan situs web Anda di bawah akun LocalSystem. PERNAH. TITIK.
Mihail Shishkov
@MihailShishkov mengapa?
Mohammad Hossein Ganjyar
2
@MohammadHosseinGanjyar LocalSystem memiliki hak admin atas sistem. Dengan menjalankan situs web di bawah akun itu, pada dasarnya Anda memberikan kunci ke seluruh sistem dan mungkin seluruh jaringan lokal tempat server berada. Ini berarti bahwa jika penyerang menemukan cara untuk mengeksploitasi situs web Anda - situs web dan seluruh sistem kacau. Itulah alasan hak istimewa / hak dan akun ada di tempat pertama. Sebagai aturan praktis, ingat ini - tidak ada perangkat lunak yang harus dijalankan dengan hak istimewa yang lebih besar maka perlu melakukan tugasnya. Misalnya situs blog tidak perlu hak untuk memformat D: drive
Mihail Shishkov
2

Masalah saya adalah sesuatu seperti itu:

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

tetapi alih-alih menggunakan jalur saya harus menggunakan File.FullName ... Saya tidak tahu apakah itu akan membantu orang lain, hanya melewati pengalaman saya sendiri dengan erro yang diberikan ini!

Tarcísio Luna
sumber
2
  1. Ubah pengaturan dari akun bawaan ke akun khusus dan masukkan nama pengguna dan kata sandi server lain.

  2. Biarkan pengaturan sebagai terintegrasi (bukan mode klasik).

uday
sumber
1

Mungkin itu akan membantumu.

string tempDirectoryPath = @"C:\Users\HOPE\Desktop\Test Folder";
string zipFilePath = @"C:\Users\HOPE\Desktop\7za920.zip";
Directory.CreateDirectory(tempDirectoryPath);
ZipFile.ExtractToDirectory(zipFilePath, tempDirectoryPath);
umutcakar
sumber
0

Buat Direktori savehere menjadi direktori virtual dan berikan izin baca / tulis dari panel kontrol

Harsh Baid
sumber
Jalankan InetMgr.exe kemudian pergi ke folder savehere di bawah mysite (aplikasi web / situs web di IIS) itu akan berada di sisi kiri di mana DefaultApp berada, saya harap Anda dapat mengatakannya
Harsh Baid
0

Punya direktori dengan nama yang sama dengan file yang saya coba tulis, jadi orang-orang juga bisa melihatnya.

Samuel
sumber
0

Saya mengalami masalah ini saat berkembang di workstation lokal saya.

Setelah beberapa iisresetdoa yang gagal , saya memperbaiki situasi ini dengan me - reboot mesin saya.

Dalam retrospeksi, pegangan file terbuka mungkin telah menyebabkan masalah.

Jim G.
sumber
0

Dalam kasus saya, saya harus menambahkan .NET Authorization Rule untuk situs web di IIS.

Saya menambahkan aturan untuk mengizinkan pengguna anonim.

Aturan Otorisasi NET

GerardBeckerleg
sumber
0

Saya memiliki masalah yang sama tetapi saya memperbaikinya dengan menyimpan file di lokasi yang berbeda dan kemudian menyalin file dan menempelkannya di lokasi di mana saya menginginkannya. Saya menggunakan opsi untuk mengganti file yang ada dan yang melakukan trik untuk saya. Saya tahu ini bukan cara yang paling efisien tetapi bekerja dan membutuhkan waktu kurang dari 15 detik.

Samuel Nde
sumber
0

Saya punya banyak masalah dengan ini, khususnya terkait dengan kode saya yang berjalan secara lokal tetapi ketika saya harus menjalankannya di IIS itu adalah melemparkan kesalahan ini. Saya menemukan bahwa menambahkan tanda centang pada kode saya dan membiarkan aplikasi membuat folder saat pertama kali menyelesaikan masalah tanpa harus mengacaukan folder dengan otorisasi.

sesuatu seperti ini sebelum Anda memanggil metode Anda yang menggunakan folder

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

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

Jika Anda mendapatkan kesalahan ini saat mengunggah file di Sub domain dan berfungsi dengan benar di Anda localhost, ikuti langkah-langkah di bawah ini:

Larutan:

Panel Plesk

  • Masuk ke Panel Plesk Anda. Pilih Sub domain Anda yang memberikan kesalahan.
  • Klik pada pengaturan Hosting .
  • Pilih izin tulis / modifikasi tambahan dan Terapkan.

CPanel

  • Saya tidak yakin tentang opsi yang tersedia di CPanel. Tetapi JIKA Anda memberikan izin ke direktori (Dalam CPanel itu harus angka desimal seperti 777, 755) akan menyelesaikan kesalahan.

Untuk lebih jelasnya lihat di sini

Alasan Kesalahan:

  • Mari Asumsikan FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))akan menjadi kode Anda untuk memindahkan file Anda ke jalur unggah.
  • Server.MapPathakan memberi Anda path fisik (Real Path) dari direktori. Tetapi Sub domain Anda mungkin tidak memiliki izin untuk mengakses jalur fisik.

  • Jadi, Jika Anda memberikan izin kepada sub domain untuk mengakses izin menulis / memodifikasi, itu akan menyelesaikan masalah.

Guruprasad Bhat
sumber
0

Anda dapat mencoba memeriksa apakah properti web Anda untuk proyek tidak beralih ke IIS Express dan mengubahnya kembali ke IIS Lokal

AMykowski
sumber
0

Pastikan Anda bahwa target Anda System.IO.Delete(string file)adalah file yang ada. Mungkin ada kesalahan dalam kode Anda, seperti Anda tidak memberikan nama file yang benar ke metode, atau target Anda adalah folder. Dalam kasus ini Anda akan melihat: "akses ke jalan ditolak kesalahan".

Mohammad Yoosefiyan
sumber
-1

Saya membuat dir virtual dengan izin penuh dan menambahkan sumber ffmpeg dan file video di sana, jadi akhirnya masuk akal karena dapat diakses oleh siapa saja.

Kamila
sumber