Windows Server 2012 R2 离线安装 IIS 全攻略:从版本确认到验证

发布时间:2026/10/23 17:26:24
Windows Server 2012 R2 离线安装 IIS 全攻略:从版本确认到验证

简介:这份离线安装包面向需要在无外网环境中为 Windows Server 2012 R2 部署或更新 IIS 的 IT 管理员与运维人员,解决内网、隔离机房或严格网络安全策略下无法在线拉取系统组件的问题。压缩包共 1568 个文件,约 99.04MB,以 dll 动态库、resx 资源文件、exe 可执行程序为主,辅以 aspx 页面、config 配置、sql 脚本、browser 浏览器定义及 tlb、targets 等组件描述文件,完整覆盖 IIS 角色与 Side-by-Side 组件存储所需内容。已有 572 人学习下载,说明其在同类离线部署场景中具备一定参考价值。资源保留了 IIS 各功能模块的原始文件结构,便于通过 DISM 指定源路径添加 Web 服务器角色,也方便管理员按模块排查组件缺失、核对版本依赖,是内网服务器搭建 Web 服务时较为实用的基础素材。

1. 内网服务器上装 IIS:离线包救了我一次

上个月给某公司内网一台 Windows Server 2012 R2 补装 IIS,机器不通外网,服务器管理器里点「添加角色和功能」走到一半就卡在「正在获取可用源」,进度条不动,日志里全是找不到源文件的报错。这台机器是业务前置机,不能重装系统,也不能临时开外网,只能走离线安装这条路。Windows Server 2012 R2 的 IIS 离线安装包,本质是把Microsoft-Windows-IIS-*这一组角色和功能组件按 CBS 包格式打包,配合DISM或Install-WindowsFeature的-Source参数指定本地源目录来装。装不好会怎样?轻则角色装一半回滚,系统里留下半残的 IIS 服务项;重则 CBS 存储被污染,后续任何角色都装不上。这篇笔记写给两类人:一是内网、隔离网里必须把 IIS 装起来的运维;二是想搞清楚-Source到底该指向哪个目录、/LimitAccess为什么必须加的开发者。下面按「先对版本、再放源、后装、最后验证」的顺序走一遍。

2. 装前对版本:2012 R2 的 IIS 源到底要哪些文件

2.1 先确认系统版本和 CBS 状态

离线装 IIS 翻车最多的原因不是包不对,是系统版本对不上。Windows Server 2012 R2 的版本号是6.3.9600,和 Windows Server 2012(6.2.9200)是两个东西,源文件不能混用。装之前先开一个管理员权限的 PowerShell,把版本和 CBS 健康状态确认一遍:

# 确认系统版本,必须是 6.3.9600 才是 2012 R2 [System.Environment]::OSVersion.Version # 查看当前已安装的角色和功能,确认 IIS 是否已部分安装 Get-WindowsFeature -Name Web-Server, Web-Mgmt-Tools # 检查组件存储健康状态,Healthy 才能继续 DISM /Online /Cleanup-Image /CheckHealth

第一行输出Major Minor Build Revision四段,6 3 9600就是 2012 R2。第二行如果Web-Server的Install State显示Available,说明还没装;如果显示Install Pending或者装了一半报错,得先清理再装。第三行CheckHealth只做快速检查,返回No component store corruption detected才算干净。我一般还会补一条DISM /Online /Cleanup-Image /ScanHealth,它比CheckHealth扫得细,耗时几分钟,但能提前发现 CBS 损坏,避免装到一半才炸。

提示:CheckHealth和ScanHealth都不改系统,只读检查;真正修复要用/RestoreHealth,但离线环境没有源修不了,所以这一步只做「能不能装」的判断。

2.2 离线源目录该放什么、放哪

2012 R2 的 IIS 离线源,标准做法是从同版本、同补丁级别的安装介质(ISO 或install.wim)里提取sources\sxs目录。这个目录里是 CBS 格式的.cab包,IIS 角色依赖的Microsoft-Windows-IIS-WebServer、Microsoft-Windows-IIS-WebServerRole、Microsoft-Windows-IIS-ManagementConsole等都在里面。把整个sxs目录拷到目标机器本地磁盘,比如D:\sxs,不要放网络共享路径——Install-WindowsFeature在部分补丁级别下对 UNC 路径支持不稳,本地路径最省心。

目录结构大致是这样,装之前扫一眼确认关键包在:

路径内容是否必需
D:\sxs\所有 CBS 包根目录必需
D:\sxs\Microsoft-Windows-IIS-WebServer-Package~*.cabIIS 核心 Web 服务器包必需
D:\sxs\Microsoft-Windows-IIS-ManagementConsole-Package~*.cabIIS 管理器图形界面按需
D:\sxs\Microsoft-Windows-IIS-ASPNET45-Package~*.cabASP.NET 4.5 支持按需
D:\sxs\Microsoft-Windows-IIS-HttpLogging-Package~*.cab日志模块建议保留

如果源目录是从别的机器拷来的,注意补丁级别要一致。2012 R2 装过不同累积更新的机器,sxs里的包版本号会不同,混用会出现「源文件版本与目标系统不匹配」的报错。最稳的做法是拿目标机器同批次、同补丁基线的那台机器的sxs,或者直接用原始 ISO 挂载后拷sources\sxs。

2.3 用 DISM 还是 Install-WindowsFeature

两条路都能装,区别在参数和报错信息。Install-WindowsFeature是 PowerShell 封装,报错友好,适合交互式操作;DISM /Online /Enable-Feature更底层,适合脚本化和排错。我一般先用Install-WindowsFeature试,失败再切DISM看详细日志。两者的源参数写法不同:前者是-Source D:\sxs,后者是/Source:D:\sxs,别写混。

3. 正式安装:三条命令把 IIS 装干净

3.1 最小化安装 Web-Server 角色

先只装核心 Web 服务器角色,把依赖链跑通,再按需加管理工具和 ASP.NET。这样出问题时范围小,好定位:

# 只装核心 Web 服务器角色,指定本地离线源,禁止联网找源 Install-WindowsFeature -Name Web-Server ` -Source D:\sxs ` -IncludeAllSubFeature:$false ` -Restart:$false

-Name Web-Server是角色名,不是显示名「Web 服务器(IIS)」,写错会报找不到功能。-Source D:\sxs指向本地源目录,路径末尾不要带反斜杠,带了在某些版本上会解析失败。-IncludeAllSubFeature:$false表示只装角色本体,不连带所有子功能——IIS 的子功能有几十个,全装会拖慢速度还引入不必要的组件。-Restart:$false先不自动重启,等确认装完再决定。这条命令跑完,输出里Success为True、Restart Needed为No才算干净通过。

3.2 补管理工具和常用子功能

核心角色装好后,按业务需要补 IIS 管理器和 ASP.NET 支持。管理工具是图形化运维的刚需,ASP.NET 4.5 是很多老业务系统的前提:

# 补装 IIS 管理器、ASP.NET 4.5、静态内容压缩等常用子功能 Install-WindowsFeature -Name Web-Mgmt-Tools, Web-Asp-Net45, Web-Stat-Compression, Web-Http-Logging ` -Source D:\sxs ` -Restart:$false

Web-Mgmt-Tools是 IIS 管理器所在的父功能,装了它inetmgr命令才能用。Web-Asp-Net45对应 ASP.NET 4.5,注意 2012 R2 默认带的是 .NET 4.5,如果业务要 4.6+ 得单独装运行时,IIS 这边只负责注册处理程序。Web-Stat-Compression和Web-Http-Logging是生产环境几乎必开的,前者省带宽,后者是排障黑匣子。多个功能名用逗号分隔,一条命令装完,比一个个装快,也少几次 CBS 事务提交。

3.3 用 DISM 兜底并看详细日志

如果Install-WindowsFeature报错但信息含糊,切DISM重跑同一批功能,它会把失败包名和错误码打出来:

# DISM 方式装 IIS 核心角色,/LimitAccess 强制不联网 DISM /Online /Enable-Feature /FeatureName:IIS-WebServerRole /Source:D:\sxs /LimitAccess /LogPath:C:\iis_install.log

/FeatureName:IIS-WebServerRole是 DISM 侧的角色名,和 PowerShell 的Web-Server不是同一个命名体系,别照抄。/LimitAccess是关键参数,它告诉 DISM 不要去找 Windows Update 做备用源,离线环境不加这个,DISM 会卡在联网超时上很久。/LogPath把日志单独落到C:\iis_install.log,装失败时直接搜Error和包名,比翻C:\Windows\Logs\CBS\CBS.log快得多。装完记得把日志留着,后面排查用得上。

4. 避坑与排查:五条血泪记录

4.1 报错 0x800f0906:源文件找不到

现象是Install-WindowsFeature返回0x800f0906,提示「无法下载源文件」。原因通常是-Source路径写错、sxs目录不完整,或者系统在找源时优先走了 Windows Update 而没走本地。解决分三步:先Test-Path D:\sxs确认目录在;再确认sxs下有Microsoft-Windows-IIS-WebServer-Package~*.cab这类包;最后在命令里显式加-LimitAccess(PowerShell 侧对应的是确保没有联网回退,必要时改用 DISM 的/LimitAccess)。我遇到过路径末尾多一个反斜杠导致解析失败的情况,去掉就好。

4.2 装到一半回滚,CBS 留下半残状态

现象是安装进度到某个百分比后回滚,Get-WindowsFeature里 IIS 显示Install Pending。原因是 CBS 事务提交失败,常见于源包版本和目标系统补丁级别不一致。解决:先DISM /Online /Cleanup-Image /StartComponentCleanup清理挂起事务,再Get-WindowsFeature确认状态回到Available,然后换一份与目标机器补丁基线一致的sxs重装。别在Install Pending状态下硬装第二次,会把 CBS 搞得更乱。

4.3 管理工具装了但 inetmgr 打不开

现象是Web-Mgmt-Tools显示已安装,但运行inetmgr提示找不到命令或界面空白。原因是只装了父功能没装子功能,或者 IIS 管理服务(WMSVC)没起。解决:确认Web-Mgmt-Console子功能在Get-WindowsFeature里是Installed;再Get-Service WMSVC看服务状态,没起就Start-Service WMSVC并设成自动。图形界面依赖 .NET 和 WMI,如果系统 .NET 有问题,管理器也会白屏,这时看事件查看器里.NET Runtime的报错。

4.4 离线源放网络共享,装到一半断连

现象是源放 UNC 路径(\\fileserver\sxs),安装中途报网络相关错误。原因是Install-WindowsFeature在部分补丁级别下对 UNC 源的访问不稳定,尤其跨网段时。解决:把sxs整个拷到目标机器本地磁盘再装,几百 MB 到 1 GB 左右,拷一次省心。拷完用Get-FileHash对一下关键包的哈希,防止拷贝损坏。

4.5 装完 IIS 但网站 500,缺 ASP.NET 注册

现象是 IIS 起来了,静态页能开,.aspx页面报 500.19 或 500.21。原因是 ASP.NET 4.5 功能装了但没向 IIS 注册处理程序。解决:用管理员权限跑%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i,把 ASP.NET 重新注册到 IIS。注意 2012 R2 上这个命令已被标记弃用,但在离线补装场景下仍然有效;跑完iisreset重启 IIS 再测。

5. 装完怎么验证:三条命令确认 IIS 真跑通

装完不等于跑通,我习惯用三条命令做收尾验证,缺一条都不算完。第一条看角色状态,第二条看服务,第三条发一个本地 HTTP 请求:

# 1. 确认角色和关键子功能都是 Installed Get-WindowsFeature -Name Web-Server, Web-Mgmt-Tools, Web-Asp-Net45 | Format-Table Name, InstallState # 2. 确认 W3SVC 和 WMSVC 服务在跑,启动类型为自动 Get-Service W3SVC, WMSVC | Format-Table Name, Status, StartType # 3. 本地发请求,看是否返回 200 (Invoke-WebRequest -Uri http://localhost -UseBasicParsing).StatusCode

第一条输出里三个功能的InstallState都必须是Installed,有一个Available就说明没装全。第二条W3SVC是 World Wide Web 发布服务,WMSVC是管理服务,两个都得Running、Automatic;W3SVC没起的话http://localhost直接连不上。第三条返回200说明默认站点和静态处理链路通了,如果返回503多半是应用程序池没起,去Get-IISAppPool看状态。

再补一个更贴近业务的验证:放一个测试页到C:\inetpub\wwwroot\test.html,内容随便写一行,然后浏览器或Invoke-WebRequest访问http://localhost/test.html,能出内容说明静态文件服务正常。如果业务要跑 ASP.NET,再放一个.aspx测试页,能出结果才说明 4.5 注册没问题。这套验证我一般写成一个小脚本存着,每次装完 IIS 跑一遍,比人肉点界面靠谱。

注意:验证阶段别急着开防火墙入站规则对外放端口,先在本地localhost验证通,再按业务需要开 80/443,避免装完就暴露一个半配置的站点。

从那以后我每次离线装 IIS,都强制走一遍「版本确认 → CBS 健康检查 → 本地源校验 → 最小化安装 → 三条验证」这个顺序,一步不跳。跳过哪步,后面就得花几倍时间在日志里找原因。这套流程在 2012 R2 上跑了不下十台机器,最慢的一台也就四十分钟装完验证完。希望帮到你。

本文还有配套的精品资源,点击获取