如何阻止IIS站点及应用池在重启或iisreset后自动启动?
我之前在维护Windows Server 2012 R2上的IIS 8.5服务器时,正好碰到过一模一样的问题!用Stop-WebAppPool和Stop-Website命令把站点和池停了进入维护模式,结果一执行iisreset或者重启服务器,它们居然自动启动了,但手动在IIS控制台停止就不会出现这个情况——当时也纳闷了好久,后来才搞懂根源。
问题根源
核心原因是:PowerShell的Stop-WebAppPool和Stop-Website只是临时停止运行中的实例,并没有把“停止状态”持久化到IIS的核心配置文件里。
而你手动在IIS管理控制台点击停止时,控制台会做两件事:
- 停止当前运行的站点/应用池进程
- 自动修改
applicationHost.config配置文件中对应站点的serverAutoStart和应用池的autoStart属性为false
这样重启或者iisreset后,IIS读取配置时就知道要保持停止状态;但脚本的Stop命令只做了第一步,没改配置,所以IIS重启后还是按照默认的autoStart=true(哪怕你设置了Start Mode为OnDemand,这个属性依然控制着是否自动启动)来启动站点和池。
解决方案:持久化停止状态
要解决这个问题,你需要在停止站点/池的同时,修改IIS的持久化配置,保证重启后状态不变。这里有两种常用方法:
方法1:用PowerShell的Set-WebConfigurationProperty命令
这是最贴合你的脚本场景的方式,直接在PowerShell里完成配置修改+停止操作:
# 替换成你的站点名称 $siteName = "YourTargetSite" # 替换成你的应用池名称 $appPoolName = "YourTargetAppPool" # 1. 修改站点配置,禁用自动启动 Set-WebConfigurationProperty -Filter "/system.applicationHost/sites/site[@name='$siteName']" -Name serverAutoStart -Value $false # 2. 修改应用池配置,禁用自动启动 Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/add[@name='$appPoolName']" -Name autoStart -Value $false # 3. 停止当前运行的站点和应用池 Stop-Website -Name $siteName Stop-WebAppPool -Name $appPoolName
方法2:用appcmd命令
如果你习惯用IIS的原生命令行工具,也可以用appcmd来修改配置:
# 禁用站点自动启动 appcmd set site "YourTargetSite" /serverAutoStart:false # 禁用应用池自动启动 appcmd set apppool "YourTargetAppPool" /autoStart:false # 停止站点和池 Stop-Website -Name "YourTargetSite" Stop-WebAppPool -Name "YourTargetAppPool"
恢复正常状态
当维护完成需要恢复时,只需要把配置改回true,然后启动站点和池即可:
# 恢复站点自动启动 Set-WebConfigurationProperty -Filter "/system.applicationHost/sites/site[@name='$siteName']" -Name serverAutoStart -Value $true # 恢复应用池自动启动 Set-WebConfigurationProperty -Filter "/system.applicationHost/applicationPools/add[@name='$appPoolName']" -Name autoStart -Value $true # 启动站点和池 Start-Website -Name $siteName Start-WebAppPool -Name $appPoolName
验证配置是否生效
你可以打开C:\Windows\System32\inetsrv\config\applicationHost.config文件,找到对应的站点和应用池节点,确认serverAutoStart和autoStart属性已经变成false,这样就可以放心重启服务器了。
内容的提问来源于stack exchange,提问作者Jeff Scott




