bat批处理垃圾清理导致.net系统崩溃的坑

bat批处理垃圾清理导致.net系统崩溃的坑

161发表于2020-05-30

一、前言

昨天晚上升级了一下我们的蓝狐seo计费系统,当时因为c盘快满了,于是我在网上找了一个垃圾清理批处理bat,清理了一下服务器的垃圾。

今天一大早接到客户电话,说我们后台有些页面报错了,接口也返回500错误,是不是系统崩溃了?

我赶紧上线紧急排查问题。原来网上找的这个垃圾清理批处理bat有问题。简直是坑货!

https://jingyan.baidu.com/article/86112f1344c25427379787f5.html

二、问题现象

报错如下:

 error CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\f8bbcd80\ec905eca\App_Web_indexcustomer.cshtml.b8e1ff9f.gnizdtn5.dll”--“拒绝访问。 ”, Exception=>   在 System.Web.Compilation.AssemblyBuilder.Compile()
   在 System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
   在 System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
   在 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
   在 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
   在 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)
   在 System.Web.Compilation.BuildManager.GetCompiledType(VirtualPath virtualPath)
   在 System.Web.Compilation.BuildManager.GetCompiledType(String virtualPath)
   在 System.Web.mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.GetCompiledType(String virtualPath)
   在 System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)

from clipboard

不是所有页面报错,只是访问部分页面就报上面的错误!

三、问题分析

看上面的错误,大概就知道是.net mvc视图文件编译出问题,拒绝访问,应该是权限问题。

我通过尝试重启IIS和对目录:c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\f8bbcd80增加IIS_USERS完全控制权限,无果!

后来,垃圾清理的批处理程序bat中有一行代码引起了我的注意:

from clipboard

也就是这行:

rd /s /q %windir%\temp & md  %windir%\temp

意思是先删除目录C:\Windows\Temp,再创建一个空目录:C:\Windows\Temp

问题原因:

删除目录再创建目录,之前对目录设置的权限丢失了。

导致.net 编译试图文件时要往C:\Windows\Temp里面写文件失败!故而页面报错!

四、解决方法

最后,通过C:\Windows\Temp加上用户IIS_USERS完全控制权限,问题解决了!

from clipboard

小编蓝狐