资讯动态

Windows Server 2012 R2离线安装.NET 3.5:DISM与NetFx3实战

发布时间:2026/10/24 4:16:52 来源:尧图企业网站定制
简介面向在 Windows Server 2012 R2 及云服务器环境中安装 .NET Framework 3.5 受阻的运维人员这份压缩包提供一套可本地指定安装源的解决文件针对系统提示“找不到源文件”或要求使用“源”选项指定还原功能所需文件位置的典型故障。包内共 1568 个文件整体约 99.19MB以 dll、resx、exe、aspx、config、sql 等为主并含 browser、ini、tlb、targets、ascx 等配置与组件文件涵盖运行库组件、管理页面、数据库脚本和安装清单等类别便于按提示定位所需源文件。目录组织较完整可配合系统“指定备用源路径”操作使用帮助排查功能还原失败、源路径缺失及组件依赖问题对云主机缺少系统安装介质、离线环境或组件缓存不完整的场景尤具参考意义也可作为核对安装文件是否齐全的辅助材料。已有 10328 人学习或下载适合需要处理 Server 2012 R2 与 SQL Server 相关环境 .NET 3.5 安装问题的技术人员参考。1. 装 SQL Server 卡在 .NET 3.5 上多半不是系统坏了一台内网里的 Windows Server 2012 R2准备装 SQL Server 做业务库。安装程序跑到“安装 .NET Framework 3.5”这一步就不动了。换到服务器管理器里勾选 .NET Framework 3.5 功能弹出来的对话框只有一句“指定备用源路径”或者“需要从 Windows 更新下载文件”。机器不出网这条路直接堵死。手上的 settled_.net3.5install.zip 就是给这种场景准备的它把 NetFx3 按需功能的载荷抽出来配一条 DISM 命令就能在无外网的 2012 / 2012 R2 上把 3.5 装上不必依赖 Windows Update。它适合维护内网服务器、做数据库交付、批量装机的运维和 DBA如果机器能直连更新源在控制面板里点两下更省事这个包反而多余。2. 按需功能机制3.5 不是“装不上”是“没地方装”先把一件事说清楚Server 2012 这一代系统里.NET Framework 3.5功能名 NetFx3被做成了按需功能Features on Demand。它的运行时代码不再完整躺在 install.wim 的默认安装列表里系统只在 WinSxS 里留一个占位真正需要时再从“源”把载荷拉过来。源有两种Windows Update或者安装介质里\sources\sxs目录下的 cab 包。所以绝大多数所谓的“无法安装 .net3.5”本质是系统找不到合法源而不是组件本身坏了。2.1 NetFx3 的载荷为什么被移出默认镜像从 2012 开始系统镜像被压得很紧NetFx3 这种体积不小、又不是所有角色都依赖的组件被拆到了 side-by-side 存储里。这个设计在联网环境里很舒服按需拉取、按需展开在离线环境里就成了麻烦——系统知道要什么但拿不到。这里面有个容易混淆的点控制面板那条路和 DISM 那条路走的其实是同一个底层接口都是向 CBS组件服务提交安装请求。区别在于源的定义方式。控制面板默认没有指定源CBS 会去问 Windows UpdateDISM 或 PowerShell 可以用/Source显式告诉它“源在这里”。所以同一台机器控制面板报错、DISM 成功是完全正常的现象不用怀疑系统被改坏了。判断自己的机器属于哪种情况看报错码最快错误码字面含义实际原因0x800F0906无法下载源文件系统找不到任何可用源联网也拉不到0x800F081F找不到源文件/Source指了但路径里没有对应 cab0x800F0907组策略阻止策略里锁死了功能安装的源0x800F0954更新服务不可用WSUS 策略把请求劫走了而 WSUS 没批准 NetFx30x800F0922安装失败保留分区空间不足系统保留分区剩余空间不够这张表建议留着后面排错会反复用上。0x800F0906 和 0x800F081F 长得像但处理方向完全相反前者是“没给源”后者是“给了源但内容不对”。2.2 三条安装通道各自的边界在哪同一个 NetFx3至少有三种装法适用场景差别很大。第一条是服务器管理器或控制面板的“添加功能”。优点是图形化、不用记命令缺点是无法指定自定义源在离线机器上等于废掉。组策略里如果配了“指定 Windows 功能安装和修复的可选组件安装设置”它才会去读那个路径否则一律走 Windows Update。第二条是 DISM。它在系统里是常驻的不依赖 .NET 运行时本身所以在 3.5 还没装的机器上也能跑。/Source参数可以精确控制载荷来源/LimitAccess会强制它不去碰 Windows Update——这一步在离线环境里非常关键不带这个参数DISM 有可能先尝试联网超时之后再回落白白耗掉十几分钟。第三条是 PowerShell 的Install-WindowsFeature。它底层同样是 DISM但返回结构化对象适合写进脚本批量执行。2012 / 2012 R2 上功能名是NET-Framework-Core注意不是旧版本那个NET-Framework写错了会直接提示找不到功能。选型建议很简单单台机器救急用图形界面确认问题再用 DISM 落地批量交付用 PowerShell 包一层要改镜像或做标准化走离线 WIM 挂载。三条路不要混着用尤其别在 DISM 装到一半时去点控制面板CBS 会同时收到两个请求轻则排队重则留下半装状态后面清理起来很费劲。2.3 什么情况下必须走离线源判断标准不是“能不能上网”而是“能不能稳定拿到 NetFx3 的载荷”。下面几种情况我一般直接上离线包不做无谓尝试内网隔离环境机器连不上任何外部更新源。这是最常见的一类尤其是数据库服务器出于安全考虑本来就不给出网。WSUS 统一管控的环境。域策略把更新源指向了内部 WSUS而 WSUS 管理员没有批准 NetFx3 这个“功能”类更新——注意功能和补丁在 WSUS 里是两类东西很多人只同步了补丁分类功能载荷根本没下来。安装介质被裁剪过。有些定制镜像为了压体积把sources\sxs目录删了这时候即使你挂载原版 ISO 也找不到源。SQL Server 静默安装。安装程序内部会检测 3.5缺失时直接抛错退出没有交互界面给你补救。这种情况必须在跑 setup 之前先把 3.5 装好顺序反了就得从头再来。还有一种隐蔽情况机器能上网但出口做了限制只放行 80/443 的部分域名。DISM 拉载荷走的地址不一定在放行列表里表现出来就是“明明能上网却装不上”这种时候别在网络上纠缠直接上离线源五分钟解决。3. 拆开 settled_.net3.5install.zipsxs 目录里到底要什么拿到这个压缩包第一件事不是解压到桌面就开跑。离线源这种东西路径本身就是参数的一部分放错地方照样失败。3.1 目录结构与三个关键文件解压之后标准结构大致是这样settled_.net3.5install.zip └── sxs/ ├── microsoft-windows-netfx3-ondemand-package.cab ├── microsoft-windows-netfx3-ondemand-package~31bf3856ad364e35~amd64~~.cab └── (若干语言包与补丁级 cab)真正被 CBS 认的是那个带完整包名的 cab文件名里的~31bf3856ad364e35~amd64~~这一段是组件的身份标识缺了它 DISM 就认不出来。普通用户看到的microsoft-windows-netfx3-ondemand-package.cab只是个人类可读的别名两个文件可能要同时在。除了 cab包里通常还会带一个批处理或者说明文件作用是把 DISM 命令拼好。这类脚本看一眼就行别直接双击——批处理里的路径多半是按作者机器写的盘符不一样就翻车。我一般把 sxs 整个目录拷到目标机器路径固定成D:\sxs后面所有命令都基于这个路径减少变量。提示不同版本的系统2012 与 2012 R2载荷不能混用。R2 的 cab 拿到 2012 上DISM 会报 0x800F081F看起来像路径错实际是版本不匹配。3.2 解压路径的三条硬约束路径这件事吃过亏的人都会变得很谨慎。三条约束几乎是硬性的第一不要放在含中文或空格的路径下。CBS 对路径的解析比想象中严格D:\我的工具\net3.5这种路径DISM 有时能过、有时报错 87参数错误排查起来毫无头绪。统一用D:\sxs这种短路径能省掉一大类玄学问题。第二不要放在网络盘或 U 盘上做在线安装。/Source指向 UNC 路径是可以的但那是另一种用法需要额外的凭据上下文。本地磁盘最稳。第三不要解压到系统盘根目录下的临时目录。有些清理策略会定期扫C:\Windows\Temp装到一半文件被删CBS 会卡在 pending 状态。我习惯的动作是把 zip 拷到目标机的数据盘用系统自带的解压或者 7-Zip 解到D:\sxs然后确认目录里能看到 cab 文件而不是一个嵌套了两层的同名文件夹——压缩包套文件夹是另一个高频翻车点。3.3 校验源是否完整一条预检命令在真正执行安装之前先跑一条只读命令确认源能被识别REM 列出指定源中可用的 NetFx3 相关包不执行安装 dism /Online /Get-FeatureInfo /FeatureName:NetFx3这条命令输出的是当前系统里 NetFx3 的状态重点看State一行。显示Disabled说明功能存在但未启用可以装显示Disabled with Payload Removed说明载荷确实被移除了必须给源如果显示Enabled那就不用装了问题在别处。想进一步确认源目录本身有没有被识别可以用REM 检查源目录下是否存在 NetFx3 的载荷文件 dir D:\sxs\*netfx3*.cab /b有输出说明文件名对得上输出为空说明要么目录层级错了多套了一层 sxs要么下错了版本。这一步花十秒能省掉后面半小时的错误码排查。4. DISM 落地三条命令覆盖本机、镜像、UNC 三种场景到了动手环节。三种场景对应三套命令参数逻辑是相通的但细节差别不小尤其是/LimitAccess该不该加、什么时候加。4.1 本机在线安装/Source 加 /LimitAccess最常见的一台机器救急命令就一行REM 从本地 sxs 目录启用 NetFx3/All 表示连带父功能一起启用 REM /LimitAccess 强制不访问 Windows Update离线环境必加 dism /Online /Enable-Feature /FeatureName:NetFx3 /All /Source:D:\sxs /LimitAccess逐段拆一下。/Online指向当前运行的系统不是离线镜像/Enable-Feature是动作/FeatureName:NetFx3是功能名这一代系统统一叫 NetFx3不要写成 NET-Framework-Core那是 PowerShell 的叫法/All会把 NetFx3 依赖的父功能一并启用不加的话在某些精简系统上会因为父功能未启用而失败/Source:D:\sxs指定载荷目录注意是目录不是单个文件/LimitAccess阻止 DISM 回落到 Windows Update。/LimitAccess这个参数值得多说一句。不带它的时候DISM 在本地源里找不到匹配文件会尝试联网超时时间不短表现出来就是“命令卡住了”。带了它找不到就直接报 0x800F081F快速失败好排查。所以离线场景我一律加上。执行完正常输出结尾是“操作成功完成”。如果看到进度条走到 100% 却报错先看错误码对照第 2 章那张表。PowerShell 的等价写法适合写进脚本# 从指定源安装 .NET 3.5-Restart 表示需要时自动重启 # 注意功能名是 NET-Framework-Core和 DISM 的 NetFx3 不同 Install-WindowsFeature -Name NET-Framework-Core -Source D:\sxs -Restart这个 cmdlet 返回一个对象Success属性和ExitCode可以直接判断成败。批量场景下比解析 DISM 的文本输出可靠得多。-Restart要不要加看业务窗口数据库服务器上我一般不自动重启装完手动确认再安排。4.2 离线镜像挂载把 3.5 打进 install.wim如果要交付的是标准化镜像逐台装太慢直接改 install.wim 更划算。步骤是挂载、装功能、卸载提交REM 创建挂载点目录 mkdir C:\mount REM 挂载 install.wim 的第 2 个索引通常对应 Server Core 或 Standard 的某个版本 dism /Mount-Wim /WimFile:D:\iso\sources\install.wim /Index:2 /MountDir:C:\mount REM 向挂载的镜像中启用 NetFx3源仍然是本地 sxs 目录 dism /Image:C:\mount /Enable-Feature /FeatureName:NetFx3 /All /Source:D:\sxs /LimitAccess REM 提交更改并卸载 dism /Unmount-Wim /MountDir:C:\mount /Commit关键参数解释/Index:2表示操作第 2 个映像索引先用dism /Get-WimInfo /WimFile:...看清楚每个索引对应哪个版本选错了白干/MountDir必须是空目录非空会直接拒绝挂载/Image和/Online是互斥的一个指向离线镜像一个指向运行中的系统。/Commit这个参数是后悔药忘了加就前功尽弃。如果中途发现源不对想放弃这次挂载用/Discard卸载镜像保持原样。我见过有人挂载完直接删挂载目录结果 WIM 处于挂起状态后续所有挂载操作都报错只能重启清理。改完的 install.wim 换回 ISO 或者直接用于部署新装出来的机器自带 3.5SQL Server 安装程序不会再拦你。4.3 远程共享与批量分发几十台机器的场景逐台拷贝 sxs 目录太低效。把 sxs 放到一台文件服务器上用 UNC 路径指过去REM 从网络共享启用 NetFx3需当前账户对该共享有读权限 REM 在域环境里建议用计算机账户可访问的共享避免交互式凭据问题 dism /Online /Enable-Feature /FeatureName:NetFx3 /All /Source:\\fileserver\sources\sxs /LimitAccessUNC 路径这条命令能跑通的前提是执行账户对共享有读权限。在域环境里用计算机账户访问共享经常踩坑——机器账户的权限和用户账户是两套共享权限给了用户组不代表机器能读。稳妥做法是给Domain Computers或者对应的机器组授读权限或者干脆用本地管理员在每台机器上跑。批量分发时我会套一层 PowerShell# 读取机器列表逐台远程执行安装记录结果 $computers Get-Content D:\scripts\servers.txt $results foreach ($c in $computers) { try { # 通过 Invoke-Command 在目标机执行源路径为共享 $r Invoke-Command -ComputerName $c -ScriptBlock { Install-WindowsFeature -Name NET-Framework-Core -Source \\fileserver\sources\sxs } -ErrorAction Stop [pscustomobject]{ Server $c; Success $r.Success; ExitCode $r.ExitCode } } catch { [pscustomobject]{ Server $c; Success $false; ExitCode $_.Exception.Message } } } $results | Export-Csv D:\scripts\netfx3_result.csv -NoTypeInformation -Encoding UTF8这段脚本的价值在于把成功和失败的机器分开记录出问题的机器单独处理不会出现“跑完了不知道哪几台没装上”的情况。ExitCode为NoChangeNeeded表示本来就装了属于正常结果不用当失败处理。5. 避坑与排查五个现场每个都带错误码这一章是我这些年攒下来的血泪经验按现象、原因、解决三段式写。碰到对应症状直接对号入座。5.1 0x800F081F源指了但内容对不上现象DISM 命令带/Source执行几秒后报 0x800F081F提示找不到源文件。原因路径存在但目录里没有系统要的那个 cab。常见有三种解压时多套了一层文件夹实际路径成了D:\sxs\sxs下载的是 2012 R2 的载荷却装在 2012 上cab 文件被杀毒软件隔离了目录里只剩个空壳。解决先用dir D:\sxs\*.cab /b确认文件在不在再看文件名里的版本标识。实在拿不准把/Source指到上一层目录试一次DISM 会自己往下找一级。杀毒软件的问题看隔离区日志加白名单后重新解压。5.2 0x800F0954WSUS 把请求劫走了现象机器明明能访问外网DISM 也带了/Source仍然报 0x800F0954或者直接卡在“正在搜索更新”。原因域策略把更新源指向了内部 WSUSCBS 在处理功能安装时会优先走策略配置的源/Source的优先级在某些策略组合下反而靠后。WSUS 上没有批准 NetFx3 这个功能类更新请求就被拒绝。解决两条路。临时绕开改注册表让更新服务不走 WSUSREM 临时关闭 WSUS 强制改完需重启 wuauserv 服务生效 reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer /t REG_DWORD /d 0 /f net stop wuauserv net start wuauserv装完记得改回来/d 1再跑一次不然机器会脱离补丁管控这个责任不小。另一条路是让 WSUS 管理员批准 NetFx3 对应的功能更新从根上解决适合长期环境。5.3 路径里带空格或中文报错 87现象命令看着没问题执行直接报“错误 87参数不正确”连进度条都没有。原因/Source:后面跟的路径里有空格或非 ASCII 字符命令行解析在空格处截断了。用引号包起来有时候能过有时候不行取决于调用层级。解决别用引号硬扛换路径。把 sxs 挪到D:\sxs这种纯 ASCII、无空格的位置一劳永逸。这属于典型的环境问题不值得在命令语法上耗时间。5.4 装完了SQL Server 还是报缺 3.5现象Get-WindowsFeature显示 NetFx3 已安装注册表里Install值也是 1但 SQL Server 安装程序仍然提示需要 .NET Framework 3.5 SP1。原因SQL Server 检查的不只是 NetFx3 功能状态还会看 3.5 的 SP 级别和服务注册情况。有些精简镜像里 NetFx3 装了但 SP1 补丁级别的组件缺失检查不通过。另一种可能是安装程序在 64 位系统上还要看 32 位子系统那一份。解决确认HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5下SP值为 1不是 0。是 0 的话需要补 SP1 级别的更新。另外检查C:\Windows\Microsoft.NET\Framework\v3.5\和Framework64\v3.5\两个目录是否都存在缺一个都可能让安装程序判定不满足。5.5 反复卸载重装把 WinSxS 弄脏现象装失败、卸载、再装来回几次之后任何命令都报组件存储损坏dism /Online /Cleanup-Image /RestoreHealth也跑不通。原因NetFx3 安装中途被打断CBS 里留下 pending 状态组件存储里有一批半展开的文件。反复操作会把损坏范围扩大。解决先跑dism /Online /Cleanup-Image /ScanHealth看损坏程度能修就RestoreHealth修复源同样需要安装介质。修不好的话sfc /scannow兜底。真到这一步重装系统往往比继续修更省时间——这也是为什么我强调安装过程别中断别同时开两个安装通道。注意所有 DISM 操作执行期间不要重启机器也不要手动结束 TiWorker 进程中断的代价远大于等待。6. 验证与固化把 3.5 写进镜像别在每台机器上重来一遍装完不算完得验证。我见过装完显示成功、实际组件不全的情况等 SQL Server 跑起来才暴露那时候排查成本高得多。三条验证命令按顺序跑# 1. 查功能状态State 应为 Installed Get-WindowsFeature -Name NET-Framework-Core | Select-Object Name, InstallState # 2. 查注册表安装标记Install 应为 1SP 应为 1 Get-ItemProperty HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 | Select-Object Install, SP # 3. 确认 32/64 位运行时目录都在 Test-Path C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe Test-Path C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe三条全过才算真装好了。csc.exe存在这个检查看着土但很实用——它证明编译器组件确实展开了而不是只有一个注册表标记。有些半装状态就是标记有了、文件没落地。再进一步做镜像固化。前面第 4 章讲过 WIM 挂载但那是一次性的。如果你们有标准化交付流程更彻底的做法是在无人应答文件里预置!-- autounattend.xml 片段在 specialize 阶段预置 NetFx3 -- settings passspecialize component nameMicrosoft-Windows-ServerManager-SvrMgrNc processorArchitectureamd64 publicKeyToken31bf3856ad364e35 languageneutral versionScopenonSxS DoNotOpenServerManagerAtLogontrue/DoNotOpenServerManagerAtLogon /component /settings配合Microsoft-Windows-Foundation-Package里的功能列表把NetFx3标记为 true部署时系统会自己从sources\sxs取载荷。前提是 install.wim 和 sxs 目录都在介质里缺一个都不行。这套做法在批量交付里省下的时间很可观几十台机器一次性带过去不用一台台敲 DISM。日常巡检我还会挂一个轻量脚本把内网所有服务器的 3.5 状态扫一遍输出成表哪台掉了心里有数# 批量巡检 NetFx3 状态输出 CSV $servers Get-Content D:\scripts\servers.txt $report foreach ($s in $servers) { try { $state Invoke-Command -ComputerName $s -ScriptBlock { (Get-WindowsFeature -Name NET-Framework-Core).InstallState } -ErrorAction Stop [pscustomobject]{ Server $s; NetFx3 $state } } catch { [pscustomobject]{ Server $s; NetFx3 Unreachable } } } $report | Export-Csv D:\scripts\netfx3_audit.csv -NoTypeInformation -Encoding UTF8Unreachable这一类单独看可能是机器关机、防火墙挡了 WinRM也可能是凭据不对别和“没装”混在一起统计。说个我自己的教训。早年做数据库交付头一回遇到 SQL Server 装不上我的第一反应是换安装包、换介质、重装系统折腾了一整天最后发现只是机器连不上更新源。从那以后我每次交付前都强制走一遍预检确认 NetFx3 状态、确认 sxs 目录在不在、确认路径是纯 ASCII。这三步加起来不到两分钟能挡掉后面大半的返工。这份压缩包解压出来就是离线源路径定好命令照抄剩下的交给 DISM。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑