【问题标题】:Path.GetTempFileName -- Directory name is invalidPath.GetTempFileName -- 目录名无效
【发布时间】:2010-09-08 11:56:44
【问题描述】:

遇到一个问题,在某些服务器上,使用 Path.GetTempFileName 时我们会收到目录名称无效的错误。进一步调查表明它正在尝试将文件写入 c:\Documents and Setting\computername\aspnet\local settings\temp(通过使用 Path.GetTempPath 找到)。该文件夹存在,所以我假设这一定是关于 asp.net 帐户的权限问题。

有人告诉我 Path.GetTempFileName 应该指向 C:\Windows\Microsoft.NET\Framework\v2.0.50727\temporaryasp.net 文件。

我还被告知这个问题可能是由于 IIS 和 .NET 在服务器上的安装顺序造成的。我已经完成了典型的“aspnet_regiis -i”并检查了文件夹等的安全性。此时我被卡住了。

有人能解释一下吗?

**更新:**事实证明,提供对文件夹的“IUSR_ComputerName”访问权限就可以了。这是正确的程序吗?我似乎不记得过去这样做过,显然,我想遵循最佳实践来维护安全。毕竟,这是文件上传过程的一部分。

【问题讨论】:

    标签: c# asp.net iis


    【解决方案1】:

    我在诊断正在写入临时文件的控制台应用程序时遇到此错误。在我的一次测试迭代中,我清除了 temp 中的所有文件/目录以进行“清白”运行。我通过注销并重新登录解决了这个自我造成的问题。

    【讨论】:

      【解决方案2】:

      我的一个 ASP.Net 应用程序遇到了同样的问题。我得到了 Path.GetTempPath() 但它抛出了一个异常:

      “无法写入文件“C:\Windows\Temp\somefilename”,异常:访问路径“C:\Windows\Temp\somefilename”被拒绝。”

      我在此页面上尝试了一些建议,但没有任何帮助。

      最后,我进入了 Web 服务器(IIS 服务器)并更改了服务器“C:\Windows\Temp”目录的权限,以赋予“Everyone”用户完全的读写权限。

      然后,最后,异常消失了,我的用户可以从应用程序下载文件。呸!

      【讨论】:

        【解决方案3】:

        这可能是假冒和不同身份验证方法不匹配的组合。

        有很多片段;我会一一尝试。

        模拟是一种“临时”切换线程正在运行的用户帐户的技术。从本质上讲,该线程短暂地获得了与被模拟的帐户相同的权限和访问权限——不多也不少。一旦线程完成创建网页,它就会“恢复”回原始帐户并为下一次调用做好准备。此技术用于访问只有登录到您网站的用户才能访问的资源。坚持一下这个概念。

        现在,默认情况下,ASP.NET 在名为 ASPNET 的本地帐户下运行网站。同样,默认情况下,只有 ASPNET 帐户和 Administrators 组的成员可以写入该文件夹。您的临时文件夹在该帐户的权限范围内。这是第二个难题。

        模拟不会自行发生。它需要在您的 web.config 中有意打开。

        <identity impersonate="true" />
        

        如果该设置缺失或设置为 false,您的代码将在上述 ASPNET 帐户下纯粹且简单地执行。鉴于您的错误消息,我很肯定您有 impersonation=true。没有什么不妥!模仿具有超出此讨论范围的优点和缺点。

        还有一个问题:当您使用模拟时,哪个帐户会被模拟

        除非您在 web.config (full syntax of the identity element here) 中指定帐户,否则模拟的帐户是 IIS 移交给 ASP.NET 的帐户。这取决于用户如何通过身份验证(或不通过身份验证)进入该站点。这是你的第三个也是最后一个作品。

        IUSR_ComputerName 帐户是由 IIS 创建的低权限帐户。默认情况下,此帐户是如果用户无法通过身份验证运行网络呼叫的帐户。也就是说,用户以“匿名”身份进入。

        总之,这就是发生在你身上的事情:

        您的用户正在尝试访问该网站,而 IIS 由于某种原因无法验证此人。因为匿名访问是打开的,(或者您不会看到 IUSRComputerName 访问临时文件夹),IIS 无论如何都允许用户,但作为一般用户。您的 ASP.NET 代码运行并模拟此通用 IUSR___ComputerName“来宾”帐户;只是现在代码无法访问 ASPNET 帐户可以访问的内容,包括它自己的临时文件夹。

        授予 IUSR_ComputerName 对该文件夹的 WRITE 访问权限可让您的症状消失。

        但这只是症状。您需要查看此人为何以“匿名/访客”身份出现?

        有两种可能的情况:

        a) 您打算使用 IIS 进行身份验证,但 IIS 中某些服务器的身份验证设置错误。

        在这种情况下,您需要在这些服务器上禁用匿名访问,以便进行通常的身份验证机制。请注意,您可能仍需要向您的用户授予对该临时文件夹的访问权限,或者改用另一个文件夹,您的用户已经有权访问该文件夹。

        我已经多次处理过这种情况,坦率地说,放弃 Temp 文件夹让您不那么头疼;在服务器中创建一个专用文件夹,设置适当的权限,并在 web.config 中设置其位置。

        b) 无论如何您都不想对人员进行身份验证,或者您想使用 ASP.NET 表单身份验证(它使用 IIS 的匿名访问绕过 IIS 中的检查并让 ASP.NET 直接处理身份验证)

        这个案例有点复杂。

        您应该转到 IIS 并禁用除“匿名访问”之外的所有形式的身份验证。请注意,您不能在开发人员的框中执行此操作,因为调试器需要启用集成身份验证。所以你的调试框会和真实的服务器有点不同;请注意这一点。

        然后,您需要决定是否应该关闭模拟,或者相反,在 web.config 中指定要模拟的帐户。如果您的 Web 服务器不需要外部资源(如数据库),请执行第一个。如果您的网站确实需要在可以访问数据库(或其他一些外部资源)的帐户下运行,请执行后者。

        您还有另外两种选择来指定要模拟的帐户。一,您可以转到 IIS 并将“匿名”帐户更改为可以访问资源的帐户,而不是 IIS 为您管理的帐户。第二种选择是将加密的帐户和密码存储在注册表中。这一步有点复杂,也超出了本文的讨论范围。

        祝你好运!

        【讨论】:

          【解决方案4】:

          可能是因为IIS_WPG 无权访问临时文件夹。如果您认为这是权限问题,请在 asp.net 工作进程上运行 Procmon 并检查 AccessDenied 错误。

          【讨论】:

            【解决方案5】:

            您可以使用 Path.GetTempPath() 找出它尝试写入的目录。

            【讨论】:

              猜你喜欢
              • 2017-04-18
              • 2010-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多