在 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:无法写入输出文件”错误的主要内容,如果未能解决你的问题,请参考以下文章
C# iis 错误配置信息( CS0016: 未能写入输出文件 )
win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NE