首页 / 资讯中心 / 文章详情

Windows Server 2012 离线安装 .NET 3.5 全攻略:DISM 命令与避坑指南

Windows Server 2012 离线安装 .NET 3.5 全攻略:DISM 命令与避坑指南 ★ FEATURED ARTICLE
简介这份资源面向在 Windows Server 2012 R2 等服务器系统上安装 .NET Framework 3.5 受阻的运维与开发人员针对系统提示找不到源文件、要求通过“源”选项指定还原文件位置等典型报错提供一套经实测可用的离线安装解决思路与配套文件。压缩包共 1568 个文件约 99.19MB以 720 个 dll 动态库、180 个 resx 资源文件、84 个 exe 可执行程序为主另含 aspx、config、sql、browser、ini、tlb 等类型覆盖安装组件、配置定义与数据库脚本等用途便于在无外网或源缺失的云服务器环境中完成组件还原。资源已有 10328 人学习下载适合需要为 SQL Server 等业务组件补齐 .NET 3.5 运行环境的读者参考可帮助快速定位源文件缺失原因、理解离线源的组织方式并完成安装验证。1. 离线装 .NET Framework 3.5从报错 0x800F0906 说起一台内网里的 Windows Server 2012SQL Server 安装程序跑到一半弹窗要 .NET Framework 3.5点“安装此功能”转了两分钟最后甩出一个 0x800F0906。这个场景我见过太多次——服务器没有外网Windows 更新拉不到源文件图形界面那条路基本是死的。装不上 .NET 3.5SQL Server 的某些组件、老版管理工具、一批只认 2.0/3.5 运行时的业务程序全都起不来后面所有部署步骤卡在原地。这篇记录的就是我处理这类机器时走通的离线安装流程先确认系统版本和补丁状态再用系统自带的部署工具从本地源安装最后验证运行时真的可用。适合手上有一台不能联网的 Windows Server 2012、又必须把 .NET 3.5 补齐的开发者照着走。2. 装前把环境盘清楚版本、补丁与源文件2.1 先确认系统版本和现有 .NET 状态动手之前别急着双击任何安装包。Windows Server 2012 和 2012 R2 是两个内核版本补丁号、组件名、源文件路径都有差异装错源会直接报“源文件找不到”。我一般先开一个管理员权限的 PowerShell把底账查清楚# 查看系统版本与内部版本号 Get-ComputerInfo | Select-Object WindowsProductName, OsVersion, OsBuildNumber # 查看已安装的 .NET Framework 版本注册表方式最准 Get-ChildItem HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP -Recurse | Get-ItemProperty -Name Version, Release -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -match ^(?!S)\p{L} } | Select-Object PSChildName, Version, Release第一段输出里OsBuildNumber是 9200 就是 Server 20129600 是 2012 R2这个数字决定了后面源文件从哪来。第二段看v3.5这个键如果它存在但Version是 3.5.30729.x说明运行时框架在但“功能”可能没启用如果整个键都没有就是彻底没装。这里有个容易混淆的点——.NET 3.5 在 Windows 8/Server 2012 之后是以“系统功能”形式存在的不是独立安装包所以判断标准是“功能是否启用”不是“有没有安装程序”。2.2 版本选择为什么不是随便找个安装包网上流传的dotnetfx35.exe独立安装包在 Server 2012 上经常装不干净原因是它走的是旧版安装引擎和系统组件存储WinSxS对不上装完可能提示成功但功能列表里还是灰的。正确做法是用系统自带的 DISM 或Install-WindowsFeature从安装介质的sources\sxs目录取源。这也是为什么这类机器上常见一个叫settled_.net3.5install.zip的包——里面通常就是整理好的 sxs 源文件或离线安装脚本省去从 ISO 里翻目录的功夫。版本上要盯住两点一是系统补丁级别Server 2012 至少要打到某个累积更新否则 DISM 加载源时会报组件版本不匹配二是源文件必须和系统同版本同语言英文系统配中文源一样会失败。我一般会先跑一遍Get-HotFix看最近的补丁日期太老的机器先补关键更新再动 .NET。# 列出已安装补丁按日期排序看最近更新 Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10 HotFixID, InstalledOn如果最近补丁停在两三年前建议先把系统补丁补齐。这不是洁癖——DISM 在加载功能源时会校验组件清单清单版本落后于系统组件存储时报错信息往往只有一句“找不到源文件”排查起来非常费劲。2.3 源文件从哪来三种常见来源对比来源获取方式优点坑点系统安装 ISO挂载后取sources\sxs版本绝对匹配ISO 版本要和已装系统一致整理好的离线包如settled_.net3.5install.zip解压免找 ISO目录已整理需确认对应系统版本同版本机器复制从同补丁级别的机器拷sxs补丁状态一致语言包要对得上我一般优先用整理好的离线包因为内网机器找 ISO 挂载本身就要走审批而离线包解压即用。但拿到包之后第一件事是核对目录结构正常的 sxs 源里应该有microsoft-windows-netfx3-ondemand-package.cab这类文件如果只有一堆散装 msu那多半不是给 DISM 用的得换。3. 用 DISM 离线安装 .NET 3.5命令与参数逐个说3.1 解压离线包并确认源路径把settled_.net3.5install.zip解压到一个短路径下比如C:\sxs。路径里不要有空格和中文DISM 对含空格路径的处理在旧版本上偶有翻车。解压后先列一下目录# 解压到 C:\sxs假设压缩包在 D:\pkg 下 Expand-Archive -Path D:\pkg\settled_.net3.5install.zip -DestinationPath C:\sxs -Force # 确认源目录里有 cab 文件 Get-ChildItem C:\sxs -Recurse -Filter *.cab | Select-Object -First 10 FullNameExpand-Archive是 PowerShell 5 起自带Server 2012 默认可能是 3.0没有这个命令就用Add-Type -AssemblyName System.IO.Compression.FileSystem走 .NET 解压或者干脆用资源管理器右键解压。看到 cab 文件列表就说明源结构对上了记下实际路径下一步要用。3.2 DISM 启用功能的核心命令真正干活的就一条命令但参数一个都不能错# 以管理员身份运行从本地源启用 .NET 3.5 功能 DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:C:\sxs逐段解释/Online表示操作当前运行的系统不是离线镜像/Enable-Feature是启用功能/FeatureName:NetFx3是 .NET 3.5 在系统里的功能名注意不是NetFramework3.5/All会连带启用该功能的父功能省得后面又缺依赖/LimitAccess是关键——它阻止 DISM 去 Windows 更新找源强制只用本地源内网机器不加这个参数会卡在联网超时上/Source指向刚才解压的目录。执行过程会走进度条正常几分钟内到 100% 并提示“操作成功完成”。如果中途报 0x800F0906基本就是源路径不对或源文件版本不匹配报 0x800F081F 则是/Source指错了层级——DISM 要的是包含 cab 的那一层目录不是它的父目录。3.3 用 PowerShell 命令做等价操作习惯用 PowerShell 的可以用Install-WindowsFeature效果一样但参数写法不同# PowerShell 方式启用 .NET 3.5指定本地源 Install-WindowsFeature -Name NET-Framework-Core -Source C:\sxs -Restart:$falseNET-Framework-Core是功能名和 DISM 的NetFx3是同一个东西的两种叫法。-Restart:$false表示先不自动重启装完手动确认。这条命令的好处是输出结构化成功会返回Success: True失败会带错误码比 DISM 的文本输出好抓。两种方式选一种就行不要混着跑混跑偶尔会出现功能状态和组件存储不一致的情况。3.4 装完立刻查功能状态命令返回成功不等于功能真的启用我习惯马上复核一遍# 查看 NetFx3 功能状态 Get-WindowsFeature -Name NET-Framework-Core | Select-Object Name, InstallState # 或者用 DISM 查 DISM /Online /Get-FeatureInfo /FeatureName:NetFx3InstallState显示Installed才算数。如果显示Available但命令说成功了多半是源文件只装了一部分组件需要重新指定完整源再跑一次。这一步别省后面 SQL Server 安装器认的就是这个状态。4. 配置收尾与运行时验证别让“装上了”骗了你4.1 注册表与运行时目录的核对功能启用后运行时文件落在C:\Windows\Microsoft.NET\Framework\v3.5和Framework64\v3.5两个目录。我一般会确认这两个目录存在且非空同时看注册表里的版本键# 确认 32/64 位运行时目录 Test-Path C:\Windows\Microsoft.NET\Framework\v3.5\mscorwks.dll Test-Path C:\Windows\Microsoft.NET\Framework64\v3.5\mscorwks.dll # 查注册表版本 Get-ItemProperty HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 | Select-Object Version, Installmscorwks.dll是 .NET 2.0/3.5 共用的运行时核心两个路径都返回 True 才说明双架构都齐了。注册表Install值为 1 表示已安装。有些机器上 32 位目录有、64 位目录空这种半残状态跑 64 位程序会直接报“无法加载运行时”必须补装。4.2 用一个最小程序验证运行时真的能跑光看文件不够得让运行时实际加载一次。最省事的办法是写个几行的 C# 小程序编译运行或者直接用 PowerShell 加载 3.5 的程序集# 强制以 .NET 2.0/3.5 运行时加载一个程序集并输出版本 $asm [System.Reflection.Assembly]::LoadWithPartialName(System.Web) $asm.ImageRuntimeVersion输出应该是v2.0.50727——.NET 3.5 的运行时版本号就是 2.0.50727这是历史遗留不是装错了。如果这里抛异常或者返回空说明运行时注册有问题回到第 3 章重装。这个验证比看功能列表更实在因为它走的是真实的程序集加载路径。4.3 和 SQL Server 安装器的衔接SQL Server 安装程序检测 .NET 3.5 的方式是查功能状态加运行时目录所以前面两步都过了安装器一般就不会再拦。如果仍然提示缺 .NET先别怀疑安装没成功去看安装器日志里它具体查的是哪个键——常见情况是安装器缓存了旧的检测结果重启一次安装器进程即可。我遇到过一台机器功能明明 InstalledSQL Server 还是报错最后发现是安装器以 32 位模式运行、只查了 32 位注册表视图补装 32 位组件后通过。5. 避坑与排查五条踩出来的记录5.1 报 0x800F0906 但源路径明明是对的现象DISM 执行到一半报 0x800F0906提示无法下载源文件可/Source指向的目录里 cab 文件齐全。原因通常是源文件的版本或语言和系统不匹配DISM 校验组件清单时对不上就当作“找不到”。解决核对系统 build 号和源文件对应的系统版本Server 2012 的源不能用在 2012 R2 上语言也要一致英文系统配英文源。拿不准就换一个来源从同版本同补丁级别的机器上直接拷sxs目录最稳。5.2 加了 /LimitAccess 还是去联网现象命令里写了/LimitAccess执行时仍然卡很久然后超时。原因是参数顺序或拼写问题DISM 对参数位置敏感/Source必须跟在/LimitAccess后面且路径不能带尾部反斜杠。解决严格按/Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:C:\sxs的顺序写路径结尾不要加\。另外确认是用管理员权限的 cmd 或 PowerShell 跑的权限不足时部分参数会被静默忽略。5.3 装完功能显示 Installed程序还是报缺运行时现象Get-WindowsFeature显示 Installed但老程序启动报“需要 .NET Framework 3.5”。原因是只装了 32 位或只装了 64 位组件程序按另一种架构加载时找不到。解决检查Framework和Framework64两个 v3.5 目录是否都有mscorwks.dll缺哪个就重新用完整源跑一次 DISM/All参数会补齐依赖。别用独立安装包补容易把组件存储搞乱。5.4 离线包解压后目录层级多了一层现象/Source指向解压目录DISM 报 0x800F081F。原因是压缩包解开后多套了一层文件夹真正的 cab 在C:\sxs\settled_.net3.5install\sources\sxs这种深层路径里。解决用Get-ChildItem -Recurse -Filter *.cab找到 cab 实际所在目录把/Source指到那一层。我一般解压后先跑这条查找命令确认路径再执行安装省得来回试。5.5 装到一半断电或强制中断现象DISM 执行中途机器重启或进程被杀再跑报“另一个安装正在进行”或功能状态卡在 Pending。原因是组件存储处于事务未完成状态。解决先跑DISM /Online /Cleanup-Image /RestoreHealth修复组件存储再重新执行启用命令如果还卡用Get-WindowsFeature看状态必要时先Remove-WindowsFeature再重装。这种时候别硬删目录组件存储的引用关系删不干净后面问题更大。6. 装完怎么验证跑通一套五分钟自检流程装完 .NET 3.5 之后我固定走一遍五分钟自检确认不是“看起来装上了”。第一步查功能状态第二步查双架构运行时文件第三步实际加载一次程序集第四步跑一个依赖 3.5 的最小可执行程序。前三步前面章节都有命令这里补第四步——找一个只认 2.0/3.5 运行时的老工具或者自己编译一个目标框架为 .NET 3.5 的控制台程序双击运行看是否正常退出。# 综合自检功能状态 双架构文件 运行时加载 $feature Get-WindowsFeature -Name NET-Framework-Core $f32 Test-Path C:\Windows\Microsoft.NET\Framework\v3.5\mscorwks.dll $f64 Test-Path C:\Windows\Microsoft.NET\Framework64\v3.5\mscorwks.dll $rt [System.Reflection.Assembly]::LoadWithPartialName(System.Web).ImageRuntimeVersion [PSCustomObject]{ FeatureState $feature.InstallState Framework32 $f32 Framework64 $f64 RuntimeVer $rt }四项输出里FeatureState为 Installed、两个布尔值为 True、RuntimeVer为 v2.0.50727才算真正跑通。任何一项不对按第 5 章的对应条目回查。这套自检我一般会存成一个 ps1 脚本放在机器上以后每次打补丁或迁移环境都跑一遍比凭记忆敲命令可靠。还有一个容易被忽略的点装完之后 Windows 更新可能会尝试用在线源“更新”这个功能内网机器上表现为更新失败但功能被标记为部分可用。我的习惯是装完立刻在组策略或注册表里把 .NET 3.5 的功能更新排除掉避免它被半吊子更新覆盖。具体做法是在HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate下确认没有强制在线修复的策略或者干脆让这台机器走离线补丁流程。从那以后我每次给内网机器补 .NET 3.5都强制先跑一遍版本和补丁核对再解压源、确认 cab 路径最后用那套四项自检收尾——中间任何一步跳过后面都可能用一两个小时去排查一个本可以五分钟确认的问题。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站