Path.GetTempFileName - 目录名无效

时间:2008-09-10 22:06:40

标签: c# asp.net iis

遇到问题,在某些服务器上,当使用Path.GetTempFileName时,我们会收到目录名无效的错误。进一步调查显示它正在尝试将文件写入c:\ Documents和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”访问权限。这是正确的程序吗?我似乎不记得过去这样做,显然,想要遵循最佳实践来维护安全性。毕竟,这是文件上传过程的一部分。

5 个答案:

答案 0 :(得分:18)

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

有很多部分;我会尝试逐个检查它们。

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

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

模仿本身不会发生。它需要在web.config中有意打开。

<identity impersonate="true" />

如果设置丢失或设置为false,您的代码将在上面提到的ASPNET帐户下执行pure。鉴于您的错误消息,我肯定您有impersonation = true。没有什么不妥!模仿的优点和缺点超出了本次讨论范围。

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

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

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

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

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

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

但那只是症状。您需要查看为什么此人将成为“匿名/来宾”?

有两种可能的情况:

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

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

我已经多次使用过这个场景了,坦率地说,它让你不用担心放弃Temp文件夹;在服务器中创建一个专用文件夹,设置适当的权限,并在web.config中设置其位置。

b)你不想要对人进行身份验证,或者你想使用ASP.NET Forms Authentication(它使用IIS的匿名访问来绕过IIS中的检查并允许ASP.NET直接处理身份验证)

这种情况有点复杂。

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

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

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

祝你好运!

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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

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