在 IIS 上拒绝访问路径

Posted

技术标签:

【中文标题】在 IIS 上拒绝访问路径【英文标题】:Access to path denied on IIS 【发布时间】:2017-12-08 15:53:44 【问题描述】:

我正在尝试让我的 MVC 应用程序使用 System.IO.File.WriteAllText 将一个简单的文本文件写入另一个服务器。 (一个单独的进程正在该文件夹中查找要抓取的文本文件。)在我的本地计算机上调试时它工作正常,但是当部署到测试服务器上的 IIS 时,我在尝试写入文件时总是收到此错误:

对路径“\\server\C$\folder\subfolder\file.txt”的访问被拒绝。

在 SO 上至少有六个类似问题的答案是授予应用程序池身份帐户访问该文件夹的权限。但是,IIS 上的应用程序池已经在对所需文件夹具有完全权限的服务帐户下运行,但仍然出现错误。我什至尝试将应用程序池更改为我自己的帐户(在调试中成功使用的帐户),仍然得到错误。

匿名访问已关闭,Windows 身份验证已打开(file.txt 的一部分是来自用户 AD 帐户的信息)。我尝试使用多个 AD 帐户访问该应用程序,无论是否访问 \\server\C$\folder\subfolder\,但它们都给出了相同的错误。

我看不到应用程序如何在授权帐户下运行,并且用户可以使用授权帐户登录应用程序,但仍然收到拒绝访问错误。有什么方法可以获取有关具体拒绝访问或实际拒绝哪个帐户的更多信息?还有什么我在这里想念的吗??

【问题讨论】:

正如@Polyfun 下面的注释,请确认路径实际上是正确的(以双斜杠开头),并且您上面显示的只是复制/粘贴或转录问题。 @GalacticCowboy 我确实检查过并且代码正确(加上它在调试中工作)。 SO的markdown在显示时只是将两个斜杠算作一个“转义”的斜杠。 【参考方案1】:

您需要检查其他进程是否已经打开了文件,例如,“一个单独的进程正在该文件夹中查找要抓取的文本文件” - 也许这个单独的进程已经打开了文件,因此锁定了您的 IIS过程?使用进程监视器 (https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) 监视文件上的活动。

另外,您将文件位置指定为 '\server\C$\folder\subfolder\file.txt'。 UNC 路径通常以“\\”开头,例如“\\server\C$\folder\subfolder\file.txt”。这可能只是 *** 将双斜杠转义为单斜杠的产物。

作为一个简单的测试,能不能用自己的记事本打开报错信息中的文件,写入文件?如果您使用应用程序池身份帐户怎么办?

编辑:您在具有文件位置的服务器上运行进程监视器。像这样添加路径过滤器:

Path   excludes    file.txt   then  Exclude

其中 file.txt 是您正在监视的文件的文件名(不包括目录)。此过滤器将仅捕获该文件的事件,并排除其他所有内容。事件发生后,右键单击它,然后转到“属性”、“进程”以查看发起该事件的用户。

【讨论】:

“Grab”可能是一个糟糕的词选择。查找文件的过程只是读取文件,并且是由其他事件触发的,所以此时不​​锁定文件。单个 `\` 是如此逃避角色;代码和错误都有 2。我确实尝试使用我的代码中给出的路径从测试服务器在记事本中打开文件,它确实有效。 进程监视器应该告诉您 IIS 在尝试打开文件时使用的身份/帐户 - 这是您期望的帐户吗? 我之前没有使用过进程监视器。现在试试看。我需要查看 IIS 服务器还是具有文件位置的服务器? 您在具有文件位置的服务器上运行进程监视器。为文件名添加过滤器。它将显示访问该文件的所有进程/身份,以及任何错误。 这帮助我找到了问题所在。在我的计算机上,甚至在允许直接访问该文件夹但 IIS 无法使用的 IIS 服务器上,显然存在挥之不去的凭据。 ProcMon 显示 IIS 从未从测试服务器进入文件,但在我的机器上进行调试时,它正在使用延迟凭证访问它。仍然必须弄清楚应该可以访问该文件的服务帐户出了什么问题,但至少现在我知道问题出在哪里。谢谢!【参考方案2】:

首先,您可以尝试在要写入文本文件的文件夹中向 IUSR 用户授予写入权限。

有一种方法可以在你的 web.config 文件中使用 Impersonate 标签来模仿你的 asp.net 应用程序中的用户,但我认为这可能很危险。

  <identity impersonate="true" userName="nomducompte" password="motdepasse" />

我希望这会有所帮助。

【讨论】:

IUSR 用户不是 IIS 服务器的本地帐户吗?授予它访问远程机器的权限将如何工作?我确实玩过identity 标签。不确定我是否做错了,或者某些内容与其他设置不兼容,因为它总是导致500 - internal server error

以上是关于在 IIS 上拒绝访问路径的主要内容,如果未能解决你的问题,请参考以下文章

“对路径的访问被拒绝.” 是怎么回事

IIS拒绝访问

如何修复访问被拒绝路径错误asp.net应用程序访问网络共享

vs2022路径拒绝访问

对路径的访问被拒绝,怎么解决

CS0016: Could not write to output file 拒绝访问 - 解决办法