在 IIS 7 中启动应用程序时出现“CS0016:无法写入输出文件”错误

Posted

技术标签:

【中文标题】在 IIS 7 中启动应用程序时出现“CS0016:无法写入输出文件”错误【英文标题】:"CS0016: Could not write to output file" error when starting an app in IIS 7 【发布时间】:2011-03-14 15:02:14 【问题描述】:

我正在运行 Windows 7,并且通常不是此设置中的开发人员,并且最近在 C# 中构建了 WCF Rest 服务,我现在正尝试将其部署到本地计算机上的 IIS。经过一番争论,我设置了应用程序,但是当我导航到应用程序时,我收到一条错误消息: 编译错误

描述:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。

编译器错误消息:CS0016:无法写入输出文件 'c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\scom_sibyll\8c0b945e\9329016\App_global.asax.eagmqgcd.dll ' -- '访问被拒绝。 '

我已尽我所能搜索网络,并更改了 Temporary ASP.NET Files 文件夹的权限以允许网络服务帐户完全权限,并对 Temp 文件夹执行相同操作。它在失败之前复制了许多文件,因此它可能具有写权限,所以我检查了从源文件夹读取的权限,这也有效。我还注意到它在尝试缓存 DLL 文件时会出错,并尝试关闭我的防病毒保护以及关闭 UAC,只是想看看我是否能弄清楚是什么阻止了这种情况的发生。我现在没有想法了。有人有什么建议吗?

【问题讨论】:

确保您的 IIS 标识对您的文件夹具有正确的权限。 【参考方案1】:

对于像我一样看这里的人,如果接受的答案不能解决问题,您可以尝试阅读这篇文章:http://lordzoltan.blogspot.com/2011/02/aspnet-2-and-4-default-application-pool.html

总之,当应用程序池用户无权访问 %TMP%/%TEMP% 文件夹时,似乎有时会显示相同的错误。

您需要授予 IIS_IUSRS 对运行应用程序池的用户的临时文件夹的读取和修改访问权限

这可能是应用程序池用户配置文件中的临时文件夹,例如c:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp,或c:\windows\temp 的系统临时文件夹。

设置这解决了我的问题。

【讨论】:

+1 授予对C:\Windows\Temp 的访问权限似乎为我解决了这个问题(尽管错误消息相反)。谢谢! 这个解决方案非常适合我。在 IIS 7 上安装 php 后我遇到了这个问题 +1。我在清理 C:\Windows\Temp 中的许多临时文件后遇到了这个问题。我发出的命令不小心删除了 Temp 文件夹本身,我不得不重新创建它。当时对其的任何自定义权限都被取消了,然后我开始收到原始问题中的错误。 完美的解决方案,为我工作。大多数博客建议将 App Pool Identity 更改为危险的网络用户(尽管是 localhost)。 向 IIS_USRS 授予对 C:\Windows\Temp 的访问权限也适用于 Server 2016。谢谢!【参考方案2】:

听起来运行 WCF 服务的帐户无权写入“临时 ASP.NET 文件”目录。

您也可以尝试重新运行 regiis。

%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis -i

ASP.NET IIS Registration Tool (Aspnet_regiis.exe)

【讨论】:

我也是这么想的,但是默认情况下,WCF 服务应该作为网络服务运行,对吧?有没有办法确认这一点?我检查了这个帐户的权利。另外,aspnet_regiis命令我已经试过了,忘了说,谢谢。还有其他想法吗? 检查您的 Web 应用程序正在哪个应用程序池中运行。在该应用程序 ppol 的属性表单上,您将能够看到该池正在运行的身份。除非,您正在使用模拟并且 IS 被配置为使用 Windows 身份验证。是否有条目发布到事件日志中?它是否显示哪个帐户无法访问该文件夹? 完美!谢谢,对于新手问题很抱歉 - 它没有设置为正确的用户帐户。现在感觉很愚蠢:D【参考方案3】:

在 Windows 8/Server 2012 上不再支持 aspnet_regiis。 我尝试使用 Windows 功能重新安装:失败。 我尝试重新安装 IIS:失败。 我尝试通过 WebPI 重新安装:失败。

我通过在 Windows 临时目录上设置 ACL 解决了这个问题。

这是一个可以完成这项工作的 powershell:

$dir = "C:\Windows\Temp"
$acl = get-acl -path $dir
$new = "IIS_IUSRS","Modify","ContainerInherit,ObjectInherit","None","Allow"
$accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $new
$acl.SetAccessRule($accessRule)
$acl | Set-Acl $dir

【讨论】:

我认为完全控制有点过分了。修改就好了。【参考方案4】:

有 3 个步骤要做:

1 - check if "Application Pool Identity" is NetworkService

2 - NETWORK_SERVICE account needs full control on:
    . C:\Windows\Temp
    . C:\Windows\Microsoft.NET\Framework[related framework]\Temporary ASP.NET Files\

3 - restart the IIS

错误已解决

您也可以尝试重新运行 regii。 "%windir%\Microsoft.NET\Framework[相关框架]\aspnet_regiis -i"

【讨论】:

【参考方案5】:

这个 KB 为我解决了这个问题,似乎操作系统环境变量中不存在临时文件路径。

http://support.microsoft.com/kb/825791

【讨论】:

4 小时 - 这就是解药!一个应用程序更改了环境变量并将其启动 - 干杯,伙计! 按照答案链接中的建议在命令行上键入 iisreset(更改临时文件夹的权限后)为我完成了这项工作【参考方案6】:

我授予 IIS_WPG 组对 C:\Windows\Temp 的读写访问权限。这对我有用。我在 Server 2003 R2 和 IIS 6 上,组名不同。我从http://learn.iis.net/page.aspx/140/understanding-built-in-user-and-group-accounts-in-iis/ 找到它,上面写着:

•IUSR 内置帐户取代了IUSR_MachineName 帐户。

•IIS_IUSRS 内置组替换了 IIS_WPG 组。

感谢 Dommer 建议 windows temp 文件夹,感谢 zcrar70 提供精彩的总结和详细描述的链接。

【讨论】:

【参考方案7】:

对我来说,解决方案是此处描述的修复的组合。我必须让 NETWORK_SERVICE 帐户完全控制

C:\Windows\Temp

C:\Windows\Microsoft.NET\Framework[相关框架]\Temporary ASP.NET Files\

并将应用程序池标识更改为 NetworkService。

在您完全控制 Temp 文件夹上的 NETWORK_SERVICE 后,不要忘记重新启动 IIS

【讨论】:

引用《捉鬼敢死队》的精彩音乐作品。 ——拯救这一天'! youtube.com/watch?v=mNuG25oq_b0【参考方案8】:

我在使用 asp.net core 2.0 开发 web api 时遇到了同样的错误,重启机器后问题得到解决。

【讨论】:

【参考方案9】:

有时临时文件可能被工作站中的其他进程锁定。作为第一步,请重新启动工作站并检查应用程序。

【讨论】:

【参考方案10】:

在 Windows 8 上,对我来说绝对没有任何效果。有一天,应用程序池突然决定不再使用 NetworkService 帐户。

我通过将应用程序池更改为在我自己的用户帐户下工作来解决问题。我知道这不是一个很好的解决方案,但它确实有效。

【讨论】:

【参考方案11】:

当我使用 bat 文件删除临时文件时会发生此错误。它可能会删除目录本身并且给定的权限已经消失。所以你必须以某种方式恢复它们。

最简单的方法是为所有人授予对以下目录的完全控制权:

C:\Windows\Temp

C:\Windows\Microsoft.NET\Framework[相关框架]\Temporary ASP.NET Files\

【讨论】:

【参考方案12】:

我有权限,但我开始收到该错误。 “重启机器”对我有用

【讨论】:

【参考方案13】:

在公司实施了各种安全措施剥夺了用户的管理员权限后,我最近在公司环境中开始遇到此错误。

对于开发人员,公司授权创建可以使用的帐户,我们必须将这些帐户添加到 PC 的管理员组,然后更改应用程序池的身份才能使用该帐户。

示例(Windows 10)

为开发者创建的帐户:域\开发者

拥有电脑管理员权限的人必须执行以下操作:

转到控制面板\用户帐户\管理用户帐户 单击“高级”选项卡,然后单击“高级用户管理”按钮 在 lusrmgr 页面中,单击左侧栏中的 Groups 文件夹以在中心面板中调出组 然后二次点击管理员组并选择“添加到组...” 在“管理员属性”面板中,单击“添加...”按钮 “选择用户、计算机、服务帐户或组”对话框打开。添加帐户(本例中为域\开发者) 然后点击确定按钮(如果您没有管理员权限,此按钮将被禁用)

现在配置应用程序池:

打开 IIS 管理器,选择应用程序池 单击所需的应用程序池使其突出显示,然后单击右侧“操作”面板中的“高级设置...” 在流​​程模型部分下,单击身份设置和省略号按钮 在“应用程序池标识”对话框中,选择“自定义帐户”,然后单击“设置”按钮 输入帐号和密码

此时我能够关闭所有内容,重新启动 IIS,然后运行我的应用程序。然后它可以访问以前无法访问的临时文件夹。

【讨论】:

【参考方案14】:

就我而言,当我将加载用户配置文件更改为 True(应用程序池 -> 高级设置 -> 加载用户配置文件 -> 设置为 true)时,它可以工作。

【讨论】:

以上是关于在 IIS 7 中启动应用程序时出现“CS0016:无法写入输出文件”错误的主要内容,如果未能解决你的问题,请参考以下文章

IIS编辑器错误信息:CS0016解决方案

C# iis 错误配置信息( CS0016: 未能写入输出文件 )

解决IIS发布时CS0016未能写入输出文件错误

win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NE

IIS出现Server Error in '/' Application.CS0016的解决办法

为啥在 IIS 7.5 下部署 MVC 3 应用程序时出现 401.2/Access is denied 错误?