PowerShell IIS ServerManager单服务器异常:GetSection读取配置文件失败
IIS脚本添加自定义请求头故障排查
我们有一个用于向IIS网站添加自定义请求头的PowerShell脚本,在多数服务器上运行正常,但某台服务器执行时出错:
脚本代码:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration") | Out-Null $iis = new-object Microsoft.Web.Administration.ServerManager $config = $iis.GetWebConfiguration('sitename.example.io') $httpProtocolSection = $config.GetSection("system.webServer/httpProtocol")
故障服务器执行最后一行GetSection时抛出错误:
Exception calling "GetSection" with "1" argument(s): "Filename: redirection.config Error: Cannot read configuration file"
已知信息:
- 脚本预期读取
web.config而非redirection.config - 两台服务器上
web.config和redirection.config的权限配置一致 - 逐行执行脚本时,故障服务器的
$config输出为空RootSectionGroup:
RootSectionGroup ----------------
正常服务器输出:
RootSectionGroup ---------------- Microsoft.Web.Administration.SectionGroup
排查步骤
1. 修复IIS管理组件完整性
故障服务器可能存在IIS管理核心组件缺失或损坏情况,运行以下命令修复:
DISM /Online /Cleanup-Image /RestoreHealth
完成后重启服务器,再测试脚本。
2. 验证站点名称准确性
确认sitename.example.io是故障服务器上完全匹配的站点名称(部分环境对大小写敏感),可通过以下命令列出所有站点名称:
Import-Module WebAdministration Get-Website | Select-Object Name
若名称不匹配,修正脚本中的站点名称后重试。
3. 检查redirection.config文件状态
虽然权限一致,但文件可能损坏或被占用:
- 打开
%windir%\System32\inetsrv\config\redirection.config,检查XML格式是否正常 - 对比正常服务器上的redirection.config内容,替换故障服务器的文件(替换前备份原文件)
- 确认文件未被杀毒软件、其他进程锁定
4. 直接读取站点web.config测试
尝试绕开自动配置加载逻辑,直接读取站点物理路径下的web.config:
$site = $iis.Sites['sitename.example.io'] $webConfigPath = Join-Path $site.PhysicalPath "web.config" $config = [Microsoft.Web.Administration.ConfigurationManager]::OpenWebConfiguration($webConfigPath) $httpProtocolSection = $config.GetSection("system.webServer/httpProtocol")
若此方法成功,说明原GetWebConfiguration调用在故障服务器上的配置加载逻辑异常。
5. 验证应用程序池标识权限
即使文件权限一致,应用程序池运行标识可能无站点物理路径访问权限:
- 打开IIS管理器,找到目标站点对应的应用程序池
- 查看其“标识”设置,确认该标识对站点物理路径拥有读取权限
- 可临时将标识改为
LocalSystem测试(测试后恢复原配置)
6. 核对.NET Framework版本兼容性
Microsoft.Web.Administration组件依赖特定.NET版本,确认故障服务器与正常服务器的.NET版本一致:
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version,Release -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -match '^(?!S)\p{L}' } | Select-Object Version,Release
若版本差异较大,安装对应版本的.NET Framework后重试。
7. 重置IIS清理配置缓存
运行以下命令重置IIS,清理配置缓存:
iisreset /restart
重置完成后重新运行脚本,观察是否恢复正常。
内容的提问来源于stack exchange,提问作者Luke Briner
相关产品推荐
相关产品推荐

