代码之家  ›  专栏  ›  技术社区  ›  Douglas Anderson

Path.GetTempFileName-目录名无效

  •  9
  • Douglas Anderson  · 技术社区  · 18 年前

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

    我还被告知,这个问题可能是由于IIS和.NET在服务器上的安装顺序造成的。我已经做了典型的'aspnet_regis-I',并检查了文件夹等的安全性。在这一点上,我被卡住了。

    有人能解释一下吗?

    5 回复  |  直到 18 年前
        1
  •  18
  •   Euro Micelli    18 年前

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

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

    现在,默认情况下,ASP.NET在名为 ASPNET . 同样,默认情况下,只有ASPNET帐户和Administrators组的成员才能写入该文件夹。您的临时文件夹在该帐户的权限范围内。这是拼图的第二块。

    <identity impersonate="true" />
    

    如果设置丢失或设置为false,您的代码将在上面提到的ASPNET帐户下执行。根据您的错误消息,我确信您的模拟为true。这没什么错!模仿的优点和缺点超出了本文的讨论范围。

    还有一个问题:当你使用模拟时, ?

    除非您在web.config中指定帐户( full syntax of the identity element here

    IUSR_ComputerName帐户是由IIS创建的低权限帐户。默认情况下,此帐户是运行web调用的帐户

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

    您的用户正在尝试访问该网站,但由于某种原因,IIS无法对此人进行身份验证。由于启用了匿名访问(或者您不会看到IUSRComputerName访问临时文件夹),IIS允许用户以普通用户的身份进入。您的ASP.NET代码运行并模拟此通用IUSR\uuuuuuu ComputerName“guest”帐户;只是现在代码没有权限访问ASPNET帐户可以访问的内容,包括它自己的临时文件夹。

    为什么这个人会以“匿名/客人”的身份出现?

    有两种可能的情况:

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

    我已经多次使用过这个场景,坦率地说,放弃临时文件夹会让你少一些麻烦;在服务器中创建专用文件夹,设置适当的权限,并在web.config中设置其位置。

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

    然后,您需要决定是关闭模拟,还是反过来在web.config中指定要模拟的帐户。如果您的web服务器不需要外部资源(如数据库),请首先执行此操作。如果您的网站确实需要在可以访问数据库(或其他外部资源)的帐户下运行,请执行后一种操作。

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

    祝你好运

        2
  •  2
  •   Gulzar Nazim    18 年前

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

        3
  •  2
  •   Brian    9 年前

        4
  •  0
  •   Mark Cidade    18 年前

    你可以用 Path.GetTempPath() 找出它试图写入的目录。

        5
  •  0
  •   Mike Gledhill    13 年前

    我的一个ASP.Net应用程序也有同样的问题。我正在 Path.GetTempPath() 但它抛出了一个例外:

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

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