ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Win11离线安装.NET Framework 3.5:sxs源与DISM排错全指南

Win11离线安装.NET Framework 3.5:sxs源与DISM排错全指南

简介:一份针对Win11离线环境安装.Net Framework 3.5的实操文档,面向因安全策略或硬件限制无法联网、却需要运行依赖该框架软件的系统管理员与运维工程师。整个资源打包为单个docx文件,大小仅45KB,内容紧凑,可直接用办公软件打开阅读。文档基于作者真实排错经历编写,先分析了在“启用或关闭Windows功能”中勾选却反复失败、以及下载安装包仍需联网下载等常见问题,再完整给出微软官方推荐方案:从官网获取与当前系统版本一致的ISO镜像,装载后记录盘符,以管理员身份打开终端,执行DISM命令从镜像内的sxs目录离线部署NetFx3,并附上命令执行的成功界面截图。同时归纳了管理员权限不足、镜像版本不匹配、盘符书写错误等注意事项,帮助读者少走弯路。该资源已有8207人学习下载,适合在Win11 22H2及后续版本中快速解决离线安装难题。

1. 离线装 .NET Framework 3.5:别研究玄学,先把源找对

内网机器的装机群里,八成问题最后都落在同一个坑里:软件装了一半,弹窗提示需要 ".NET Framework 3.5",Win11 默认不带这个组件,点"启用该功能"转几圈就报 0x800f0906。更麻烦的是这台机器接不了外网,系统更新被策略锁死,网上"下载安装包双击装"的教程全失效——Win11 里的 3.5 是一个按需启用的系统功能,不是普通 exe 安装包。这篇把踩过的路径完整捋一遍:怎么用系统镜像里的 sources\sxs 源做离线启用,DISM 的 /LimitAccess 参数怎么配,0x800f0954 和 0x800f081f 各自代表什么,装完怎么验证。跑老 ERP、工控软件、财务系统的运维和装机人员,照这篇走一遍就能落地。

2. 先把原理说清:Win11 里 .NET 3.5 为什么不能"双击装"

2.1 "按需启用功能"是什么概念

Windows 11 安装完成后,C 盘里其实只预置了系统正常运行需要的最小组件集,其余组件分为两类:一类是完整内置的,一类是"按需启用功能"(Features on Demand,简称 FOD)。.NET Framework 3.5 属于后者,系统里只有一个"指向",真正的主体文件要等启用时才去拿。

很多老教程让直接下载 dotNetFx35_setup.exe 双击安装,这套路在 Win11 上行不通。因为 Win11 把这个框架纳入系统功能管理之后,独立安装包会被检测到版本不匹配直接拒绝运行,或者装到一半提示"请启用 Windows 功能"。换句话说,启用 3.5 的正确动作是调用系统自带的组件服务(DISM 或 PowerShell 对应的 cmdlet),而不是运行任何第三方安装程序。先认清这一点,后面所有命令和报错就都能对上号。

头一回处理的人最容易在这犯迷糊:以为 3.5 是个"可再发行包",于是满世界找安装包,装上却提示功能未启用。实际上 .NET Framework 3.5 由三部分组成——2.0、3.0 和 3.5 本身,而且自带 SP1,启用后老程序只要声明需要 3.5 SP1 就能直接跑,不需要再单独打补丁。

2.2 离线源在哪:ISO 里的 sources\sxs 是唯一靠谱的"货仓"

在线环境启用 3.5 很简单,系统会自己从更新服务拿文件。离线环境没有这条路,必须给系统指定一个本地源,这个源就是与你当前系统匹配的安装镜像里的 sources\sxs 目录。

用资源管理器双击挂载官方 ISO(或解压到本地目录),进 sources\sxs 目录,会看到一堆 .cab 文件,其中以 microsoft-windows-netfx3-ondemand-package 开头的就是目标。这个包的核心文件清单大致如下:

文件(片段)作用
microsoft-windows-netfx3-ondemand-package~31bf3856ad364e35~amd64~~.cab主包,含 CLR 2.0/3.0/3.5 与 SP1 组件
同前缀 amd64 分支下的语言资源包本地化资源,语言不匹配会直接找不到
NetFx3.capx部分新版镜像里的能力包索引,供 PowerShell 调用

注意这个目录里还混着很多别的 FOD 包(语言、功能模块等),只认 netfx3 前缀,别为了省事把整个 sxs 拿去当源——DISM 虽然也能扫,但会拖慢速度,报错时定位也困难。我一般习惯把 ISO 挂载后直接拿盘符,不复制到系统盘,避免源文件被安全软件拦截。

2.3 版本、语言、SKU 三者匹配:报错八成来自这里

离线安装最大的门槛不是命令,而是"源和系统对不上"。三个维度必须同时匹配:

  • 版本构建号:镜像的 build 必须大于等于当前系统的 build。比如系统是 Win11 24H2,拿 22H2 的老镜像做源,大概率报 0x800f081f。
  • 语言:系统是中文,镜像也得是中文。中英混搭多数时候会直接找不到语言资源包。
  • 架构:amd64 系统的源包必须带 amd64 前缀,arm64 的拿 x64 包同样装不上。

先在自己机器上确认这三个信息,再去找镜像,能省掉一大半试错时间:

winver DISM /Online /Get-CurrentEdition DISM /Online /Get-OSInfo | findstr /i "architecture"

winver 弹窗第一行就是版本号(比如 24H2),Get-CurrentEdition 输出当前 SKU(Professional 或 Enterprise),第三条看架构。把这三个值和 ISO 里 sources\sxs 对应的 cab 文件名比对一遍,版本号大的直接匹配,相同则确认语言的 4 位区段和架构分支,全对再执行安装命令。这一步是血泪经验:我见过有人连着换三个镜像都报 0x800f081f,最后发现是公司发的精简版镜像,sxs 目录被裁剪过,根本不是版本问题。

3. 三种离线安装姿势:DISM、PowerShell 和 GUI 的取舍

3.1 DISM 命令行:离线安装的主力姿势

DISM(部署映像服务和管理工具)是离线装 3.5 最直接的方式,命令本身非常好记。执行前先确认当前登录账户有管理员权限,终端窗口可以右键"以管理员身份运行",否则命令还没跑到一半就被 UAC 拦下来。

挂载好 ISO(假设盘符是 D:),确认 sources\sxs 里能看到 netfx3 的 cab 文件,然后执行:

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:D:\sources\sxs /LogPath:C:\logs\netfx3_install.log /NoRestart

命令执行成功会输出"操作成功完成",这个过程通常在 1~3 分钟内,取决于机器磁盘速度。几个参数的作用值得记清楚:

参数作用
/Online对当前运行中的系统操作
/FeatureName:NetFx3目标是 .NET Framework 3.5 功能,名字就是 NetFx3,不是 NetFx35
/All同时启用该功能的全部子功能(含 WCF、HTTP 激活)
/LimitAccess禁止访问系统更新服务,只用本地源,离线环境的保命参数
/Source:D:\sources\sxs指向本地源目录,DISM 会自己扫出 netfx3 相关包
/LogPath指定日志输出位置,排查时比默认路径好找
/NoRestart装完不自动重启,方便批量脚本自己控制节奏

注意 /Source 指向的是 sxs 这个目录,不是指向某个 .cab 文件。DISM 支持直接给单个 cab,但给目录的好处是它会把配套的语言资源包一起找到,减少一次报错。

3.2 PowerShell 方式:给批量脚本准备的另一种写法

习惯用 PowerShell 的可以用 Add-WindowsCapability,效果和 DISM 一致,但它的能力包命名规则不太友好,名字就是让人容易打错的 "NetFX3~~~~"——三个波浪号,一个不能少。

# 离线启用 .NET Framework 3.5,指定本地 sxs 目录并禁止访问更新服务 Add-WindowsCapability -Online -Name "NetFX3~~~~" -Source "D:\sources\sxs" -LimitAccess # 验证能力包是否已安装 Get-WindowsCapability -Online -Name "NetFX3~~~~"

返回的 State 列显示 Installed 就是成功,显示 NotPresent 说明没装上。这个方式的优势在于更容易集成进 PowerShell 脚本,批量执行时可以用 Where-Object 过滤所有 NetFX3* 能力包做统一检查。它的限制是 Source 路径必须是目录或者 .capx/.cab 文件,且同样要和系统版本、语言匹配,底层逻辑和 DISM 完全一致。选哪种纯粹看个人习惯,效果没有差别。

3.3 GUI 方式:什么时候能用,什么时候必翻车

控制面板路径是"程序和功能"左侧的"启用或关闭 Windows 功能",弹窗里找到".NET Framework 3.5(包括 .NET 2.0 和 3.0)"打勾确认。麻烦在于这个界面默认不接收本地源,它会尝试连接系统更新服务去拿 payload,离线机器上等着等着就报 0x800f0906。

想让 GUI 方式也能离线装,需要先改一处组策略:计算机配置 → 管理模板 → 系统 → Windows 更新 → "指定可选组件安装的设置",启用后填上本地源路径(比如 D:\sources\sxs),同时把"从不尝试通过 Windows 更新 下载负载"勾上。改完重新打开功能窗口点确认,就能从本地源走了。

这个方式适合单机、又不想记命令的场景;批量装机不推荐,策略改动本身也麻烦。装完之后记得把那条策略恢复原状,否则以后在线加装功能可能会被这条策略误导。

4. 装完不算完:验证状态、注册表与日志三件套

4.1 验证命令:功能状态、能力包、注册表、目录一起看

命令回显"操作成功完成"不代表能直接交付,我每次都会把四个层面的状态全部确认一遍,防止"看起来装上了、实际一跑软件就崩"的情况。

# 1. DISM 查看功能状态 DISM /Online /Get-FeatureInfo /FeatureName:NetFx3 # 2. PowerShell 查看能力包是否为 Installed Get-WindowsCapability -Online -Name "NetFX3~~~~" # 3. 注册表确认安装标记 Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" | Select-Object Install, Version # 4. 确认组件目录真实落盘 Test-Path "C:\Windows\Microsoft.NET\Framework\v3.5" Test-Path "C:\Windows\Microsoft.NET\Framework64\v3.5"

DISM 输出里 State 显示 Enabled,同时 Service Pack 版本显示 1,说明 3.5 SP1 已就位。注册表里 Install 值为 1、Version 为 3.5.30729.xx 才算真正的注册成功。目录检查要特别注意 Framework 和 Framework64 两个都要存在,有些应用是 32 位进程却跑在 64 位系统上,只装了前者照样能用,但某些工控插件会去 64 位目录找程序集,找不到就报加载失败。

4.2 日志怎么读:CBS.log 里这几行值得认识

离线装失败时第一反应不应该是重试,而是先打开日志。两个日志文件位置固定:%windir%\Logs\DISM\dism.log 是命令执行过程的精简记录,%windir%\Logs\CBS\CBS.log 是组件服务底层日志,信息量更大也更难看。

# 过滤出和 NetFx3 相关的最近日志行 Select-String -Path "C:\Windows\Logs\CBS\CBS.log" -Pattern "NetFx3" | Select-Object -Last 30

看日志时优先找三样东西:HRESULT 错误码、Win32 error 字段、以及"Failed to get the payload"这类直接点明原因的关键句。比如日志里出现 0x800f081f,意味着源扫描阶段就没找到目标包,问题多半在源路径或版本匹配;出现 0x800f0906 则说明 DISM 试图访问更新服务且被拒,带着 /LimitAccess 再跑一次即可。CBS.log 很长,但错误码离"操作失败"那句越近,参考价值越高。

4.3 顺手把子功能和回滚状态查了

/All 参数会把 3.5 系列的子功能全部启用,包括对老 WCF 服务很关键的 Windows Communication Foundation 支持。如果应用报的直接是 WCF 相关的错(比如找不到 System.ServiceModel 程序集),可以检查一下 C:\Windows\Microsoft.NET\Framework\v3.5\Windows Communication Foundation 目录是否存在,不存在就重新带 /All 启用一次。

另一个容易被忽略的点:装完后系统不一定需要重启,但如果有安全软件或驱动在跑,建议重启一次再交付,否则个别老软件第一次加载 CLR 时会异常退出。批处理里我会用 /NoRestart 让流程可控,到最后统一重启。

5. 离线安装避坑排错:五个高频报错的处置记录

5.1 0x800f0906:报错以为网络断了,其实是没带 /LimitAccess

现象:执行 DISM 后进度条走一半,报 0x800f0906,日志提示"无法从 Internet 下载"。原因:命令里没带 /LimitAccess,DISM 先去更新服务找源,离线机器连不上就中断了。解决:命令末尾加上 /LimitAccess /Source:指向本地 sxs,强制断掉对外访问路径。

5.2 0x800f081f:源路径看着没问题,文件就是找不到

现象:挂载 ISO 后 /Source 指定的路径明明能打开,sxs 里也有 netfx3 的 cab,却报"找不到源文件"。

原因有三个,逐个排查:一是镜像 build 比当前系统旧,二是语言区段不一致,三是挂载盘符在命令执行时被占用或安全软件拦截。解决:用第 2 章的三个查询命令核对版本和语言,重新挂载 ISO 换个盘符,再不行把 sxs 目录复制到本地磁盘用真实路径代替盘符。精简版镜像裁剪过 sxs 的,直接换官方完整 ISO。

5.3 0x800f0954:不是网络问题,是策略在捣鬼

现象:离线机器跑 DISM 报 0x800f0954,提示"未指定的错误",回头查 CBS.log 发现目标源指向内网更新服务器且连不上。

原因:组策略或注册表把可选组件安装源指向了内网 WSUS,而内网服务器里没有对应包,或者策略本身禁止从未批准的源安装。解决:命令带 /LimitAccess 只走本地源,很多情况下能绕过;如果仍报错,到组策略里把"指定可选组件安装的设置"改为禁用或填充本地源路径。改注册表 HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate 下相关键也可以,但组策略界面更直观,改动也更好回滚。

5.4 0x800f0922:不是卡死,是等着一件还没做完的事

现象:命令执行几秒后报 0x800f0922,看起来像磁盘或权限问题,日志提示"另一个安装正在进行"。

原因:系统存在挂起的重启操作,或者组件服务被其他任务占用,DISM 拒绝并发处理。解决:先看右下角有没有"重启以完成更新"的提示,有就先重启;没有就检查 Windows Modules Installer 服务(TrustedInstaller)是否空闲,再重新执行命令,批处理里统一加 /NoRestart 并且每次装前先查一次重启状态。

5.5 镜像本身翻车:cab 损坏和"非官方精简"两个暗坑

现象:命令执行到中途报 0x800f0831,日志显示解包失败或哈希校验不过。

原因:镜像下载时被截断、U 盘制作工具没写完,或者镜像本身是第三方精简版。精简镜像常把 FOD 目录删得七零八落,只留了安装系统必须的文件,表面看 sxs 里确实有 netfx3 文件,实际内容已被裁剪。解决:换官方完整镜像重新挂载;用工具校验镜像的哈希值;复制到本地时确认不是零字节文件。这个坑最隐蔽,因为报错不直接指向镜像,第一次遇到很容易对着系统参数排查半天。

6. 进阶用法:内网批量部署与无人值守注入

单机装完不算本事,能把内网几十台机器一次性处理掉才算真正解决痛点。这里给两个常用路子,一个是装完系统后的批量补救,一个是做系统镜像时直接预埋。

批量补救用 PowerShell 远程执行,前提是目标机器已开启 WinRM 远程管理,并且执行账户对这些机器有管理员权限。源目录放在内网共享上,机器账户要对共享有读取权限:

# 批量离线启用 .NET Framework 3.5,日志集中回写到共享 $computerList = @("PC01", "PC02", "PC03") $sourcePath = "\\内网文件服务器\share\sxs" foreach ($computer in $computerList) { Invoke-Command -ComputerName $computer -ScriptBlock { param($src) $result = DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:$src /NoRestart $result | Out-File "\\内网文件服务器\share\logs\$env:COMPUTERNAME-netfx3.log" -Encoding utf8 } -ArgumentList $sourcePath }

脚本把 DISM 的输出重定向到共享日志目录,机器名自动带进文件名,装完统一检查日志里的"操作成功完成"即可。注意 WinRM 在加入域的环境默认可用,工作组环境要提前配信任主机列表。

如果是从零做系统镜像,可以在无人值守应答文件里直接预置 3.5,省掉后期补救。在 specialize 阶段注入 NetFx3 组件:

<settings pass="specialize"> <component name="Microsoft-Windows-NetFx3" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"> <NetFx3>true</NetFx3> <Source>D:\sources\sxs</Source> </component> </settings>

Source 指向安装介质上的 sxs 目录,部署时系统会自动从这个位置取包。应答文件方式的好处是装机过程中一并完成,交付出去的机器开机即用,不需要再跑任何命令。

从那以后我每次给内网机器装完 3.5,都会强制走一遍第 4 章的验证三连,确认状态、注册表和目录齐全才交机——这套习惯救过我不少次,尤其是镜像版本混乱的时候。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进