การเข้าถึงพา ธ ถูกปฏิเสธ


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:`
Michael K

1
ผู้อ่านในอนาคต: ตรวจสอบการอนุญาตในไฟล์
Ruskin

คำตอบ:


94

คุณต้องค้นหาข้อมูลจากกลุ่มแอปพลิเคชันสำหรับเว็บไซต์ว่ามีการทำงานอย่างไร (โดยค่าเริ่มต้นคือApplication Pool Identity) และให้สิทธิ์ที่ถูกต้อง


ตกลงขอบคุณฉันมี 5 พูลพวกเขาทั้งหมดมีตัวตนApplicationPoolIdentityฉันจะให้สิทธิ์ได้อย่างไร
Burjua

22
@Burjua - มองหาIIS APPPOOL\DefaultAppPoolผู้ใช้ ดูบทความนี้ในเว็บไซต์ IIS อย่างเป็นทางการ: learn.iis.net/page.aspx/624/application-pool-identities
Oded

1
ตกลงตามที่เขียนในบทความนี้ฉันเพิ่มDefaultAppPoolและให้full controlสิทธิ์ แต่ก็ยังได้รับข้อผิดพลาดเดียวกัน
Burjua

2
ฉันรู้ว่าฉันสายเกินไป แต่ฉันกำลังเผชิญปัญหาเดียวกัน OP ได้กล่าวไว้อย่างชัดเจนว่าเขาได้ให้everyoneการควบคุมเต็มรูปแบบ หากเราให้everyoneการควบคุมเต็มรูปแบบแม้แล้วเราจำเป็นต้องให้สิทธิ์การเข้าถึงDefaultAppPool? มันสับสน
qurban

3
@stom - แน่นอนว่าไม่ใช่วิธีปฏิบัติที่ดีที่สุด คุณกำลังเปิดเว็บไซต์เพื่อหาช่องโหว่ทุกประเภท คุณเพียงแค่ต้องการให้อ่าน / เขียนสิทธิ์ในImagesไดเรกทอรีสำหรับผู้ใช้ / ข้อมูลประจำตัวที่ใช้เว็บไซต์ (คุณจะต้องถามผู้ให้บริการโฮสต์ของคุณเกี่ยวกับเรื่องนั้น)
Oded

223

การเข้าถึงพา ธ 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere' ถูกปฏิเสธ

อ่านข้อความอย่างระมัดระวัง คุณกำลังพยายามบันทึกไปยังไฟล์ที่มีชื่อเหมือนกับไดเรกทอรี ไม่สามารถใช้งานได้คุณไม่สามารถเขียนทับไดเรกทอรีที่เต็มไปด้วยไฟล์ด้วยไฟล์ใหม่เพียงไฟล์เดียว ที่จะทำให้สูญเสียข้อมูล undiagnosable "การเข้าถึงเส้นทางถูกปฏิเสธ" เป็นระบบไฟล์ต่อสู้กลับเพื่อป้องกันไม่ให้เกิดขึ้น

ข้อความยกเว้นไม่เหมาะ แต่มาโดยตรงจากระบบปฏิบัติการและพวกเขาถูกโยนในหิน กรอบมักจะเพิ่มการตรวจสอบพิเศษเพื่อสร้างข้อความที่ดีกว่า แต่นี่เป็นการทดสอบที่แพงในเครือข่าย Perf เป็นคุณสมบัติเช่นกัน

คุณต้องใช้ชื่อเช่น 'C: \ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg' พิจารณาPath.Combine ()เพื่อสร้างชื่อพา ธ ที่เชื่อถือได้


19
@Hans Passant ขอบคุณสำหรับคำสั่งของคุณ นั่นทำให้ฉันดูรหัสของฉันรู้ว่าฉันได้ทำผิดพลาดเหมือนกัน
LosManos

สำหรับฉันปัญหาคือไฟล์ที่มีอยู่และผู้ใช้สามารถ nout แทนที่มัน
VinnyG

ฮะ! ฉันทำสิ่งเดียวกันแน่นอน
jakejgordon

บางทีกระทู้นี้ควรถูกล็อคเพื่อป้องกัน "ฉันด้วย!" คำตอบ เพราะฉันเช่นกัน! ในกรณีของฉันฉันควรเพิ่มว่าฉันรำคาญว่าวิธีการ SaveAs ของวัตถุ HttpPostedFileBase ต้องใช้ชื่อนอกเหนือจากเส้นทางโดยพิจารณาว่าชื่อเป็นคุณสมบัติอื่นบนวัตถุ แน่นอนฉันคิดว่าคุณสามารถตั้งชื่ออื่นด้วยวิธีนี้
Ralph

1
ฉันได้รับข้อผิดพลาดนี้ในขณะที่พยายามเขียนไฟล์ในการทดสอบหน่วย (ไม่เกี่ยวข้องกับ IIS หรืออะไรก็ตามที่เกี่ยวข้องกับเว็บ) และข้อความแสดงข้อผิดพลาดนั้นคลุมเครือ ทำไมมันไม่พูดอะไรบางอย่างในบรรทัดของ "ไม่สามารถเปิด \ path \ to \ file เป็นไฟล์" ได้
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) กำลังทำสิ่งนี้อยู่ ทำให้ฉันมีปัญหา
Mike D

โดยที่ฉันหมายความว่ามันจะต้องใช้สิ่งที่คล้ายกับบรรทัดต่อไปนี้ความหมาย XSLT จะต้องไม่อ่านอย่างเดียว 'FileStream ms = ใหม่ FileStream (เส้นทาง, FileMode.Open, FileAccess.ReadWrite)'
Mike D

1
นี่คือ <facepalm /> จากฉันเช่นกัน โอ้และ .. ขอบคุณที่อ่านปัญหาของฉันด้วย
CătălinRă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

What Identity คือ Application Pool ของคุณสำหรับเว็บแอ็พพลิเคชันที่ทำงานเพื่อแก้ไขปัญหาลองสร้าง App Pool ใหม่ด้วย Network Service เป็นตัวระบุและทำให้เว็บแอปพลิเคชันของคุณใช้พูลแอพใหม่ที่คุณสร้างขึ้นและดูว่า


4

เคล็ดลับต่อไปนี้ไม่ใช่คำตอบสำหรับคำถามเดิมของเธรดนี้ แต่อาจช่วยให้ผู้ใช้รายอื่น ๆ ที่ลงเอยด้วยหน้าเว็บนี้หลังจากทำผิดพลาดแบบเดียวกับที่ฉันเพิ่งทำ ...

ฉันพยายามรับไฟล์ควบคุม ASP.Net เพื่ออัปโหลดไฟล์ไปยังที่อยู่เครือข่ายซึ่งมี "การแชร์ที่ซ่อนอยู่ " " คือ:

\ MyNetworkServer \ C $ \ SomeDirectoryOrOther

ฉันไม่เข้าใจ ถ้าฉันใช้เว็บเพจในโหมดดีบั๊กใน Visual Studio มันก็ใช้ได้ดี แต่เมื่อโครงการถูกปรับใช้และทำงานผ่านผู้ใช้ Application Pool ก็ปฏิเสธที่จะค้นหาไดเรกทอรีเครือข่ายนี้

ฉันได้ตรวจสอบผู้ใช้ไซต์ IIS ของฉันที่ทำงานภายใต้ให้สิทธิ์ผู้ใช้เต็มไปยังไดเรกทอรีนี้บนเซิร์ฟเวอร์ " MyNetworkServer " ฯลฯ ฯลฯ แต่ไม่มีอะไรทำงาน

เหตุผล (แน่นอน!) คือผู้ดูแลระบบเท่านั้นที่สามารถ "ดู" ไดรฟ์ที่ซ่อนอยู่เหล่านี้แบ่งปัน

โซลูชันของฉันเป็นเพียงการสร้างส่วนแบ่ง "ปกติ" ให้

\ MyNetworkServer \ SomeDirectoryOrOther

และนี่เป็นการกำจัดข้อผิดพลาด "การเข้าถึงเส้นทาง ... ถูกปฏิเสธ" FileUpload สามารถรันคำสั่งได้สำเร็จ

fileUpload.SaveAs(networkFilename);

หวังว่านี่จะช่วยผู้ใช้รายอื่นที่ทำผิดพลาดแบบเดียวกันกับที่ฉันทำ!

โปรดทราบด้วยว่าหากคุณกำลังอัปโหลดไฟล์ขนาดใหญ่ (มากกว่า 4Mb) แล้ว IIS7 กำหนดให้คุณแก้ไขไฟล์ web.config ในสองแห่ง คลิกที่ลิงค์นี้เพื่ออ่านสิ่งที่คุณต้องทำ: อัปโหลดไฟล์ขนาดใหญ่ใน ASP.Net


4

โปรดเพิ่มสิทธิ์การควบคุมเต็มรูปแบบ IIS_IUSERS ในโฟลเดอร์ของคุณ คุณพบตัวเลือกนี้จากแท็บความปลอดภัยในคุณสมบัติของโฟลเดอร์ หาตัวเลือกนี้และผู้ใช้ในภาพนี้


คำแนะนำที่ไม่ดี การให้ IIS_USERS "การควบคุมเต็มรูปแบบ" โดยไม่ใช้ความระมัดระวัง - เป็นคุณธรรมที่เทียบเท่ากับการพูดว่า "พยาบาล - คลั่ง";)
paulsm4

4

ฉันแก้ไขด้วยการตั้งค่านี้:

IIS> กลุ่มแอปพลิเคชัน> [ไซต์ของคุณ]> การตั้งค่าขั้นสูง ... > ข้อมูลประจำตัว> accound ในตัว> LocalSystem


2
นี่เป็นการให้สิทธิ์ LocalAdmin แก่เว็บไซต์ของคุณ นี่เป็นข้อกังวลด้านความปลอดภัย
Rich-Lang

1
อย่ารันเว็บไซต์ของคุณภายใต้บัญชี LocalSystem เคย. ระยะเวลา
Mihail Shishkov

@MihailShishkov ทำไม
Mohammad Hossein Ganjyar

2
@MohammadHosseinGanjyar LocalSystem มีสิทธิ์เป็นผู้ดูแลระบบ โดยการใช้เว็บไซต์ภายใต้บัญชีนั้นโดยทั่วไปแล้วคุณจะให้กุญแจแก่ระบบทั้งหมดและอาจเป็นเครือข่ายท้องถิ่นทั้งหมดที่เซิร์ฟเวอร์ตั้งอยู่ ซึ่งหมายความว่าหากผู้โจมตีพบวิธีการใช้ประโยชน์จากเว็บไซต์ของคุณ - เว็บไซต์และระบบทั้งหมดจะถูกทำให้เมา นั่นคือเหตุผลสิทธิ์ / สิทธิ์และบัญชีที่มีอยู่ในสถานที่แรก ตามกฎของหัวแม่มือจำไว้ว่า - ไม่ควรใช้ซอฟต์แวร์ใดที่มีสิทธิพิเศษมากขึ้นจากนั้นจะต้องทำงานของมัน ตัวอย่างเช่นเว็บไซต์บล็อกไม่จำเป็นต้องมีสิทธิ์ในการจัดรูปแบบ D: ไดรฟ์
Mihail Shishkov

2

ปัญหาของฉันคืออะไรเช่นนั้น:

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

แต่แทนที่จะใช้เส้นทางฉันควรใช้ File.FullName ... ฉันไม่รู้ว่ามันจะช่วยคนอื่นหรือเปล่าเพียงแค่ส่งประสบการณ์ของฉันเองกับ erro ที่ได้รับ!


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

ทำให้ไดเรกทอรีsavehereจะเป็นไดเรกทอรีเสมือนและให้การอ่าน / เขียนได้รับอนุญาตจากแผงควบคุม


เรียกใช้InetMgr.exeจากนั้นไปที่โฟลเดอร์ของคุณsavehereภายใต้mysite (เว็บแอปพลิเคชัน / เว็บไซต์ใน IIS) มันจะอยู่ทางด้านซ้ายมือซึ่งเป็นที่ตั้งของ DefaultApp ฉันหวังว่าคุณจะบอกฉัน
Harsh Baid

0

มีไดเรกทอรีโดยใช้ชื่อเดียวกับไฟล์ที่ฉันพยายามเขียนเพื่อให้ผู้คนสามารถมองหาสิ่งนั้นได้เช่นกัน


0

ฉันพบปัญหานี้ขณะพัฒนาบนเวิร์กสเตชันท้องถิ่นของฉัน

หลังจากiisresetการเรียกใช้ไม่สำเร็จหลายครั้งฉันแก้ไขสถานการณ์นี้โดยการรีบูตเครื่องเครื่อง

ในการหวนกลับจับไฟล์ที่เปิดอาจทำให้เกิดปัญหา


0

ในกรณีของฉันฉันต้องเพิ่ม. NET Authorization Rule สำหรับเว็บไซต์ใน IIS

ฉันเพิ่มกฎเพื่ออนุญาตผู้ใช้ที่ไม่ระบุชื่อ

. NET Authorization Rules


0

ฉันมีปัญหาเดียวกัน แต่ฉันแก้ไขโดยการบันทึกไฟล์ในตำแหน่งอื่นแล้วคัดลอกไฟล์และวางในตำแหน่งที่ฉันต้องการให้เป็น ฉันใช้ตัวเลือกเพื่อแทนที่ไฟล์ที่มีอยู่และนั่นก็เป็นเคล็ดลับสำหรับฉัน ฉันรู้ว่านี่ไม่ใช่วิธีที่มีประสิทธิภาพที่สุด แต่ใช้งานได้และใช้เวลาน้อยกว่า 15 วินาที


0

ฉันมีปัญหามากมายเกี่ยวกับสิ่งนี้โดยเฉพาะที่เกี่ยวข้องกับรหัสของฉันที่ทำงานอยู่ภายในเครื่อง แต่เมื่อฉันต้องการเรียกใช้บน IIS มันมีข้อผิดพลาดเกิดขึ้น ฉันพบว่าการเพิ่มการตรวจสอบรหัสของฉันและการอนุญาตให้แอปพลิเคชันสร้างโฟลเดอร์ในการเรียกใช้ครั้งแรกแก้ไขปัญหาโดยไม่ต้องยุ่งกับการอนุญาตโฟลเดอร์

บางอย่างเช่นนี้ก่อนที่คุณจะเรียกวิธีการของคุณที่ใช้โฟลเดอร์

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

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

0

หากคุณได้รับข้อผิดพลาดนี้ขณะอัพโหลดไฟล์ในโดเมนย่อยและทำงานถูกต้องในตัวคุณlocalhostให้ทำตามขั้นตอนด้านล่าง

สารละลาย:

แผง Plesk

  • เข้าสู่ระบบ Plesk Panel ของคุณ เลือกโดเมนย่อยของคุณซึ่งกำลังให้ข้อผิดพลาด
  • คลิกที่การตั้งค่าโฮสติ้ง
  • เลือกการอนุญาตเพิ่มเติมสำหรับการเขียน / แก้ไขและนำไปใช้

CPanel

  • ฉันไม่แน่ใจเกี่ยวกับตัวเลือกที่มีอยู่ใน CPanel แต่ถ้าคุณให้สิทธิ์ไดเรกทอรี (ใน CPanel จะต้องเป็นเลขทศนิยมเช่น 777, 755) เพื่อแก้ไขข้อผิดพลาด

สำหรับรายละเอียดเพิ่มเติมดูที่นี่

เหตุผลข้อผิดพลาด:

  • Let's สมมติว่าFileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))จะเป็นรหัสของคุณเพื่อย้ายไฟล์ของคุณไปยังเส้นทางการอัปโหลด
  • Server.MapPathจะให้เส้นทางทางกายภาพ (เส้นทางจริง) ของไดเรกทอรี แต่โดเมนย่อยของคุณอาจไม่ได้รับอนุญาตให้เข้าถึงทางกายภาพ

  • ดังนั้นหากคุณให้สิทธิ์สำหรับโดเมนย่อยในการเข้าถึงการอนุญาตให้เขียน / แก้ไขมันจะแก้ไขปัญหาได้


0

คุณสามารถลองตรวจสอบว่าคุณสมบัติเว็บของคุณสำหรับโครงการไม่ได้เปลี่ยนเป็น IIS Express และเปลี่ยนกลับเป็น IIS Local


0

ตรวจสอบให้แน่ใจว่าเป้าหมายของคุณSystem.IO.Delete(string file)คือไฟล์ที่มีอยู่ อาจมีข้อผิดพลาดในรหัสของคุณเช่นคุณไม่ส่งชื่อไฟล์ที่ถูกต้องไปยังวิธีการหรือเป้าหมายของคุณคือโฟลเดอร์ ในกรณีเหล่านี้คุณจะเห็น: "การเข้าถึงพา ธ ถูกปฏิเสธข้อผิดพลาด"


-1

ฉันสร้าง dir เสมือนจริงโดยได้รับอนุญาตอย่างเต็มรูปแบบและเพิ่ม ffmpeg source และไฟล์วิดีโอที่นั่นดังนั้นในที่สุดมันก็สมเหตุสมผลตามที่ทุกคนสามารถเข้าถึงได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.