访问路径被拒绝
Posted
技术标签:
【中文标题】访问路径被拒绝【英文标题】:Access to the path is denied 【发布时间】:2011-02-02 17:33:47 【问题描述】:我正在尝试将图像保存到 .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 service
和iis_iusrs
,甚至完全控制给everyone
,但仍然得到这个异常。
我尝试通过资源管理器和 IIS 管理器授予访问权限,但仍然没有成功
我在 Windows server 2008 R2 和 IIS 7.5 上执行此操作,我需要向谁授予访问权限?
【问题讨论】:
您是否尝试过使用相对于您的应用程序的路径?我对 Windows 服务器了解不多,但可能是它不允许访问 `C:` 根路径。 未来读者:检查文件的权限。 【参考方案1】:拒绝访问路径“C:\inetpub\wwwroot\mysite\images\savehere”
仔细阅读邮件。您正在尝试保存到与目录同名的文件。这是行不通的,你不能用一个新文件覆盖一个充满文件的目录。这将导致无法诊断的数据丢失,“访问路径被拒绝”是文件系统反击以防止这种情况发生。
异常消息并不理想,但它直接来自操作系统并且它们是一成不变的。该框架通常会添加额外的检查以生成更好的消息,但这是在网络上进行的一项昂贵的测试。性能也是一个功能。
您需要使用类似“C:\inetpub\wwwroot\mysite\images\savehere\mumble.jpg”的名称。考虑Path.Combine() 可靠地生成路径名。
【讨论】:
@Hans Passant 感谢您的有点苛刻的声明。这让我查看了我的代码,意识到我犯了同样的错误。 对我来说,问题是文件已存在,用户无法替换它 哈!我做了同样的事情。 也许这个帖子应该被锁定以防止“我也是!”答案。因为我也是!就我而言,我应该补充一点,我很生气 HttpPostedFileBase 对象的 SaveAs 方法除了路径之外还需要一个名称,考虑到名称是对象的另一个属性。当然我想你可以这样给它起一个不同的名字。 我在单元测试中尝试编写文件时遇到此错误(与 IIS 或任何与 Web 相关的内容无关),并且错误消息so 含糊不清。为什么在“Cannot open \path\to\file as a file”这行中没有说什么?【参考方案2】:您需要从网站的应用程序池中找出它正在运行的身份(默认为Application Pool Identity
)并授予正确的权限。
【讨论】:
好的,谢谢,我有 5 个池,它们的身份都是ApplicationPoolIdentity
,我该如何授予它权限?
@Burjua - 寻找IIS APPPOOL\DefaultAppPool
用户。在 IIS 官方网站上查看这篇文章:learn.iis.net/page.aspx/624/application-pool-identities
好的,如本文所述,我添加了DefaultAppPool
并授予full control
权限,但仍然出现相同的错误
我知道我来不及了。但我面临同样的问题。 OP 清楚地提到他已经给了everyone
完全控制权。如果我们授予everyone
完全控制权,即使这样我们也需要授予DefaultAppPool
的访问权限?令人困惑。
@stom - 当然这不是最佳实践。您正在向各种漏洞打开网站。您只需要运行网站的用户/身份对 Images
目录的读/写权限(您需要询问您的主机提供商)。【参考方案3】:
我在尝试在服务器上创建文件(实际上是从模板复制的文件)时遇到了同样的问题。
这是完整的错误信息:
ERROR 08/07/2012 22:15:58 - System.UnauthorizedAccessException: Access to the path 'C:\inetpub\wwwroot\SAvE\Templates\Cover.pdf' is denied.
我在 IIS 应用程序文件夹中添加了一个名为 Templates
的新文件夹。就我而言,一件非常重要的事情是我需要为该文件夹上的 IUSR 用户授予写入(Gravar)权限。您可能还需要授予Network Service
和ASP.NET v$.#
相同的写入权限。
完成此操作后,一切都按预期工作。
【讨论】:
【参考方案4】:我遇到了完全相同的问题。
解决方案是我尝试访问的文件是只读,因为它是从只读模板文件复制而来的。
【讨论】:
Altova AltovaXML 应用程序类 (DCOM) 正在执行此操作。给我带来了麻烦。 我的意思是,它必须使用类似于以下行的内容,这意味着 XSLT 不能是只读的。 'FileStream ms = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);' 这也是我的当我尝试在不设置文件名的情况下保存文件时遇到了这个问题。
旧代码
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);
【讨论】:
宾果游戏——这也是我的!谢谢你的帖子!【参考方案7】:我解决了这个设置:
IIS > 应用程序池 > [您的站点] > 高级设置... > 身份 > 内置帐户 > 本地系统
【讨论】:
这是授予您的网站 LocalAdmin 权限。这是一个安全问题。 永远不要在 LocalSystem 帐户下运行您的网站。曾经。期间。 @MihailShishkov 为什么? @MohammadHosseinGanjyar LocalSystem 拥有系统管理员权限。通过在该帐户下运行网站,您基本上可以将整个系统以及服务器所在的整个本地网络的密钥提供给它。这意味着,如果攻击者找到了利用您网站的方法 - 网站和整个系统都会被搞砸。这就是特权/权利和帐户首先存在的原因。根据经验,请记住这一点 - 任何软件都不应以更高的权限运行,然后才能完成其工作。例如博客网站不需要格式化 D:drive 此答案建议引入安全漏洞并应删除。【参考方案8】:您的 Web 应用程序运行的应用程序池是什么身份,要进行故障排除,请尝试使用网络服务作为其身份创建一个新的应用程序池,并让您的 Web 应用程序使用您创建的新应用程序池,然后查看错误是否仍然存在.
【讨论】:
【参考方案9】:以下提示不是对该线程原始问题的回答,但可能会帮助一些最终访问此网页的其他用户,在犯了我刚刚犯的同样愚蠢的错误之后......
我试图让 ASP.Net FileUpload 控件将其文件上传到包含“隐藏共享”的网络地址,即:
\MyNetworkServer\c$\SomeDirectoryOrOther
我不明白。如果我在 Visual Studio 中以调试模式运行网页,它会正常工作。但是当项目被部署并通过应用程序池用户运行时,它拒绝找到这个网络目录。
我检查了我的 IIS 站点在哪个用户下运行,并授予该用户对“MyNetworkServer”服务器上该目录的完全权限等,但没有任何效果。
原因(当然!)是只有管理员才能“看到”这些隐藏的驱动器共享。
我的解决方案是简单地创建一个“普通”共享来
\MyNetworkServer\SomeDirectoryOrOther
这消除了“访问路径...被拒绝”错误。 FileUpload 能够成功运行命令
fileUpload.SaveAs(networkFilename);
希望这可以帮助一些犯同样错误的其他用户!
另请注意,如果您要上传大文件(超过 4Mb),则 IIS7 要求您在 两个 位置修改 web.config 文件。单击此链接以阅读您需要做的事情: Uploading large files in ASP.Net
【讨论】:
【参考方案10】:请为您的文件夹添加 IIS_IUSERS 完全控制权限。 您可以从文件夹属性的安全选项卡中找到此选项。
【讨论】:
不好的建议。任意给予 IIS_USERS“完全控制权” - 没有仔细考虑 - 相当于说“护士 - 电锯”;)【参考方案11】:就我而言,我正在尝试访问一个设置为只读的文件
我通过禁用只读解决了它并修复了它!
希望它对遇到像我这样的情况有所帮助。
【讨论】:
【参考方案12】:我的问题是这样的:
FileStream ms = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
但我应该使用 File.FullName 而不是使用路径... 我不知道它是否会帮助其他人,只是通过我自己的经验来解决这个错误!
【讨论】:
【参考方案13】:将设置从内置帐户更改为自定义帐户并输入其他服务器的用户名和密码。
将设置保持为集成(而不是经典模式)。
【讨论】:
【参考方案14】:也许它会帮助你。
string tempDirectoryPath = @"C:\Users\HOPE\Desktop\Test Folder";
string zipFilePath = @"C:\Users\HOPE\Desktop\7za920.zip";
Directory.CreateDirectory(tempDirectoryPath);
ZipFile.ExtractToDirectory(zipFilePath, tempDirectoryPath);
【讨论】:
【参考方案15】:将目录savehere设为虚拟目录并从控制面板授予读/写权限
【讨论】:
运行 InetMgr.exe 然后转到 mysite 下的文件夹 savehere(IIS 中的 Web 应用程序/网站)它将在 DefaultApp 所在的左侧,我希望你明白我的意思【参考方案16】:有一个与我尝试写入的文件同名的目录,因此人们也可以留意它。
【讨论】:
【参考方案17】:我在本地工作站上开发时遇到了这个问题。
在几次不成功的iisreset
调用之后,我通过重新启动我的机器来纠正这种情况。
回想起来,打开的文件句柄可能会导致问题。
【讨论】:
【参考方案18】:就我而言,我必须在 IIS 中为网站添加 .NET 授权规则。
我添加了一条允许匿名用户的规则。
【讨论】:
【参考方案19】:我遇到了同样的问题,但我通过将文件保存在不同的位置然后复制文件并将其粘贴到我想要的位置来解决它。我使用该选项替换现有文件,这对我有用。我知道这不是最有效的方法,但它可以工作并且只需不到 15 秒。
【讨论】:
【参考方案20】:我遇到了很多麻烦,特别是与我在本地运行的代码有关,但是当我需要在 IIS 上运行它时,它抛出了这个错误。我发现在我的代码中添加检查并让应用程序在第一次运行时创建文件夹可以解决问题,而不必弄乱文件夹授权。
在调用使用该文件夹的方法之前类似这样
bool exists = System.IO.Directory.Exists("mypath");
if (!exists)
System.IO.Directory.CreateDirectory("mypath");
【讨论】:
【参考方案21】:如果您在 子域 中上传文件时遇到此错误,并且在您的 localhost
中正常工作,请按照以下步骤操作:
解决方案:
Plesk 面板
登录您的 Plesk 面板。选择出现错误的您的子域。 点击主机设置。 选择其他写入/修改权限并应用。CPanel
我不确定 CPanel 中的可用选项。但是,如果您授予目录权限(在 CPanel 中,它必须是十进制数,如 777、755)将解决该错误。For more details refer here
错误原因:
假设FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))
将是您将文件移动到上传路径的代码。
Server.MapPath
将为您提供目录的物理路径(Real Path)。但是您的子域可能没有访问物理路径的权限。
因此,如果您授予子域访问写入/修改权限的权限,它将解决问题。
【讨论】:
【参考方案22】:您可以尝试检查项目的 Web 属性是否未切换到 IIS Express 并将其更改回 IIS Local
【讨论】:
【参考方案23】:确保System.IO.Delete(string file)
中的目标是一个存在的文件。
也许你的代码有错误;比如你没有将正确的文件名传递给方法,或者你的目标是一个文件夹。在这些情况下,您会看到:“访问路径被拒绝错误”。
【讨论】:
【参考方案24】:我创建了一个具有完全权限的虚拟目录,并在那里添加了 ffmpeg 源和视频文件,所以最后它是有意义的,因为它可以被任何人访问。
【讨论】:
以上是关于访问路径被拒绝的主要内容,如果未能解决你的问题,请参考以下文章