简介:这份资源面向在 Windows Server 2012 上部署旧版应用的运维人员与系统管理员,针对 .NET Framework 3.5 默认未启用、在线下载常因网络受限而失败的问题,提供离线 SxS 组件包,让无完整安装介质的环境也能顺利启用该框架。压缩包共 1569 个文件,约 101.69MB,以 dll 动态库、resx 资源、exe 可执行文件为主,并含 config 配置、aspx 页面、sql 脚本、browser 与 mui 语言资源等,覆盖 WPF、WCF、WF 等组件运行所需内容,另附使用说明文本。已有 10478 人学习下载,适合需要运行依赖 .NET 2.0 至 3.5 SP1 程序、或受防火墙与断网策略限制的服务器场景。读者可据此完成离线安装、排查安装失败原因,并理解 SxS 目录在功能启用中的作用。
1. 当 Server 2012 提示“需要 .NET 3.5 但装不上”时,我在机房蹲了半小时
上周帮朋友处理一台 Windows Server 2012,业务软件启动直接弹窗要 .NET Framework 3.5,点“安装此功能”却卡在下载进度条,最后报错 0x800F0906。机房网络受限,Windows Update 根本连不上,那台机器又跑着关键服务不能随便重启。这种场景下,最稳的办法不是反复点“重试”,而是挂载与系统版本完全匹配的sxs 镜像资源包,用离线源把 .NET 3.5 一次性装进去。这份资源包就是干这个的:它把 Server 2012 安装镜像里sources\sxs目录下的组件单独抽出来,让你在断网或内网环境里也能完成 .NET 3.5 的启用。适合运维、实施、驻场工程师,以及任何被“.net3.5安装失败”卡住的人。下面我从资源结构、挂载方式、DISM 命令参数到踩坑记录,一步步拆开讲。
2. 先看清 sxs 包里到底装了什么:组件清单与版本匹配逻辑
2.1 为什么不能随便找个 .NET 3.5 离线安装包
很多人第一反应是去下个dotnetfx35.exe独立安装包,但在 Server 2012 上大概率翻车。原因是 Windows 8/Server 2012 之后,.NET 3.5 不再作为独立可再分发组件提供,而是作为系统“功能”存在,必须通过DISM或服务器管理器从系统安装源启用。独立安装包会尝试从 Windows Update 拉取父组件,网络一断就报 0x800F0906 或 0x800F081F。sxs 镜像资源包的本质,是把原版 ISO 里sources\sxs文件夹完整提取出来,里面包含microsoft-windows-netfx3-ondemand-package.cab等组件,DISM 指定这个目录作为源,就能绕过网络校验。
2.2 资源包内部结构长什么样
拿到资源包后,别急着双击。先解压到一个短路径,比如D:\sxs,然后看目录结构。典型内容如下:
| 文件/目录 | 作用 | 注意点 |
|---|---|---|
microsoft-windows-netfx3-ondemand-package.cab | .NET 3.5 核心按需组件 | 必须与系统版本匹配 |
microsoft-windows-netfx3-ondemand-package-zh-cn.cab | 中文语言包 | 缺失会导致界面部分英文 |
sxs\子目录 | 部分包会多套一层 | 路径别指错 |
readme.txt | 来源说明 | 核对版本号 |
版本匹配是血泪经验:Server 2012 和 Server 2012 R2 的 sxs 包不通用,R2 对应的是 Windows 8.1 内核。如果你把 2012 的包挂到 2012 R2 上,DISM 会直接报“源文件找不到”或“组件存储损坏”。常见做法是先用winver确认系统版本,再选对应资源包。
2.3 挂载前先确认系统版本和功能状态
在提权 PowerShell 里跑两条命令,把底摸清:
# 查看系统版本和内部版本号 [System.Environment]::OSVersion.Version # 查看 .NET 3.5 当前状态 Get-WindowsFeature -Name NET-Framework-Core第一条输出6.2.9200对应 Server 2012,6.3.9600对应 2012 R2。第二条如果Install State是Removed,说明功能未启用;如果是Available,说明组件文件还在但没装。参数说明:Get-WindowsFeature是 Server 2012 自带的 ServerManager 模块命令,比dism /online /get-features更直观。确认版本后再解压资源包,避免白忙。
3. 用 DISM 挂载 sxs 源:三条命令完成离线安装
3.1 解压与路径准备
把资源包解压到非系统盘,路径越短越好。我一般用D:\sxs,因为 DISM 对长路径和中文路径兼容性一般,路径里带空格也可能出玄学问题。
# 假设资源包是 zip,用 PowerShell 解压 Expand-Archive -Path "C:\Downloads\sxs_server2012.zip" -DestinationPath "D:\sxs" -Force # 确认关键 cab 文件存在 Get-ChildItem "D:\sxs" -Filter "*.cab" | Select-Object Name, Length逻辑说明:Expand-Archive是 PowerShell 5+ 自带命令,-Force覆盖已有文件。参数-DestinationPath指向短路径。执行完必须看到microsoft-windows-netfx3-ondemand-package.cab,如果只看到一层sxs文件夹,说明解压多套了一层,DISM 的/Source要指到里层。
3.2 核心 DISM 命令与参数逐项解释
提权 CMD 或 PowerShell 里执行:
# 启用 .NET 3.5,指定本地 sxs 源,禁用 Windows Update 回退 DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:D:\sxs逐参数说明:
/Online:操作当前运行系统,不是离线镜像。/Enable-Feature:启用功能,对应 .NET 3.5 的功能名是NetFx3。/FeatureName:NetFx3:注意大小写不敏感,但拼写必须准确,写成NetFramework3会报功能不存在。/All:启用该功能的所有父功能,避免依赖缺失。/LimitAccess:关键参数,阻止 DISM 去 Windows Update 找源,强制只用/Source指定的本地路径。不加这个,断网环境会卡很久然后报错。/Source:D:\sxs:指向解压后的 sxs 目录,不是 cab 文件本身。
执行成功会显示“操作成功完成”,进度条到 100%。如果报 0x800F081F,说明源路径不对或包版本不匹配;报 0x800F0906,说明/LimitAccess没加或源里缺组件。
3.3 验证安装结果与功能状态
装完别急着关窗口,跑验证:
# 再次查看功能状态 Get-WindowsFeature -Name NET-Framework-Core # 查看 .NET 版本注册表 Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" | Select-Object Install, VersionInstall State应显示Installed,注册表Install值为1。如果状态是Install Pending,说明需要重启才能生效,但 Server 2012 上 .NET 3.5 通常不需要重启。验证通过后,再启动那个报错的业务软件,弹窗应该消失。这一步我习惯用Get-WindowsFeature而不是dism /online /get-featureinfo,因为前者输出更干净,适合截图留档。
4. 避坑与排查:五个让 .NET 3.5 安装翻车的真实场景
4.1 报错 0x800F0906:源文件找不到或网络被拦
现象:DISM 进度条走到 20% 左右报 0x800F0906,提示“无法下载源文件”。原因:没加/LimitAccess,DISM 尝试连 Windows Update,但内网防火墙拦截了。解决:命令末尾强制加/LimitAccess,并确认/Source路径下直接能看到 cab 文件。如果还报,检查资源包是否解压完整,用Get-ChildItem核对文件大小,正常 cab 在 100MB 以上。
4.2 报错 0x800F081F:版本不匹配或路径多套一层
现象:DISM 直接报 0x800F081F,提示“源文件找不到”。原因:最常见的是 Server 2012 R2 用了 2012 的 sxs 包,或者解压后路径变成了D:\sxs\sxs。解决:先用[System.Environment]::OSVersion.Version确认版本,6.2 用 2012 包,6.3 用 2012 R2 包。路径问题就进目录看一眼,把/Source指到真正含 cab 的那一层。
4.3 功能状态显示 Installed 但软件仍报错
现象:Get-WindowsFeature显示已安装,业务软件还是提示缺 .NET 3.5。原因:软件可能检测的是 32 位或 64 位特定注册表项,或者需要重启后才刷新。解决:先重启一次;如果不行,检查HKLM:\SOFTWARE\WOW6432Node\Microsoft\NET Framework Setup\NDP\v3.5下的Install值。常见做法是手动把Install设为 1,但更稳的是用 DISM 重新启用一次并加/All。
4.4 用服务器管理器图形界面安装卡住
现象:在“添加角色和功能”里勾选 .NET 3.5,指定备用源路径后仍然卡在“正在安装”。原因:图形界面底层还是调 DISM,但不会自动加/LimitAccess,且对路径校验更严。解决:放弃图形界面,直接用命令行 DISM。如果必须用图形界面,确保“备用源路径”填的是D:\sxs而不是D:\sxs\microsoft-windows-netfx3-ondemand-package.cab。
4.5 资源包来源不明导致组件存储损坏
现象:DISM 报“组件存储损坏”或 0x80073712。原因:下载的 sxs 包被篡改或压缩不完整,cab 文件哈希不对。解决:换一个来源可靠的资源包,解压后对比文件大小和数量。我一般会保留一份原版 ISO 提取的 sxs 作为后悔药,避免临时找包翻车。如果已经损坏,先跑DISM /Online /Cleanup-Image /RestoreHealth修复系统映像,再重新安装。
5. 进阶技巧:把 sxs 源做成可复用工具包与自动化脚本
5.1 把 sxs 目录固化到内网共享
如果你管着几十台 Server 2012,每台都解压一份太蠢。常见做法是把 sxs 目录放到内网文件服务器,比如\\fileserver\sources\sxs2012,然后 DISM 的/Source直接指 UNC 路径:
DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:\\fileserver\sources\sxs2012注意:UNC 路径需要当前账户有读权限,且 DISM 在部分环境下对 UNC 支持不稳定。更稳的是用net use先映射盘符,再指本地盘符。参数上/LimitAccess依然不能省。
5.2 写一个一键检测并安装的 PowerShell 脚本
把版本判断、路径检查、DISM 调用和验证串起来,适合批量执行:
# 一键安装 .NET 3.5 脚本,需提权运行 $osVersion = [System.Environment]::OSVersion.Version $sxsPath = "D:\sxs" if ($osVersion.Major -eq 6 -and $osVersion.Minor -eq 2) { Write-Host "检测到 Server 2012,使用对应 sxs 包" } elseif ($osVersion.Major -eq 6 -and $osVersion.Minor -eq 3) { Write-Host "检测到 Server 2012 R2,请确认 sxs 包为 R2 版本" } else { Write-Host "非目标系统,退出" exit 1 } if (-not (Test-Path "$sxsPath\microsoft-windows-netfx3-ondemand-package.cab")) { Write-Host "sxs 路径下未找到核心 cab,请检查解压" exit 1 } Start-Process -FilePath "dism.exe" -ArgumentList "/Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:$sxsPath" -Wait -NoNewWindow $state = (Get-WindowsFeature -Name NET-Framework-Core).InstallState Write-Host "安装后状态: $state"逻辑说明:先判断系统版本,再检查核心 cab 是否存在,最后调 DISM 并输出状态。参数-Wait保证脚本等 DISM 结束再验证,-NoNewWindow让输出留在当前控制台。这个脚本我一般会存成install-net35.ps1,配合组策略或远程执行工具批量推。
5.3 验证与回滚:留好后悔药
装完后除了看功能状态,我还会跑一个实际 .NET 3.5 编译的小程序做冒烟测试。如果业务软件还是异常,回滚命令是:
DISM /Online /Disable-Feature /FeatureName:NetFx3 /Remove/Remove会删除功能文件,但不会自动清理 sxs 源。回滚后可以重新用正确版本的包再装。从那以后我每次去机房前,都会先把对应版本的 sxs 包和这个脚本拷进 U 盘,再确认一遍winver输出,才动手。希望帮到你。
本文还有配套的精品资源,点击获取