Directory.CreateDirectory 在共享主机上抛出 UnauthorizedAccessException 的可能原因

Posted

技术标签:

【中文标题】Directory.CreateDirectory 在共享主机上抛出 UnauthorizedAccessException 的可能原因【英文标题】:Possible causes for Directory.CreateDirectory throwing UnauthorizedAccessException on shared host 【发布时间】:2011-05-31 23:24:50 【问题描述】:

我目前正在开发一个 ASP.NET 3.5 / IIS7 应用程序,我使用 WinHost 作为临时托管环境。我有一些我认为是权限问题的戏剧,票务流程刚刚达到“你自己”的阶段。

这是我想要做的:

var dir = Server.MapPath("~/MyFolder/NewPath");
Directory.CreateDirectory(dir);

这是我得到的回应:

访问路径 'E:\web\MyAccount\MyFolder\NewPath' 是 拒绝。

描述:未处理的异常 在执行过程中发生 当前的网络请求。请查看 堆栈跟踪以获取有关的更多信息 错误及其起源 代码。

异常详情: System.UnauthorizedAccessException: 访问路径 'E:\web\MyAccount\MyFolder\NewPath' 是 拒绝。

堆栈跟踪显示 CreateDirectory 行失败。该应用程序在本地运行良好,并且运行应用程序池的身份具有对“MyFolder”路径的写入权限。在这两种环境中,信任级别都设置为“完全”。

WinHost 的指导是:

默认情况下,asp.net 用户拥有完整的 您网站的权限。

进一步研究,WindowsIndentity.GetCurrent().Name 返回“W02\aspnet_17884”,这似乎是一个帐户特定的身份。我的感觉是这个帐户无权写入应用程序的文件系统,但是当我提示 WinHost 时,我收到了:

您遇到的问题是 与您的申请相关 配置。

我建议做的是 注册然后发布您的 DiscountASP.NET 中的问题 社区论坛

这显然是为什么问题现在出现在 Stack Overflow 上 :)

任何人都可以建议任何应用级别的配置更改吗?这更有可能是托管站点上的权限问题吗?谢谢。

更新:我也有put the question up on the WinHost forum。

【问题讨论】:

该应用程序是否启用了模拟功能? 还要检查您的 IIS Web 日志中是否有该请求 - 特别是:请求状态代码 + 子状态代码。你得到 401.3 了吗? 您也可以尝试将 .NET 信任级别设置为中等,单击“应用”,然后将其切换回“完整”。 身份模拟没有任何作用。 HTTP 响应是 500,我希望日志中的响应相同(下次生成它们时会检查)。回收信任级别是我做的第一件事。 【参考方案1】:

是的,“W02\aspnet_17884”应该有足够的权限来创建文件夹。我建议您在ASPSPIDER 上创建一个免费帐户,并在那里上传一个与您的配置相似的非常简单的示例。如果它在那里工作而不是在 WinHost 上,你可以向他们展示它是如何在 asspider 上工作的,而不是在他们的服务器上。然后强制他们解决或获得新主机。

【讨论】:

【参考方案2】:

答案是...... web deploy 破坏了它。实际上,严格的答案是权限根本不存在(如预期的那样),但原因似乎是 web 部署以某种方式删除了写入权限。我可以从 web deploy 的角度来看,可以发布 ACL,但是为什么 WinHost 允许它来操纵包含网站的目录的权限是我无法理解的。

关于我的问题(和 WinHost 的回复)的更多信息,在他们的论坛上的主题 No write access to file system 下。

【讨论】:

以上是关于Directory.CreateDirectory 在共享主机上抛出 UnauthorizedAccessException 的可能原因的主要内容,如果未能解决你的问题,请参考以下文章

使用System.IO.Directory.CreateDirectory()时出现FileNotFoundException

UWP Directory.CreateDirectory 中的 UnauthorizedAccessException

System.IO.Directory.CreateDirectory - 有史以来最奇怪的异常

Directory.CreateDirectory 在共享主机上抛出 UnauthorizedAccessException 的可能原因

使用 System.IO.Directory.CreateDirectory 在网络驱动器中创建一个文件夹 [重复]

32.Directory类