ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Server 2012离线安装.NET 3.5:sxs镜像包与DISM命令实战指南

Server 2012离线安装.NET 3.5:sxs镜像包与DISM命令实战指南 简介这份资源面向在 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 20126.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提示“无法下载源文件”。原因没加/LimitAccessDISM 尝试连 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输出才动手。希望帮到你。本文还有配套的精品资源点击获取
返回列表