拒绝访问路径


164

我知道这个问题在这里被问过很多次,但是我找不到解决问题的方法。我正在尝试将图像保存到.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 serviceiis_iusrs,甚至完全控制了该文件夹,everyone但仍然出现此异常。我试图通过资源管理器和IIS管理器授予访问权限,但还是没有运气

我正在Windows Server 2008 R2和IIS 7.5上执行此操作,需要授予谁访问权限?

谢谢


您是否尝试过使用相对于您的应用程序的路径?我对Windows服务器了解不多,但可能是因为它不允许访问`C:`根路径。
Michael K

1
将来的读者:检查文件权限。
罗斯金

Answers:


94

您需要从网站的应用程序池中找出网站正在运行的身份(默认是Application Pool Identity),并授予正确的权限。


好的,谢谢,我有5个池,它们都具有身份ApplicationPoolIdentity,我该如何赋予它权限?
2011年

22
@Burjua-寻找IIS APPPOOL\DefaultAppPool用户。看到这篇文章的官方IIS站点:learn.iis.net/page.aspx/624/application-pool-identities
奥德

1
好的,正如本文中所写,我对其进行了添加DefaultAppPool并授予了full control权限,但仍然出现相同的错误
Burjua 2011年

2
我知道我来晚了。但是我面临着同样的问题。OP明确提到他已经everyone完全控制了。如果我们授予everyone完全控制权,那么即使如此,我们也需要授予对DefaultAppPool?的访问权限。令人困惑。
2015年

3
@stom-当然,这不是最佳实践。您正在打开该网站的各种漏洞。您只需要Images对运行网站的用户/身份的目录具有读/写权限(您需要向主机提供商咨询)。
Oded

223

拒绝访问路径“ C:\ inetpub \ wwwroot \ mysite \ images \ savehere”

仔细阅读消息。您正在尝试保存到与目录同名的文件。那是行不通的,您不能用一个新文件覆盖一个充满文件的目录。这将导致无法诊断的数据丢失,文件系统在进行反击以防止这种情况发生,“对路径的访问被拒绝”。

异常消息不是很理想,但是它直接来自操作系统,并且是一成不变的。该框架通常会添加额外的检查以生成更好的消息,但这是对网络的昂贵测试。性能也是一个功能。

您需要使用类似“ C:\ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg”的名称。考虑Path.Combine()可靠地生成路径名。


19
@Hans Passant感谢您的苛刻声明。这使我查看我的代码,意识到我犯了同样的错误。
LosManos

对我来说,问题在于文件已存在,用户可以替换该文件
VinnyG 2012年

哈哈!我做了完全一样的事情。
jakejgordon 2013年

也许应该锁定此线程以防止“我也是!” 答案。因为我也是!在我的情况下,我应该补充说,我很烦恼HttpPostedFileBase对象的SaveAs方法除了路径之外还需要一个名称,因为该名称是对象的另一个属性。当然,我想您可以用这种方式给它起一个不同的名字。
拉尔夫

1
尝试在单元测试中写入文件时出现此错误(与IIS或任何与Web相关的无关),并且错误消息如此含糊。为什么在“无法将\ 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应用程序文件夹中添加了一个新文件夹。在我的情况下,一件非常重要的事情是我需要为该文件夹上的IUSR用户授予Write(Gravar)权限。您可能还需要授予Network ServiceASP.NET v$.#相同的Write权限。

在此处输入图片说明

完成此操作后,一切都会按预期进行。


12

我有完全一样的问题。

解决方案是,我尝试访问的文件是readonly,因为它是从只读模板文件中复制的。

<facepalm />


Altova AltovaXML应用程序类(DCOM)正在执行此操作。给我造成了问题。
Mike D

我的意思是,它必须使用类似于下一行的内容,这意味着XSLT不能为只读。“ FileStream ms =新的FileStream(路径,FileMode.Open,FileAccess.ReadWrite);”
Mike D

1
这也是我的<facepalm />。哦,..谢谢,只读也是我的问题。
克特林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

要对作为运行方式的Web应用程序运行的应用程序池使用什么标识,要进行故障排除,请尝试使用“网络服务”作为标识来创建一个新的应用程序池,并使您的Web应用程序使用您创建的新应用程序池,并查看错误是否仍然存在。


4

以下提示不能解决该线程的原始问题,但是在犯了我刚才做的同样愚蠢的错误之后,可能会帮助最终进入此网页的其他用户...

我试图获得一个ASP.Net FileUpload控件,将其文件上传到包含“ 隐藏共享 ” 的网络地址,即:

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

我听不懂 如果我在Visual Studio中以“调试”模式运行网页,则可以正常工作。但是,在部署项目并通过应用程序池用户运行该项目时,它拒绝找到该网络目录。

我已经检查了我的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 '19

2
@MohammadHosseinGanjyar LocalSystem具有对系统的管理员权限。通过使用该帐户运行网站,您基本上可以将其提供给整个系统以及服务器所在的整个本地网络的密钥。这意味着,如果攻击者找到了一种利用您的网站的方法,则该网站和整个系统都会被搞砸。这就是特权/权利和帐户首先存在的原因。作为一个经验法则,请记住-没有软件可以以更高的权限运行,而不需要其工作。例如,博客网站不需要格式化D:drive的权利
Mihail Shishkov

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中的Web应用程序/网站)下的文件夹savehere,它将位于DefaultApp所在的左侧,我希望您能告诉我
Harsh Baid

0

有一个与我要编写的文件同名的目录,因此人们也可以注意这一点。


0

在本地工作站上开发时遇到了此问题。

在几次失败的iisreset调用之后,我通过重新启动纠正了这种情况计算机来。

回想起来,打开的文件句柄可能已引起问题。


0

以我为例,我必须为IIS中的网站添加.NET授权规则。

我添加了一个规则,允许匿名用户。

.NET授权规则


0

我遇到了同样的问题,但是我通过将文件保存在其他位置然后将其复制并粘贴到我想要的位置来修复它。我使用该选项替换了现有文件,这为我成功了。我知道这不是最有效的方法,但是它可以工作并且不到15秒。


0

我对此有很多麻烦,特别是与在本地运行的代码有关,但是当我需要在IIS上运行它时会抛出此错误。我发现在代码中添加检查并让应用程序在第一次运行时创建文件夹,从而解决了该问题,而无需弄乱文件夹授权。

在调用使用该文件夹的方法之前,需要执行以下操作

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

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

0

如果在Sub域中上传文件并在中正常工作时遇到此错误,请执行localhost以下步骤:

解:

Plesk面板

  • 登录到您的Plesk面板。选择您的提供错误的子域。
  • 单击主机设置
  • 选择其他写/修改权限,然后应用。

面板

  • 我不确定CPanel中可用的选项。但是,如果您授予目录权限(在CPanel中,它必须是十进制数字,例如777、755)将解决该错误。

有关更多详细信息,请参见此处

错误原因:

  • 让我们假设FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))您的代码将文件移至上传路径。
  • Server.MapPath将为您提供目录的物理路径(Real Path)。但是您的Sub域可能没有访问物理路径的权限。

  • 因此,如果您授予子域访问写/修改权限的权限,它将解决此问题。


0

您可以尝试检查项目的Web属性是否未切换到IIS Express,然后将其更改回IIS Local。


0

确保您的目标System.IO.Delete(string file)是存在的文件。也许您的代码有误;就像您没有将正确的文件名传递给方法一样,或者您的目标是文件夹。在这些情况下,您会看到:“拒绝访问路径错误”。


-1

我创建了一个具有完全权限的虚拟目录,并在其中添加了ffmpeg源文件和视频文件,因此最终它变得有意义,因为任何人都可以访问它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.