ARTICLE DETAIL

资讯详情

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

Windows Server 2012 R2 离线安装 .NET 3.5:SXS 源配置与 DISM 实战

Windows Server 2012 R2 离线安装 .NET 3.5:SXS 源配置与 DISM 实战 简介这份资源面向在 Windows Server 2012 R2 Standard 上部署 .NET Framework 3.5 时遇到安装失败问题的运维与开发人员提供系统 SXS 组件文件用于在安装向导中指定备用源路径绕过在线下载受限或镜像缺失导致的报错。压缩包共 1568 个文件约 85.45MB以 720 个 dll 动态库、180 个 resx 资源文件、84 个 exe 可执行程序为主另含 aspx、config、sql、browser、tlb、targets、manifest 等类型覆盖 .NET 3.5 运行库、ASP.NET 组件及系统部署所需的清单与配置目录结构贴近系统组件原始布局便于按需检索。已有 1802 人学习下载适合需要离线修复 .NET 3.5 安装、搭建兼容旧版应用环境的读者参考可帮助快速定位缺失组件、完成备用路径配置并验证安装结果。1. 当 2012 R2 的 .NET 3.5 装不上时SXS 到底在救什么场如果你在 Windows Server 2012 R2 Standard 上跑过老业务系统大概率见过这个画面角色和功能向导里勾选 .NET Framework 3.5进度条卡在「正在搜索源文件」然后弹出一句「无法安装一个或多个角色、角色服务或功能安装一个或多个角色、角色服务或功能失败找不到源文件」。这不是系统坏了是微软从 2012 开始把 .NET 3.5 的二进制文件从系统镜像里拆了出去安装时得回头去翻安装介质的sources\sxs目录。SXS 就是 Side-by-Side并行程序集缓存Windows 用它来存放不同版本的共享组件避免 DLL 打架。这份资源要解决的就是「离线环境里怎么把 sxs 源指对、把 .NET 3.5 补上」这件事。适合谁手里有 2012 R2 Standard 镜像、被老 ERP 或老 ASP.NET 站点绑住、又没法让服务器连外网的运维。下面按「源从哪来 → 怎么挂 → 怎么装 → 怎么排错」走一遍。2. 先搞清 SXS 源从哪来镜像、WIM 与 install.wim 的对应关系2.1 为什么 2012 R2 的 .NET 3.5 非要外部源Windows Server 2012 R2 的安装镜像里sources\sxs目录存放的是 .NET Framework 3.5 的功能组件包文件名形如microsoft-windows-netfx3-ondemand-package.cab。系统默认的「按需安装」逻辑会先去 Windows Update 找找不到就报错。离线环境里没有外网就必须用/Source参数把路径指到本地 sxs。这里有个容易混的点很多人以为把 ISO 挂载后直接指盘符根目录就行实际上要指到sources\sxs这一层少一层都会提示找不到源。另外Standard 和 Datacenter 的 sxs 内容基本一致但版本号必须和当前系统 build 对得上否则会报「源文件版本不匹配」。2.2 挂载镜像与确认 sxs 路径先确认你手里的 ISO 是 2012 R2 的不是 2012 或 2016。挂载后进到sources目录看有没有sxs文件夹。常见做法是用 PowerShell 挂载避免手动点来点去。# 挂载 ISO 到虚拟光驱假设 ISO 路径为 D:\ISO\2012R2.iso $mount Mount-DiskImage -ImagePath D:\ISO\2012R2.iso -PassThru # 获取挂载后的盘符 $drive ($mount | Get-Volume).DriveLetter Write-Host 挂载盘符: $drive # 确认 sxs 目录存在 Test-Path ${drive}:\sources\sxs逻辑说明Mount-DiskImage把 ISO 挂成虚拟光驱Get-Volume拿到盘符Test-Path验证 sxs 是否存在。参数上-PassThru让命令返回对象而不是空方便后续取盘符。如果Test-Path返回 False说明你挂的不是 2012 R2 镜像或者 ISO 本身不完整。这一步别省我见过有人挂了个 2016 的镜像路径看着一样装的时候直接报版本不符。2.3 从 WIM 里提取 sxs 的备选方案有些场景你拿不到 ISO只有install.wim。这时候可以用 DISM 把 sxs 挂出来或者直接提取。常见做法是挂载 WIM 到临时目录把sources\sxs拷出来。# 创建临时目录 New-Item -ItemType Directory -Path C:\Temp\wim -Force # 查看 WIM 里的索引确认是 Standard 还是 Datacenter dism /Get-WimInfo /WimFile:D:\ISO\install.wim # 挂载指定索引到临时目录索引 2 通常是 Standard dism /Mount-Wim /WimFile:D:\ISO\install.wim /Index:2 /MountDir:C:\Temp\wim /ReadOnly # 拷贝 sxs 到本地 Copy-Item -Path C:\Temp\wim\sources\sxs -Destination C:\sxs -Recurse # 卸载 WIM dism /Unmount-Wim /MountDir:C:\Temp\wim /Discard逻辑说明/Get-WimInfo先看索引对应哪个版本别挂错。/Mount-Wim的/ReadOnly保证不污染原镜像/Index:2是常见 Standard 索引但不同镜像可能不同以实际输出为准。Copy-Item把 sxs 拷到本地C:\sxs后续安装就指这个路径。/Discard丢弃挂载改动因为只读挂载不需要保存。参数上/MountDir目录必须为空否则挂载失败。3. 用 DISM 把 .NET 3.5 装进去命令、参数与日志3.1 在线安装与离线安装的区别在线安装就是让系统自己去 Windows Update 拉命令是dism /Online /Enable-Feature /FeatureName:NetFx3 /All。离线安装必须加/Source并且/LimitAccess阻止它偷偷去连 Windows Update。很多人只加了/Source没加/LimitAccess结果系统还是先尝试联网超时后才用本地源白白等几分钟。正确写法是两者都加。# 离线安装 .NET 3.5源指向本地 sxs dism /Online /Enable-Feature /FeatureName:NetFx3 /All /Source:C:\sxs /LimitAccess逻辑说明/Online表示操作当前运行的系统/Enable-Feature启用功能/FeatureName:NetFx3是 .NET 3.5 的功能名/All启用所有父功能/Source指定 sxs 路径/LimitAccess禁止访问 Windows Update。参数上/Source路径不要带尾部反斜杠带sources\sxs这一层。执行完如果提示「操作成功完成」就说明装上了。3.2 用 PowerShell 的 Install-WindowsFeature 替代如果你更习惯 PowerShell可以用Install-WindowsFeature它底层也是调 DISM但参数写法不同。# 用 PowerShell 安装 .NET 3.5指定源 Install-WindowsFeature -Name NET-Framework-Core -Source C:\sxs -Restart逻辑说明-Name NET-Framework-Core对应 .NET 3.5 核心功能-Source指本地 sxs-Restart表示如果需要自动重启。注意-Source这里指到 sxs 目录本身不是它的父目录。如果报「找不到源」先检查路径拼写和权限。这个命令的好处是输出更友好会告诉你成功还是失败失败时给个错误码。3.3 装完怎么验证装完别急着跑业务先验证。最直接的是看注册表或者跑个依赖 .NET 3.5 的小程序。# 查看 .NET 3.5 功能状态 Get-WindowsFeature -Name NET-Framework-Core # 查看注册表里的 .NET 版本 Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 -Name Install逻辑说明Get-WindowsFeature的Install State显示Installed就对了。注册表v3.5下的Install值为 1 表示已安装。如果这两个都对但业务还是报错那问题可能不在 .NET 3.5 本身而是 32 位/64 位或者权限问题得另查。4. 避坑与排查sxs 安装 .NET 3.5 的五个血泪经验4.1 现象提示「找不到源文件」但路径明明存在原因最常见的是/Source指到了 ISO 根目录或者sources目录没指到sxs。另一个可能是 ISO 挂载后盘符变了脚本里写死了旧盘符。解决用Test-Path确认sxs存在路径写成盘符:\sources\sxs别用相对路径。如果是脚本动态取盘符。4.2 现象安装进度卡很久最后报超时原因没加/LimitAccess系统先去连 Windows Update离线环境连不上等超时。解决命令里强制加/LimitAccess让它直接用本地源。如果已经卡了可以CtrlC中断重新跑带/LimitAccess的命令。4.3 现象报「源文件版本不匹配」或「0x800f081f」原因sxs 来自不同版本或不同 build 的镜像。比如用 2012 R2 的 sxs 去装 2012或者用评估版镜像的 sxs 去装正式版。解决确认镜像版本和系统版本一致winver看 build镜像用dism /Get-WimInfo看版本。0x800f081f 这个错误码基本就是源不对换正确的 sxs 重试。4.4 现象装完后业务程序还是报缺少 .NET 3.5原因可能装的是 64 位 .NET 3.5但业务是 32 位程序需要 32 位组件或者程序依赖的是 .NET 3.5 的某个子功能没启用。解决用dism /Online /Get-Features | findstr NetFx3看状态确认NetFx3和NetFx3Client都启用。32 位程序在 64 位系统上会走 WOW64.NET 3.5 本身是双位的一般不用额外装但如果报错检查程序池的「启用 32 位应用程序」设置。4.5 现象DISM 命令执行到一半报错退出日志在哪看原因DISM 的详细日志默认在C:\Windows\Logs\DISM\dism.log但很多人不知道。解决装失败后直接看这个日志搜Error或0x能看到具体哪一步失败。常见的是权限不足用管理员身份跑 PowerShell 或 CMD。另外如果系统盘空间不足也会失败留至少 2GB 空间。5. 进阶把 sxs 源固化成本地功能包与自动化脚本5.1 把 sxs 做成常驻本地源如果你管的不止一台 2012 R2每次挂 ISO 太麻烦。常见做法是把 sxs 拷到服务器本地固定目录比如C:\sxs然后写个脚本一键装。这样以后重装或者新机器直接跑脚本不用再找 ISO。注意这个目录别删系统后续更新可能还会用到。# 一键安装脚本检查 sxs 是否存在不存在则从 ISO 提取 $sxsPath C:\sxs if (-not (Test-Path $sxsPath)) { Write-Host 本地 sxs 不存在请先挂载 ISO 并拷贝 sxs 到 C:\sxs exit 1 } # 检查 .NET 3.5 是否已安装 $state (Get-WindowsFeature -Name NET-Framework-Core).InstallState if ($state -eq Installed) { Write-Host .NET 3.5 已安装跳过 exit 0 } # 执行安装 Install-WindowsFeature -Name NET-Framework-Core -Source $sxsPath -Restart逻辑说明先判断C:\sxs是否存在不存在就提示手动处理避免脚本瞎跑。然后查功能状态已装就跳过省时间。最后调Install-WindowsFeature。参数上-Source用变量方便改路径。这个脚本我一般放在C:\Tools下新机器初始化时跑一遍。5.2 用 XML 应答文件批量部署如果是批量部署比如用 MDT 或者 SCCM可以在应答文件里预置 .NET 3.5 安装。常见做法是在unattend.xml的servicing阶段加一条InstallFeature指定NetFx3和源路径。这样系统装完 .NET 3.5 就已经在了不用事后补。参数上源路径要指向部署共享里的 sxs 目录确保部署时能访问到。5.3 验证与回滚装完后验证除了看功能状态还可以跑一个依赖 .NET 3.5 的测试程序比如老版本的aspnet_regiis.exe -i看能不能注册成功。如果装错了想回滚用dism /Online /Disable-Feature /FeatureName:NetFx3 /Remove卸载但注意卸载可能影响依赖它的程序。我一般会在装之前打个快照或者备份系统盘留个后悔药。从那以后我每次动 .NET 3.5 之前都强制先Get-WindowsFeature看一眼状态再确认 sxs 路径最后才敲安装命令。希望帮到你。本文还有配套的精品资源点击获取
返回列表