ARTICLE DETAIL

资讯详情

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

Win10离线安装.NET Framework 3.5:DISM命令+本地源一步到位

Win10离线安装.NET Framework 3.5:DISM命令+本地源一步到位 单位实验室新配的一台 Win10 内网办公机跑一套老掉牙的检测系统。系统装好软件部署完双击主程序直接弹窗提示“未找到 .NET Framework 3.5”。点“启用该功能”系统就开始转圈转了半天最后告诉我无法连接到 Windows Update 服务。那一刻我就知道又得用老办法搞离线安装了。后来用 DISM 命令加同版本系统镜像里的 sources\sxs 文件夹前后五分钟搞定并且一次成功。这篇文章就是完整记录这套内网离线安装 .NET 3.5 的流程。不光是命令怎么敲还会把原理、参数、报错、批量部署的经验一起说清楚。适合系统运维、装机工程师、软件实施人员以及所有手头有一台不能联网的 Win10 电脑、还非得装老框架的朋友。1. 为什么 Win10 装 .NET 3.5 这么折腾1.1 先搞清楚 .NET 3.5 和 .NET 4.x 完全不是一回事很多人第一反应是.NET 3.5 不是被 .NET 4.8、.NET 6 替代了吗直接装新版不行吗答案是不行。Win10 自带的是 .NET Framework 4.x 运行时而且系统内部很多组件也在用。但老软件当年编译时引用的程序集、API 调用方式是基于 .NET 2.0/3.0/3.5 那套公共语言运行时写的项目里的目标框架写死成了 .NET Framework 3.5你光装 4.8 是认不出来的。Win10 默认镜像里并不是完全没有 .NET 3.5系统镜像的 WinSxS 组件存储里其实带着相关文件。但默认情况下这个功能保持在“未启用”的关闭状态。你需要通过“启用或关闭 Windows 功能”去打开它而这个开关一旦启动系统默认会尝试从 Windows Update 下载完整的组件包来激活。这里就出现了内网机器的死穴没有外网。特别是企业内网、生产隔离网、保密机房这类环境本来就不允许连互联网系统一没有外网源二没有本地源那个开关就是废物。我见过不少同事第一次遇到这台机器就是反复点“从 Windows Update 下载”然后反复失败半小时过去还在原地打转。1.2 内网装不上问题到底出在哪Win10 把 .NET 3.5 当成了“按需功能”也就是 Features on Demand。这种功能的特点是系统默认没有完整组件启用时动态获取源。获取源的优先级就是如果配置了 Windows 更新服务器WSUS先去 WSUS否则去 Microsoft Windows Update如果都连不上就失败所以你在离线环境里点那个开关本质上是让系统自动联网拿文件拿不到自然报错。报错代码常见 0x800F0906、0x800F0907意思就是“找不到源”。还有一种情况是系统装了精简版镜像或者用第三方工具清理过 WinSxS 组件存储人家干脆把 .NET 3.5 相关的备份文件从系统里删掉了。这时候你直接在控制面板里操作就是查了个寂寞必须要手动指定一个本地源目录把功能文件“喂”给系统。1.3 这套方法适用于哪些场景单位内网 / 隔离网 Win10 电脑需要部署依赖 .NET 3.5 的老系统。机房新装系统后批量装软件不想让每台机器都等 Windows Update。现场实施人员在客户那边客户电脑脱网软件必须跑起来。开发环境需要保留老框架但电脑不联网或者网络受限。只要满足“Win10 系统 一个对应版本的原版 ISO 镜像”这套方案基本通吃。Win10 从 1809 到 22H2、LTSC 2019、LTSC 2021 我都试过原理完全一致。2. 离线安装核心方案DISM 命令才是正解2.1 为什么用 DISM而不是控制面板DISMDeployment Imaging Servicing and Management是 Windows 自带的部署镜像服务和管理的命令行工具从 Windows 7 时代就开始承担系统组件启用、清理、修复这类工作。控制面板里的“启用或关闭 Windows 功能”界面虽然友好但它默认的源路径是 Windows Update不能让你手动指定本地目录。DISM 加上了 /Source 参数就可以把安装源指向你准备好的本地目录再加一个 /LimitAccess 参数明确告诉系统“别去碰 Windows Update只认本地源”。这一步就直接解决了离线安装的核心矛盾。我在实际使用中最常用的命令就是这一条必须在管理员权限的命令提示符下执行dism /online /enable-feature /featurename:NetFx3 /All /Source:E:\sources\sxs /LimitAccess简单解释一下每个参数是什么意思/online操作当前正在运行的系统不是去改一个离线镜像文件。/enable-feature启用一个 Windows 功能。/featurename:NetFx3功能名称。.NET 3.5包括 .NET 2.0 和 3.0在这个体系里的功能标识就是 NetFx3。/All启用所有父功能。很多组件有依赖关系比如启用 NetFx3 的时候可能还需要启用相关的 WCF、HTTP 激活等子功能加上 /All 可以把依赖项一并处理避免后续启用失败。/Source:E:\sources\sxs指定功能源文件的位置。这个路径下放的就是 .NET 3.5 功能包文件正常情况下 Win10 原版 ISO 里一定有这个目录。/LimitAccess限制 DISM 只能访问本地源禁止它去 Windows Update 查。整条命令的执行逻辑就是系统去 E:\sources\sxs 目录里找 NetFx3 的功能包找到后直接从本地安装激活全程不需要任何联网请求。2.2 镜像里的 sources\sxs 到底是什么Win10 原版 ISO 镜像除了安装系统时的 install.wim还附带一个组件源目录叫 sources\sxs。这个目录里放的是一些“可选功能”的组件包文件比如NetFx3.cab.NET 3.5 功能包Microsoft-Windows-MediaPlayer-Package媒体功能相关其他按需功能组件DISM 之所以能直接从 sxs 安装就是因为这个目录就是微软留的本地备选源。你打开 ISO 挂载后的盘符找到 E:\sources\sxs会看到里面有一个或多个 .cab 文件。用 dism /online /enable-feature 指向这个目录系统就能把这些 .cab 展开到 WinSxS 组件存储并完成注册。有一点要注意不同版本、不同大版本的 Win10其 sxs 里的组件包并不是完全通用的。比如 Win10 1809 的 NetFx3.cab 文件版本和 22H2 的就不一样。虽然有时候用到一个系统版本也能装上但为了保证绝对成功最稳妥的办法是用和你目标系统相同版本的镜像。你装系统时用的那个 ISO 就是最好的源。2.3 不要踩“网上下载 NET 3.5 离线安装包”的坑我搜索相关热词的时候看到大量人在找“net3.5 离线安装包下载”“win10 .net3.5 安装包”。网上确实有很多第三方打包的“离线包”但我个人非常不建议在生产环境用原因有三个第一来源不可控。你没法确认这个安装包有没有被篡改、有没有捆绑广告或恶意程序。内网环境一旦中招排查成本极高。第二版本可能不对。很多安装包是从旧系统里硬提取出来的 registry 和文件装进 Win10 以后可能导致功能状态显示已启用但实际运行老程序还是缺组件或者系统更新时直接报错。第三不符合干净部署原则。正规的操作应该是让 Windows 自己的组件管理机制来处理功能文件而不是靠第三方向系统里硬塞文件。所以我的建议是优先找原版 ISO 镜像。单位装机一般都有原版镜像或者安装 U 盘直接用那个就够了完全不需要去下载任何第三方离线包。3. 保姆级实操从零到一装好 .NET 3.53.1 第一步确认系统版本和当前状态在动手之前先花半分钟确认系统版本。按下 WinR输入 winver回车。弹出的窗口会显示你的 Windows 版本和内部版本号。比如“Windows 10 企业版 LTSC 2021”“版本 21H2”等等记下这个内部版本号。然后还要看一下当前 .NET 3.5 功能的实际状态避免白忙活。在管理员命令提示符里执行dism /online /get-featureinfo /featurename:NetFx3如果输出的 State 是 Disabled说明功能未启用正好需要处理如果已经是 Enabled就说明系统里其实已经有了程序还提示缺 3.5 的话问题大概率不是框架本身而是软件打包的问题这就不是本文讨论的范围了。另外建议在“控制面板 - 程序和功能 - 启用或关闭 Windows 功能”里看一眼找到“ .NET Framework 3.5包括 .NET 2.0 和 3.0”如果前方复选框是空的和我预期一致。3.2 第二步拿镜像、挂镜像、定位 sxs 文件夹找到和你系统版本一致的原版 Win10 ISO 文件。这里说明一下如果你是拿 U 盘或者镜像装的系统那原来的 ISO 文件很可能还在如果找不到了就找个同版本号的原版镜像。版本必须尽量精确匹配大版本号相同基本都能用精确到小版本更保险。在 Win10 里挂载 ISO 非常简单右键 ISO 文件选择“装载”系统会把它当成一个虚拟光驱自动分配一个盘符。如果你电脑上装了第三方压缩工具双击 ISO 可能会被压缩软件接管那样也能看到文件但不能像光驱一样通过盘符访问所以我习惯直接右键装载。挂载成功后打开文件资源管理器找到新出现的盘符比如 E 盘。然后看能不能找到 E:\sources\sxs 这个文件夹。确认里面有 NetFx3.cab 或类似命名的 cab 文件。如果你的系统是精简版右键可能没有“装载”选项或者装载后没反应。这时候可以用解压软件把 ISO 解压到一个文件夹比如 D:\win10_iso同样能在里面的 sources\sxs 目录下找到组件文件。后面的命令只需要把 /Source 指向这个文件夹里的 sources\sxs 即可。3.3 第三步在管理员命令提示符下执行 DISM 命令开始菜单里搜索 cmd右键选择“以管理员身份运行”。这里强调一下命令提示符必须以管理员权限启动不然 DISM 会直接报“请求的操作需要提升”。假设你的镜像挂载盘符是 E那么执行dism /online /enable-feature /featurename:NetFx3 /All /Source:E:\sources\sxs /LimitAccess正常执行时界面会显示“部署映像服务和管理工具”然后出现进度百分比。这个百分比不是实时刷新特别快要注意别以为它卡住了。我遇到过几次进度在 20% 左右停留十几秒属于正常现象等它自己往下走。最终输出一般是操作成功完成。整个过程通常在几十秒到两三分钟之间取决于磁盘速度和系统状态。如果之前系统组件存储损坏也有可能在这里卡住或报错后面我会专门讲报错处理。命令执行完可以顺手再跑一次查询命令确认 State 是否已变成 Enableddism /online /get-featureinfo /featurename:NetFx3看到 State : Enabled就说明安装成功了。一般情况下不用重启老软件可以直接运行如果遇到个别程序还是提示装不上再重启一次。3.4 第四步验证安装结果别急着收工命令行显示成功大多数时候确实就是成功了但我建议还是做三重验证避免后面软件运行到一半发现还是缺东西。第一看功能开关。打开“启用或关闭 Windows 功能”确认“.NET Framework 3.5”前面的复选框变成了实心勾选状态。有时候这里显示是正确的但系统内部注册有点问题所以还得继续看下面的。第二查注册表和目录。按 WinR 输入 regedit定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5右侧的 Version 值如果是 3.5.30729 左右说明注册信息写入了。同时打开 C:\Windows\Microsoft.NET\Framework如果里面有 v2.0.50727 和 v3.5 两个目录且 v3.5 里有 system.dll 等文件基本可以放心。第三最关键的实测。直接运行之前报错的那个老软件看能不能正常打开。这是最终判据。软件能跑起来就说明环境没问题软件还报错就得看报的是什么错、缺的是哪个依赖那是另一个排查方向。3.5 特殊系统版本的处理细节这里单独说一下 LTSC。Win10 LTSC 2019 和 LTSC 2021 是企业长期服务版很多软件实施人员喜欢拿它做内网系统因为少了很多商店、广告之类的杂七杂八功能。它同样支持离线安装 .NET 3.5只需要用对应版本的原版 LTSC 镜像做源就行。LTSC 2021 的基础版本是 21H2镜像里 sources\sxs 目录一样存在。如果系统是从网上下载的精简版镜像装的里面可能把 sources\sxs 或者 WinSxS 组件备份清理掉了。这时候就算你有 ISO命令打过去也可能报 0x800F081F找不到源文件。遇到这种系统我的建议是不要硬装 .NET 3.5直接换原版系统重装否则后患无穷。你在精简版基础上再怎么修复都很难保证系统完全健康。4. 报错排查离线安装最常见的坑与解法4.1 0x800F081F找不到源文件基本都是源的问题这个错误是最常见的意思是“无法找到请求的源文件”。我踩过几次原因主要集中在三处一是路径填错了。比如镜像挂载后盘符是 F 盘你写成了 E 盘或者 sxs 拼错。这种低端错误检查一遍路径就能发现。二是镜像版本不匹配。Win10 21H1 的 sxs 组件给 Win10 1903 用很可能就不认。解决办法是换一个和当前系统内部版本一致的原版镜像。三是系统精简过度或组件存储坏了。DISM 去指定目录找文件时还要依赖系统自身的组件服务来解包注册如果 WinSxS 本身被清理过或者损坏命令执行过程中会提示源文件损坏或者无法找到。这种情况没法靠命令本身修复建议修复组件存储后重试dism /online /cleanup-image /restorehealth /source:E:\sources\install.wim /LimitAccess注意这里的 /source 是指向镜像里的 install.wim不是 sxs 文件夹。等修复完成后再执行之前的 enable-feature 命令。4.2 0x800F0906 和 0x800F0907系统非要连 Windows Update这两种错误的前因不一样但本质都是功能源获取失败。0x800F0906 是 DISM 想从 Windows Update 下载但连不上0x800F0907 则是本地策略或组策略禁止访问 Windows Update 来获取功能常见于域环境。解决思路很简单先用 /LimitAccess 把系统联网获取的通道彻底关掉让它只能使用 /Source 指定的本地源。再检查命令里有没有写全 /LimitAccess如果已经加了还是报 0x800F0907看看是不是企业有安全策略阻止了 DISM 使用“Windows 更新”作为源这种情况下加 /LimitAccess 是必须的。有一个小细节如果电脑之前连着网可能会优先尝试 Windows Update网速慢或者代理源有问题导致超时。离线环境通常又慢又没结果。所以内网安装时我建议命令里加上 /LimitAccess 不要省。4.3 命令执行了但一直停在初始状态没有报错DISM 安装 .NET 3.5 的时候正常情况下进度条会走一段时间。如果你发现它卡在刚开始的几秒钟完全没有进展、CPU 不高也没有输出大概率是命令没有真正开始执行功能部署而是卡在启动服务和读取源上了。可以先按 CtrlC 停掉检查三件事命令提示符是不是“以管理员身份运行”输入法是不是中文状态导致路径有全角字符镜像盘符是否就绪。另外执行前把杀毒软件暂时退出有些安全软件会拦截 DISM 对系统组件的写操作导致命令悬停。4.4 装完以后功能显示 Enabled软件还是说缺少 .NET 3.5这个情况和功能没装上不太一样。我的判断思路是软件本身依赖的不仅仅是 .NET 3.5 运行时还可能依赖 3.5 的某些子功能。比如 ASP.NET 的老程序、需要 WCF HTTP 激活的老服务这些都要额外启用。DISM 命令加 /All 参数就是一次性启用 NetFx3 及其父功能但有的软件需要的是 WCF 相关的“非默认子功能”这种情况要单独启用dism /online /enable-feature /featurename:WCF-HTTP-Activation /All /Source:E:\sources\sxs /LimitAccess还有一种比较简单的情况——程序是 32 位的老软件但你看的是 64 位版本的运行库。安装完 3.5 后32 位和 64 位两套目录都会有一般不会因为位数问题缺文件。如果验证过关还是报错建议把软件报错的完整日志截图重新判断是不是缺 VC 运行库或者其他依赖。4.5 常见错误速查表我把实操中遇到过的、以及能被搜索到的高频错误整理成一张表方便大家现场对照。错误代码 / 现象可能的直接原因处理方向0x800F081F源文件找不到、路径错、镜像版本不匹配、精简系统缺组件核对路径换同版本原版镜像修复组件存储后再试0x800F0906无法从 Windows Update 下载源加 /LimitAccess 强制离线源确认 sxs 目录路径有效0x800F0907组策略禁止从 Windows Update 获取功能使用本地源 /LimitAccess检查域策略配置命令卡住无输出权限不足、杀软拦截、路径含中文管理员运行临时退出安全软件把 ISO 或文件夹放到纯英文路径装完仍提示缺少 3.5缺少子功能依赖或系统组件损坏补 WCF 等功能重建组件存储后重装0x800F0954DISM 无法从 WSUS 获取源指定 /Source 本地路径加 /LimitAccess0x80070003路径不存在或权限问题检查盘符是否挂载成功、路径大小写、管理员权限需要注意的是有些报错代码长得像但实际原因差异很大排错时先确认环境、路径、版本匹配这三大基础项再去查深层原因。5. 多台内网机器怎么批量部署更省事5.1 把命令做成批处理双击一次搞定单台机器手工敲命令没问题但如果内网有几十台机器要装一台台复制粘贴还是有点烦。我通常会把命令写成一个简单的批处理脚本放在 U 盘里到每台机器上双击运行。脚本不需要很复杂核心逻辑就是确认盘符、执行安装、输出状态echo off cd /d %~dp0 echo 正在从当前目录查找 sources\sxs 组件源... if exist %~dp0sources\sxs\NetFx3.cab ( set SRC%~dp0sources\sxs ) else ( echo 没有找到 sxs 文件请先检查脚本所在目录。 pause exit /b 1 ) echo 开始安装 .NET Framework 3.5请保持窗口打开... dism /online /enable-feature /featurename:NetFx3 /All /Source:%SRC% /LimitAccess echo. echo 安装完成当前状态如下 dism /online /get-featureinfo /featurename:NetFx3 | findstr /i State pause这个脚本的要求是U 盘根目录下放一个 sources 文件夹里面是 sxs 目录的完整内容。也就是把 ISO 里 sources\sxs 文件夹复制到 U 盘脚本放 U 盘根目录。这样到每台机器上插入 U 盘管理员权限双击就能自动安装。之所以不固定盘符是因为 U 盘在不同电脑上分配的盘符不固定直接用 %~dp0 获取脚本当前路径最稳。有人问为什么不把脚本做成静默安装、无窗口。实际上内网部署十几台机器的话保留窗口能看到输出更踏实万一某台机器报错也能当场知道。如果想减少交互可以把 pause 去掉安装完自动退出但这样机器有没有报错就看不到了。我个人建议保留窗口确认批量部署本来就应该逐台确认。5.2 没有原版 ISO只有一台已经装好 3.5 的机器能复制吗有些人在内网折腾的时候发现身边那台机器上已经装好了 .NET 3.5于是想直接把它 C 盘里的 Framework 文件夹和 Winsxs 组件拷过来用。我劝你不要这么干。Windows 组件注册不像绿色软件那样复制文件就能用还涉及系统组件存储识别、注册表项、servicing 数据库记录等一堆东西。直接拷贝不仅大概率装不完整还可能惹出一堆权限和文件占用问题。正确的思路是找到一个同版本的原版 ISO。如果单位里头有装机用的安装 U 盘、PE 工具盘、部署服务器的镜像仓库找一份同版本的原版 ISO 是最现实的。实在找不到可以考虑在能联网的一台电脑上把对应版本的 ISO 文件下载好再通过内网传输把 ISO 拷进去。这对内网环境是允许的因为只是取一次源文件。5.3 更进一步把 .NET 3.5 集成到系统镜像里如果你负责的机器数量很多或者以后要经常做系统重装可以考虑直接把 .NET 3.5 集成到 install.wim 系统镜像里。这样每次装完系统.NET 3.5 就已经是启用状态不用每次手动装。思路大致是把 install.wim 挂载到一个目录然后使用 DISM 添加 NetFx3 功能包最后提交更改、重新生成 ISO。核心命令参考dism /mount-wim /wimfile:D:\install.wim /index:1 /mountdir:D:\mount dism /image:D:\mount /enable-feature /featurename:NetFx3 /All /Source:E:\sources\sxs /LimitAccess dism /unmount-wim /mountdir:D:\mount /commit这一步需要你对 DISM 的镜像操作比较熟悉而且要小心不要损坏 install.wim。如果公司有标准化镜像管理流程这个做法能省很多事。如果只是偶尔部署几台机器直接跑之前的脚本就够了不必非要去集成镜像。6. 写在最后的实操体会这套离线安装 .NET 3.5 的方法我在好几台不同版本的 Win10、Win11 上都实测过稳定性很高。要说最核心的经验就一句话源文件的版本必须和系统匹配命令里的 /LimitAccess 参数别省略。版本匹配决定了 DISM 能不能识别组件/LimitAccess 决定了它会不会偷偷去联网浪费你的时间。我刚开始帮同事装的时候就因为没加 /LimitAccess命令一直卡在 Windows Update 的等待上十分钟都没动静后来强制停止、补上参数二十秒就装完了。另外一个小细节如果是在远程桌面里执行确保会话有管理员权限如果系统开了 UAC批处理脚本右键要以管理员身份运行否则命令会直接失败。最后装完千万别着急把 ISO 删了新装的其他软件如果还需要什么可选功能组件这个原版镜像还能继续当本地源用。留着它就是给你自己留了一条省心路。
返回列表