【问题标题】:ASP.NET Access to the temp directory is deniedASP.NET 访问临时目录被拒绝
【发布时间】:2010-10-07 05:43:19
【问题描述】:

我今天在许多不同的服务器上都遇到了这个问题。

System.UnauthorizedAccessException:访问临时目录被拒绝。

服务器最近没有动过。我唯一想到的是Windows更新破坏了某些东西..有什么想法吗?

尝试从 asp.net 页面访问 web 服务时会发生这种情况

System.UnauthorizedAccessException: Access to the temp directory is denied.  Identity 'NT AUTHORITY\NETWORK SERVICE' under which XmlSerializer is running does not have sufficient permission to access the temp directory.  CodeDom will use the user account the process is using to do the compilation, so if the user doesnt have access to system temp directory, you will not be able to compile.  Use Path.GetTempPath() API to find out the temp directory location.
       at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
       at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
       at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
       at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Evidence evidence)
       at System.Web.Services.Protocols.XmlReturn.GetInitializers(LogicalMethodInfo[] methodInfos)
       at System.Web.Services.Protocols.HttpServerType..ctor(Type type)
       at System.Web.Services.Protocols.HttpServerProtocol.Initialize()
       at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
       at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)

【问题讨论】:

    标签: c# asp.net exception


    【解决方案1】:

    您是否检查过临时文件夹的权限?在这些情况下,最简单快捷的解决方案通常是重新运行 aspnet_regiis -i 命令以重新安装 asp.net 框架,该框架也会重置所需文件夹的权限。如果失败,请尝试使用Process Monitor 检查发生的情况并相应地修改权限。

    【讨论】:

    • 我遇到了同样的问题,使用进程监视器解决了我的问题。您只需注意文件系统活动,然后查找 w3wp.exe。错误消息类似于权限被拒绝,它给出了 w3wp 试图写入的确切文件夹。我授予了网络服务用户名读取、写入和列出文件夹内容的权限。
    • 请注意在运行 asp.net 2.0 应用程序的服务器上使用 aspnet_regiis -i,因为它会将它们升级到 asp.net 4.0。最好使用aspnet_regiis -ir
    【解决方案2】:

    我遇到了同样的问题,以上都没有解决我们的问题——我们通过更改每个应用程序池站点运行的设置来临时恢复服务——你可以通过进入应用程序池来做到这一点——>身份选项卡和并将用户从网络服务更改为本地用户——虽然我们找出了问题所在(不推荐这样做——所以如果你选择这样做,请确保你了解后果)

    然后我们找到了一个关于 Temp\TMP 映射以及如何修复它们的link - 这不是我们的问题

    在另一个site(如其他答案中所述)上,我们使用Path.GetTempPath() 来查看CLR 实际寻找的结果是什么

    C:\WINDOWS\system32\config\systemprofile\Local 设置\临时文件夹

    然后我们使用Process Monitor 来验证这实际上是正确的,当我们更改此文件夹的权限时,它可以正常工作。我们仍然不确定 CLR 为何选择停止使用默认临时目录,但我们确实找到了有关它如何做出该决定的链接。 How GetTempPath is picked.

    更新:我们终于弄清楚当有人决定重复错误时,我们的临时文件夹 PATH 是如何更改的!问题是CLR Profiler someone 决定在 live 上运行,这会更改临时目录的所有权限,所以如果您还不知道这一点,我不建议在 Prod 服务器上运行它。

    【讨论】:

    • 这些建议帮助我们解决了作为 网络服务 运行的 Windows 服务的类似问题,其中 NHibernate 映射文件编译由于临时目录问题而失败。谢谢!
    【解决方案3】:

    不管是什么原因造成的突然变化,您都可以使用异常中描述的步骤来解决问题。

    调用 Path.GetTempPath 找出它认为的临时目录是什么,它可能不是你认为的那样。

    转到该目录并授予用户“网络服务”所需的权限,可能是读/写。

    【讨论】:

      【解决方案4】:

      它真的是一个在 IIS 中运行的网站吗?并访问网络服务。

      它要么作为 ASPNET、匿名运行,要么冒充连接的用户,或者最终 Web 服务本身作为“用户”连接。

      无论它是哪个用户,都可能无权访问临时目录。奇怪的是什么都没有改变:)。但是,Windows Service Pack 可以更改安全设置。

      【讨论】:

        【解决方案5】:

        Windows Server 2003 - IIS 6.0 - 同样的问题。 c:\windows\temp = 当前临时目录 - 按照 cgreeno 的建议使用 procmon 可以让我看到访问被拒绝。我授予用户“所有人”对 c:\windows\temp 文件夹的完全权限,但仍然被拒绝访问。授予组合中所有用户(本地系统、网络服务、应用程序池身份用户等)的完全权限访问权限,但没有帮助。试过 ASPNET_REGIIS -ir 但没有帮助。

        我创建了一个新的本地系统用户“tempuser”并分配到本地“管理员”组。我导航到 Windows 服务并停止了“万维网发布”、“IIS Admin”和“HTTP SSL”。我将“tempuser”分配给所有三个服务。我尝试启动每个服务,但由于各种原因它们未能启动。然后我将所有 3 项服务都放回用户“本地系统”,突然我的访问被拒绝错误消失了。不知道为什么。我的 App Pool 用户遇到了其他文件系统错误,但现在也可以正常工作。使用 Windows 服务分配本地系统帐户似乎有些问题。

        * 更新 *

        问题又来了。很奇怪……

        【讨论】:

        • 我当然希望您在测试后删除“所有人”权限。
        • 我们将生产服务器复制到专用网络中进行诊断...此副本将在不久的将来销毁。
        【解决方案6】:

        在我的情况下,防病毒(COMDO)对此负责......在防病毒更新后,它刚刚开始阻止访问我的本地服务的临时文件夹(不是全部,只是少数)......这有点棘手出来了。。

        【讨论】:

        • 哇,正如你所说,在我的情况下,它也是防病毒软件。防病毒软件似乎阻止了对 windows/temp 目录的访问。即使您打开该目录的安全性,错误也会不断出现。当我关闭防病毒软件时,错误消失了,我可以生成 ssrs 报告。
        【解决方案7】:

        转到 roslyn 文件夹(进入项目的 bin 文件夹)并为运行应用程序池的用户添加读/写权限

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-21
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-04
          • 1970-01-01
          • 2016-04-25
          相关资源
          最近更新 更多