【问题标题】:"CS0016: Could not write to output file" error when starting an app in IIS 7在 IIS 7 中启动应用程序时出现“CS0016:无法写入输出文件”错误
【发布时间】: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 标识对您的文件夹具有正确的权限。

标签: c# wcf iis iis-7 permissions


【解决方案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

      【讨论】:

      【解决方案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)时,它可以工作。

                  【讨论】:

                    猜你喜欢
                    • 2013-02-13
                    • 1970-01-01
                    • 2012-06-14
                    • 2021-09-11
                    • 2020-01-03
                    • 1970-01-01
                    • 2016-11-03
                    相关资源
                    最近更新 更多