Truy cập vào đường dẫn bị từ chối


164

Tôi biết câu hỏi này đã được hỏi nhiều lần ở đây, nhưng tôi không thể tìm ra giải pháp cho vấn đề của mình. Tôi đang cố lưu hình ảnh vào thư mục trong .net c # nhưng nhận được ngoại lệ này:

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)

Tôi đã trao toàn quyền kiểm soát thư mục này (lưu trữ) network serviceiis_iusrsthậm chí còn kiểm soát hoàn toàn everyonenhưng vẫn nhận được ngoại lệ này. Tôi đã cố gắng cấp quyền truy cập qua explorer và qua trình quản lý IIS, vẫn không gặp may

Tôi đang làm điều đó trên máy chủ Windows 2008 R2 và IIS 7.5, Tôi cần ai cấp quyền truy cập?

Cảm ơn


Bạn đã thử sử dụng một đường dẫn liên quan đến ứng dụng của bạn chưa? Tôi không biết nhiều về máy chủ Windows, nhưng có thể nó không cho phép truy cập vào đường dẫn gốc `C:`.
Michael K

1
Độc giả tương lai: Kiểm tra quyền trên tệp.
Ruskin

Câu trả lời:


94

Bạn cần tìm hiểu từ nhóm ứng dụng cho trang web, danh tính mà nó đang chạy (theo mặc định là gì Application Pool Identity) và cấp các quyền chính xác.


Ok, cảm ơn, tôi có 5 nhóm, tất cả đều có danh tính ApplicationPoolIdentity, làm cách nào để tôi cấp quyền cho nó?
Burjua

22
@Burjua - tìm kiếm IIS APPPOOL\DefaultAppPoolngười dùng. Xem bài viết này trên trang web IIS chính thức: learn.iis.net/page.aspx/624/application-pool-identities
Oded

1
Ok, như được viết trong bài viết này, tôi đã thêm DefaultAppPoolvà cấp full controlquyền cho nó, nhưng vẫn nhận được cùng một lỗi
Burjua

2
Tôi biết tôi đã quá muộn. Nhưng tôi đang đối mặt với cùng một vấn đề. OP đã đề cập rõ ràng rằng ông đã trao everyonetoàn quyền kiểm soát. Nếu chúng ta cấp everyonetoàn quyền kiểm soát, thậm chí sau đó chúng ta cần cấp quyền truy cập vào DefaultAppPool? Thật khó hiểu.
qurban

3
@stom - tất nhiên đó không phải là cách thực hành tốt nhất. Bạn đang mở trang web cho tất cả các loại lỗ hổng. Bạn chỉ muốn quyền đọc / ghi vào Imagesthư mục cho người dùng / danh tính đang chạy trang web (bạn sẽ cần hỏi nhà cung cấp máy chủ của mình về điều đó).
Oded

223

Truy cập vào đường dẫn 'C: \ inetpub \ wwwroot \ mysite \ hình ảnh \ savehere' bị từ chối

Đọc tin nhắn cẩn thận. Bạn đang cố lưu vào một tệp có cùng tên với thư mục. Điều đó không thể làm việc, bạn không thể ghi đè lên một thư mục chứa đầy các tệp với một tệp mới. Điều đó sẽ gây mất dữ liệu không thể nhận ra, "Truy cập vào đường dẫn bị từ chối" là hệ thống tệp chống lại để ngăn chặn điều đó xảy ra.

Thông báo ngoại lệ không lý tưởng, nhưng nó xuất phát trực tiếp từ HĐH và chúng được đúc bằng đá. Khung thường bổ sung các kiểm tra bổ sung để tạo thông điệp tốt hơn, nhưng đây là một thử nghiệm đắt tiền trên mạng. Perf là ​​một tính năng quá.

Bạn cần sử dụng một tên như 'C: \ inetpub \ wwwroot \ mysite \ hình ảnh \ savehere \ mumble.jpg'. Xem xét Path.Combine () để tạo tên đường dẫn một cách đáng tin cậy.


19
@Hans Passant Cảm ơn bạn, một chút khắc nghiệt, tuyên bố. Điều đó khiến tôi nhìn vào mã của mình nhận ra tôi đã mắc lỗi tương tự.
LosManos

Đối với tôi, vấn đề là tập tin đã tồn tại và người dùng có thể thay thế nó
VinnyG

Hừ! Tôi đã làm điều tương tự.
jakejgordon

Có lẽ chủ đề này nên được khóa để bảo vệ chống lại "Tôi cũng vậy!" câu trả lời. Vì tôi cũng vậy! Trong trường hợp của tôi, tôi nên thêm rằng tôi cảm thấy khó chịu khi phương thức SaveAs của đối tượng HttpPostedFileBase yêu cầu một tên ngoài đường dẫn, coi tên đó là một thuộc tính khác trên đối tượng. Tất nhiên tôi đoán bạn có thể đặt cho nó một cái tên khác theo cách này.
Ralph

1
Tôi đã gặp lỗi này trong khi cố gắng viết một tệp trong bài kiểm tra đơn vị (không liên quan gì đến IIS hoặc bất kỳ điều gì liên quan đến web) và thông báo lỗi rất mơ hồ. Tại sao nó không nói điều gì đó trong số các dòng "Không thể mở \ path \ to \ file dưới dạng tệp"?
MarioDS

22

Tôi đã gặp vấn đề tương tự trong khi cố gắng tạo một tệp trên máy chủ (thực ra là một tệp là bản sao từ một mẫu).

Đây là thông báo lỗi hoàn chỉnh:

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

Tôi đã thêm một thư mục mới được gọi Templatestrong thư mục ứng dụng IIS. Một điều rất quan trọng trong trường hợp của tôi là tôi cần phải cấp quyền Viết (Gravar) cho người dùng IUSR trên thư mục đó. Bạn cũng có thể cần phải cung cấp Network ServiceASP.NET v$.#cho phép Viết tương tự.

nhập mô tả hình ảnh ở đây

Sau khi làm điều này mọi thứ hoạt động như mong đợi.


12

Tôi đã có cùng vấn đề y hệt.

Giải pháp là tập tin tôi đang cố truy cập chỉ đọc , vì nó được sao chép từ tập tin mẫu chỉ đọc.

<facepalm />


Lớp ứng dụng Altova AltovaXML (DCOM) đang làm điều này. Gây ra vấn đề cho tôi.
Mike D

Ý tôi là, nó phải được sử dụng một cái gì đó tương tự như dòng sau, có nghĩa là XSLT không được đọc. 'FileStream ms = new FileStream (đường dẫn, FileMode.Open, FileAccess.ReadWrite);'
Mike D

1
Đây cũng là một <facepalm /> từ tôi. Oh và .. Cảm ơn, chỉ đọc cũng là vấn đề của tôi.
Cătălin Rădoi

7

Tôi gặp vấn đề này khi tôi cố lưu tệp mà không đặt tên tệp.

Mã cũ

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

Mã làm việc

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

6

Vấn đề của tôi là tôi phải yêu cầu quyền truy cập Đọc:

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

1
Bingo - cái này cũng cắn tôi! Cảm ơn vì bài đăng!
paulsm4

4

Danh tính nào là Nhóm ứng dụng của bạn cho ứng dụng Web đang chạy, để khắc phục sự cố, hãy thử tạo Nhóm ứng dụng mới với dịch vụ mạng như nhận dạng của nó và làm cho ứng dụng web của bạn sử dụng Nhóm ứng dụng mới mà bạn đã tạo và xem lỗi có còn không.


4

Mẹo sau đây không phải là câu trả lời cho câu hỏi ban đầu của chủ đề này, nhưng có thể giúp một số người dùng khác kết thúc trên trang web này, sau khi mắc phải một lỗi ngu ngốc tương tự tôi vừa làm ...

Tôi đã cố gắng để có được một điều khiển FileUpload của ASP.Net để tải tệp của nó lên một địa chỉ mạng có chứa " chia sẻ ẩn ", cụ thể là:

\ MyNetworkServer \ c $ \ someDirectoryOrOther

Tôi đã không hiểu nó. Nếu tôi chạy trang web ở chế độ Gỡ lỗi trong Visual Studio, nó sẽ hoạt động tốt. Nhưng khi dự án được triển khai và đang chạy thông qua một người dùng Application Pool, nó đã từ chối tìm thư mục mạng này.

Tôi đã kiểm tra người dùng nào mà trang IIS của tôi đang chạy, cung cấp cho người dùng này toàn quyền đối với thư mục này trên máy chủ " MyNetworkServer ", v.v., nhưng không có gì hoạt động.

Lý do (tất nhiên!) Là chỉ Quản trị viên mới có thể "nhìn thấy" các chia sẻ ổ đĩa ẩn này.

Giải pháp của tôi chỉ đơn giản là tạo ra một chia sẻ "bình thường" để

\ MyNetworkServer \ someDirectoryOrOther

và điều này đã thoát khỏi lỗi "Truy cập vào đường dẫn ... bị từ chối". FileUpload đã có thể chạy thành công lệnh

fileUpload.SaveAs(networkFilename);

Hy vọng điều này sẽ giúp một số người dùng khác mắc lỗi tương tự tôi đã làm!

Cũng lưu ý rằng nếu bạn đang tải lên các tệp lớn (trên 4Mb), thì IIS7 yêu cầu bạn sửa đổi tệp web.config ở hai vị trí. Nhấp vào liên kết này để đọc những gì bạn cần làm: Tải lên các tệp lớn trong ASP.Net


4

vui lòng thêm quyền kiểm soát đầy đủ IIS_IUSERS vào thư mục của bạn. bạn tìm thấy tùy chọn này từ tab bảo mật trong thuộc tính thư mục. tìm tùy chọn này và người dùng trong hình ảnh này


Lời khuyên tệ. Tự ý trao cho IIS_USERS "toàn quyền" - mà không cần xem xét cẩn thận - là tương đương về mặt đạo đức khi nói "Y tá - cưa máy";)
paulsm4

4

Tôi đã giải quyết với cài đặt này:

IIS> Nhóm ứng dụng> [trang web của bạn]> Cài đặt nâng cao ...> Danh tính> Tích hợp tích hợp> LocalSystem


2
Điều này mang lại cho trang web LocalAdmin quyền của bạn. Đây là một mối quan tâm an ninh.
Rich-Lang

1
KHÔNG ĐƯỢC chạy trang web của bạn dưới tài khoản LocalSystem. KHÔNG BAO GIỜ. GIAI ĐOẠN = STAGE.
Mihail Shishkov

@MihailShishkov tại sao?
Mohammad Hossein Ganjyar

2
@MohammadHosseinGanjyar LocalSystem có quyền quản trị trên hệ thống. Bằng cách chạy trang web trong tài khoản đó, về cơ bản, bạn cung cấp cho nó các khóa cho toàn bộ hệ thống và có thể là toàn bộ mạng cục bộ nơi máy chủ cư trú. Điều này có nghĩa là nếu kẻ tấn công tìm ra cách khai thác trang web của bạn - trang web và toàn bộ hệ thống bị vặn. Đó là lý do đặc quyền / quyền và tài khoản tồn tại ở nơi đầu tiên. Như một quy tắc của ngón tay cái hãy nhớ điều này - không có phần mềm nào nên chạy với các đặc quyền lớn hơn thì nó cần phải thực hiện công việc của mình. Ví dụ: trang blog không cần quyền định dạng D: drive
Mihail Shishkov

2

Vấn đề của tôi là một cái gì đó như thế:

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

nhưng thay vì sử dụng đường dẫn, tôi nên sử dụng File.FullName ... Tôi không biết liệu nó có giúp được ai khác không, chỉ cần truyền kinh nghiệm của riêng tôi với bản erro này!


2
  1. Thay đổi cài đặt từ tài khoản tích hợp thành tài khoản tùy chỉnh và nhập tên người dùng và mật khẩu của máy chủ khác.

  2. Giữ cài đặt dưới dạng tích hợp (thay vì chế độ cổ điển).


1

Có lẽ nó sẽ giúp bạn.

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

0

Hãy thư mục savehere là thư mục ảo và cung cấp cho đọc / ghi cho phép của bảng điều khiển


Run InetMgr.exe sau đó đi đến thư mục của bạn savehere dưới mysite (ứng dụng web / trang web trong IIS) nó sẽ đứng về phía tay trái nơi DefaultApp nằm, tôi hy vọng u got tôi đang nói
Harsh Baid

0

Có một thư mục cùng tên với tập tin tôi đang cố viết, vì vậy mọi người cũng có thể tìm ra nó.


0

Tôi gặp phải vấn đề này trong khi phát triển trên máy trạm cục bộ của tôi.

Sau nhiều lần iisresetgọi không thành công , tôi đã khắc phục tình trạng này bằng cách khởi động lại máy.

Nhìn lại, một xử lý tệp mở có thể đã gây ra vấn đề.


0

Trong trường hợp của tôi, tôi đã phải thêm một Quy tắc ủy quyền .NET cho trang web trong IIS.

Tôi đã thêm một quy tắc để cho phép người dùng ẩn danh.

Quy tắc ủy quyền .NET


0

Tôi gặp vấn đề tương tự nhưng tôi đã sửa nó bằng cách lưu tệp ở một vị trí khác và sau đó sao chép tệp và dán nó vào vị trí mà tôi muốn. Tôi đã sử dụng tùy chọn để thay thế các tập tin hiện có và điều đó đã giúp tôi. Tôi biết đây không phải là cách hiệu quả nhất nhưng nó hoạt động và mất ít hơn 15 giây.


0

Tôi đã gặp nhiều rắc rối với điều này, đặc biệt liên quan đến mã của tôi đang chạy cục bộ nhưng khi tôi cần chạy nó trên IIS thì nó đã bị lỗi này. Tôi thấy rằng việc thêm một kiểm tra vào mã của tôi và để ứng dụng tạo thư mục trong lần chạy đầu tiên đã khắc phục sự cố mà không phải làm phiền với các ủy quyền thư mục.

một cái gì đó như thế này trước khi bạn gọi phương thức của bạn sử dụng thư mục

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

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

0

Nếu bạn gặp lỗi này trong khi tải lên tệp trong Miền phụ và hoạt động chính xác trong của bạn localhost, thì hãy làm theo các bước dưới đây:

Giải pháp:

Bảng điều khiển Plesk

  • Đăng nhập vào Bảng điều khiển Plesk của bạn. Chọn tên miền phụ của bạn đang đưa ra lỗi.
  • Nhấp vào cài đặt Hosting .
  • Chọn quyền ghi / sửa đổi bổ sung và Áp dụng.

CPanel

  • Tôi không chắc chắn về các tùy chọn có sẵn trong CPanel. Nhưng NẾU bạn cấp quyền cho thư mục (Trong CPanel, nó phải là số thập phân như 777, 755) sẽ khắc phục lỗi.

Để biết thêm chi tiết tham khảo tại đây

Lý do lỗi:

  • Giả sử FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))sẽ là mã của bạn để di chuyển các tệp của bạn đến đường dẫn tải lên.
  • Server.MapPathsẽ cung cấp cho bạn đường dẫn vật lý (Real Path) của thư mục. Nhưng tên miền phụ của bạn có thể không có quyền truy cập đường dẫn vật lý.

  • Vì vậy, nếu bạn cấp quyền cho tên miền phụ truy cập quyền viết / sửa đổi, nó sẽ giải quyết vấn đề.


0

Bạn có thể thử kiểm tra xem các thuộc tính web của bạn cho dự án không chuyển sang IIS Express và thay đổi lại thành IIS Local


0

Hãy chắc chắn rằng mục tiêu của bạn System.IO.Delete(string file)là một tệp tồn tại. Có thể có lỗi trong mã của bạn; Giống như bạn không chuyển đúng tên tệp cho phương thức hoặc mục tiêu của bạn là một thư mục. Trong những trường hợp này, bạn sẽ thấy: "quyền truy cập vào đường dẫn bị từ chối lỗi".


-1

Tôi đã tạo một thư mục ảo với sự cho phép đầy đủ và thêm các tệp video và nguồn ffmpeg ở đó, vì vậy cuối cùng nó cũng có ý nghĩa vì nó có thể được chấp nhận bởi bất kỳ ai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.