尧图精选

Windows Server 2012 R2 SxS损坏修复:DISM命令与错误1935排查指南

🕒 发布时间:2026/10/31 12:07:47 📁 来源:尧图网络
简介面向Windows Server 2012 R2 Standard系统管理员与运维人员这份SXS文件包用于修复系统内置.NET Framework 3.5安装失败问题尤其适合离线安装或通过“添加角色和功能”指定备用源路径的环境。资源经发布者亲测可用整个压缩包共收录1568个文件打包体积约85.45MB格式为rar便于下载保存与传输。文件构成以dll动态链接库和exe可执行组件为核心同时涵盖大量config配置、resx资源、sql脚本、aspx页面、browser定义、manifest清单等多种类型文件全面覆盖了.NET 3.5功能组件所需的运行库与辅助文件可帮助服务器在无外网或Windows更新受阻时快速恢复角色安装能力。包内目录按照系统角色和功能模块进行组织结构清晰管理员在部署时可将对应目录直接指定为备用安装源避免逐项排查缺失文件显著缩短排障时间提升批量运维效率。该资源发布以来已有1799人学习下载适合遭遇.NET 3.5安装失败、系统源文件被精简或需要离线部署的Windows Server 2012 R2服务器维护场景。1. Windows Server 2012 R2 Standard 的 SxS 文件这个目录一旦出问题装软件就变成玄学一台跑了五年的 Windows Server 2012 R2 StandardWindows Update 正常远程桌面正常但你在上面装任何一个 MSI 安装包进度条走到一半直接弹“错误 1935。安装程序集 Microsoft.VC80.CRT……期间发生错误。有关详细信息请参阅 Help 和 Support”。重装软件没用换安装包没用最后你翻系统事件日志看到一堆 SideBySide 错误来源是 Windows 的系统组件存储目录 winsxs也就是标题里说的 SxS 文件。这个目录是 Windows 并行程序集Side-by-Side Assembly的存放地老系统上它一旦被更新残留、杀毒软件误删或非正常关机搞坏就会引发上面这一串连锁故障。这篇文章会把 SxS 的排查路径、DISM 修复命令、磁盘清理方式以及我踩过的坑一次讲透。适合正在维护 2012 R2 老服务器的运维、机房管理员以及所有被“并行配置不正确”和 1935 错误折磨过的人。2. 并行程序集存储SxS 目录里到底装了什么Standard 版运维该看什么2.1 并行程序集的概念为什么 Windows 要搞一个共享的版本仓库先说背景。Windows 从 XP 时代开始把系统自带的 VC 运行库、通用控件、Shell 组件从“每个程序各带一份”改成“放进一个公共目录按版本和陈旧标识集中管理”。这个目录就是C:\Windows\winsxs目录全称是 Windows Side-by-Side。应用程序在安装时向系统声明“我需要 Microsoft.VC80.CRT 的 8.0.50727.42 版本”系统去 winsxs 里找对应的程序集找到就注册到系统找不到就报错。这个机制避免了 DLL 地狱但也催生了新的故障模式winsxs 本身被破坏。Windows Server 2012 R2 Standard 和 Datacenter 在组件存储上差异极小两者共享同一套install.wim映像只是授权层不同。所以网上所有针对 2012 R2 服务器版本的 SxS 修复命令在 Standard 版上都能直接用。区别只在于 Standard 版一般跑在物理机或少量虚拟机上磁盘空间比数据中心版更紧张而 winsxs 目录的“虚胖”问题在 Standard 版上往往更早暴露。2.2 三个典型故障信号怎么判断 SxS 是真坏了还是被误报我在现场排查时通常先看三个信号命中两个才动手修 SxS否则可能就是软件自身的兼容性问题信号一事件查看器里大量 SideBySide 错误。打开事件查看器路径是“Windows 日志 → 应用程序”来源是 SideBySide事件 ID 常见的是 33、59、63。错误文本里会直接点名缺失的程序集名称和版本比如Microsoft.VC90.CRT, version 9.0.21022.8。这条错误出现基本能锁定 winsxs 里的某个程序集条目掉了。信号二安装 MSI 文件报 1935 或 1931。这是最经典的 SxS 损坏表现。Windows Installer 在安装托管原生程序集时会去组件存储里注册这些程序集注册失败就直接抛 1935。报错日志里会给出具体程序集名字多半是 VC 运行库或 MSXML。有趣的是同一个 MSI 在桌面版 Windows 10 上装得挺好拿到 2012 R2 上就报 1935这一点很容易误导人以为你的 MSI 文件下载不完整。信号三应用启动直接弹“应用程序无法启动因为应用程序的并行配置不正确”。这个提示对应的错误码是0xc0000152。注意它不是找不到 DLL而是 DLL 找到了但程序集清单校验失败。我处理过一个内部 OA 系统装完 .NET 3.5 后所有依赖 VC 2010 的客户端全部起不来最后排查下来就是 SxS 里 VC10 程序集的清单文件损坏。2.3 检查 winsxs 目录状态一条命令快速摸底不要一上来就跑 DISM先查现状。最常见的摸查命令是列出 winsxs 目录体积和组件存储的健康状态# 以管理员身份运行 PowerShell 或 CMD Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore/AnalyzeComponentStore不会改动系统它只做三件事告诉你在线组件存储的总大小、显示是否可以清理、给出清理后预计能释放多少空间。如果输出里的“组件存储实际使用量”远小于 winsxs 文件夹的“已占用空间”说明里面有大量可替代的旧组件版本SxS 目录虚胖如果连分析命令都报错比如“组件存储已损坏”那问题就不是空间层面而是文件层面的损坏了。再顺手看一眼系统盘剩余空间。如果C:盘剩余空间低于 10%我一般先把临时文件、Windows Update 缓存清掉再继续因为后续的 DISM 修复可能要临时占用几个 GB 空间去展开程序集。空间不够直接修百分之百会失败亏我吃过一次。3. 用 DISM 与 SFC 修复组件存储最小修复命令与参数调优3.1 DISM 的 RestoreHealth 是修复起点不要先跑 SFC很多新手习惯先跑sfc /scannow然后等它报“Windows 资源保护无法修复某些文件”。这个顺序是反的。SFC 是校验和修复系统文件的工具但它的修复源本身就来自组件存储也就是 winsxs。如果 winsxs 坏了SFC 等于拿坏料补坏料结果就是“发现损坏文件但无法修复”。正确顺序一定是先修复组件存储本身再让 SFC 去校验。在 Windows Server 2012 R2 上修复组件存储的命令是# 以管理员身份打开 PowerShell 或 CMD Dism.exe /Online /Cleanup-Image /RestoreHealth这条命令会自动扫描在线系统的组件存储并把损坏的清单、注册表项、文件条目从 Windows Update 拉取源来修复。执行过程中会显示进度百分比从 0 到 100。注意它不等于格式化式的重装修复是增量的只替换判定为损坏的条目所以通常要跑 10 到 30 分钟取决于磁盘速度和组件库规模。如果服务器外网带宽不好或者内网安全策略不允许直接访问 Windows Update就要指定本地修复源。常见的做法是提前准备一个同版本、同语言、同补丁级别的install.wim或 ISO 镜像挂载到系统里# 把 2012 R2 安装镜像里的 sources\install.wim 挂载到 E:\mount # 然后指定 Source 参数指向该 wim 的索引 Dism.exe /Online /Cleanup-Image /RestoreHealth /Source:E:\mount\sources\install.wim /LimitAccess/LimitAccess表示只从指定的源读取不去 Windows Update 找补丁。这个参数在离线机房和高安全区特别有用避免 DISM 一边修一边被安全策略拦断了网络请求。3.2 修复后的验证顺序SFC 扫描加事件日志复查DISM 的 RestoreHealth 跑完后不要立刻宣布修完了。我一般接着跑一次完整校验sfc /scannowSFC 的输出有三类结果未发现完整性冲突发现损坏文件并成功修复发现损坏文件但无法修复。第二种结果是 DISM 修复奏效的直接证据第三种结果说明还有残留问题需要进一步查。查哪里查 CBS 日志。SFC 的详细日志写在C:\Windows\Logs\CBS\CBS.log文件很大通常是几十 MB。要看报错摘要时别用记事本硬翻直接用 PowerShell 过滤# 过滤出无法修复的文件条目和错误码 Select-String -Path C:\Windows\Logs\CBS\CBS.log -Pattern 0x80070005|0x800f081f|0x80073712 | Select-Object -Last 30这三个错误码是 SxS 故障里的高频项。0x800f081f表示找不到修复源文件说明 DISM 没找到匹配的源常见原因是install.wim版本和系统补丁级别不一致。0x80073712表示组件存储损坏到无法读取某些文件条目。0x80070005是权限问题检查是否以管理员身份运行以及杀毒软件是不是锁死了 winsxs 里的文件。事件查看器里也要复查。运行完 SFC 后回到“应用程序”日志里过滤来源为 SideBySide 的事件看最后一条错误的产生时间是不是还在修复之后。如果时间戳变新了说明故障还在持续不要被 SFC 的成功输出迷惑。我见过案例是 SFC 显示修复成功但重启后 1935 错误照旧最后发现是 VC 运行库的两个版本都损坏DISM 修了其中一个另一个还在。所以验证一定要看错误码和时间戳双因素。3.3 2012 R2 的 DISM 版本限制参数不支持时要换 dos 命令Windows Server 2012 R2 自带的 DISM 版本是 6.3.9600。这套版本支持/RestoreHealth /AnalyzeComponentStore /StartComponentCleanup但它没有桌面版 Windows 10 1903 之后新增的一些参数比如/RevertPendingActions和/Cleanup-Image /StartComponentCleanup /ResetBase的行为就有细微差别。尤其注意/ResetBase。在 2012 R2 上用这条参数会把组件存储里所有可被替代的旧版本全部清除只保留当前系统状态所需的版本。听起来很诱人但副作用是清理后如果后来需要卸载某个 Windows 更新卸载可能失败因为旧组件被重置掉了。标准版的 2012 R2 服务器一般带着各种业务系统卸载更新的需求其实不小比如某个补丁和财务软件冲突时你要回滚补丁这时候/ResetBase就是你的敌人。我的底线是在 2012 R2 上除非磁盘空间彻底告急否则不主动加/ResetBase。那 2012 R2 上该用什么方式清理见下一章的命令对比表。4. 清理 SxS 目录释放磁盘空间哪些能删、哪些别碰、命令差异在哪4.1 为什么 winsxs 占了几十 GB却不能在文件管理器里删除SxS 目录的膨胀原理和普通文件夹完全不同。winsxs 里的文件条目通过硬链接和系统其余部分关联同一个 DLL 文件在 winsxs 里和 System32 里指向同一份物理数据但在文件夹视图里会被重复计数。所以你在资源管理器里看到 winsxs 占 20 GB它真实占用的物理空间可能只有 8 GB那 12 GB 是硬链接导致的重复统计。更关键的是winsxs 下的文件一旦被直接删除或改动System32 里对应文件也就没了系统启动链直接断裂。我自己处理过一次手贱的案例同事为了给 C 盘腾空间把 winsxs 下Backup和旧更新文件夹删了结果服务器重启后所有依赖 .NET 的 Web 服务全部起不来。这不是简单的杀毒软件误删是运维主动误删比它更致命。所以核心原则只有一条永远不要在文件管理器里手动修剪 winsxs只能用系统提供的清理接口。4.2 三种清理手段的对比与选择2012 R2 Standard 上可以用的清理手段目前就三个先看表格再选清理方式对应命令 / 入口释放空间能力风险等级适用场景磁盘清理向导cleanmgr.exe勾选“Windows 更新清理”低到中等低日常维护C 盘还能撑住组件存储清理Dism /Online /Cleanup-Image /StartComponentCleanup中等低系统盘剩余空间低于 15%重置基础组件Dism /Online /Cleanup-Image /StartComponentCleanup /ResetBase高中确认未来半年不会卸载任何更新磁盘清理向导的入口在“这台电脑”里对 C 盘右键 → 属性 → 磁盘清理 → 清理系统文件。运行后会扫描到一个叫“Windows 更新清理”的项这一项干的事就是删除替换下来的旧版本更新二进制文件和 DISM 的 StartComponentCleanup 底层逻辑一致只是清理粒度更保守不会动当前仍在用的组件版本。向导方式适合不想敲命令的场合但注意如果是 Server Core 模式或远程会话没有完整桌面你得用cleanmgr.exe /d C:配合cleanmgr /sageset配置。我一般建议在 2012 R2 上清理 SxS 用 DISM 命令而不是磁盘清理向导理由不是吞吐量而是可观测性。DISM 命令的执行日志会写入C:\Windows\Logs\DISM\dism.log清理了多少组件、跳过了哪些条目一目了然。清理向导只给一个总进度出错时你根本不知道卡在哪一步。4.3 清理命令的执行顺序、日志与预期效果执行 StartComponentCleanup 时我会先跑一次分析再决定是否加参数# 第一步先分析看到预计释放空间数字 Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore # 第二步执行标准清理不加 ResetBase保留可卸载更新 Dism.exe /Online /Cleanup-Image /StartComponentCleanup标准清理的耗时通常比 RestoreHealth 还长因为它要遍历整个组件存储替换过期索引并压缩被清理项的目录链表。在机械硬盘上跑两个小时都有可能。执行期间不要强制重启服务器也不要同时跑 Windows Update否则清理队列会被中断残留的待处理标志会让后续所有 DISM 命令都弹“另一个操作正在进行中”。要看清理效果清理结束后重新跑一次AnalyzeComponentStore。对比两个数字组件存储实际使用量和 winsxs 文件夹占用。如果前者大幅下降而后者变化不大这是正常的因为硬链接计数不会立刻回收实际物理空间的释放要等系统写回元数据。这个现象极其容易让人误以为命令没生效我就见过有同事连续跑三次清理把系统搞得更新队列堵塞最后只能重启回滚。记住一个判断准则看物理磁盘剩余空间不要盯文件夹大小。清理完成后重启一次服务器是必要的。2012 R2 的组件存储清理涉及大量文件句柄的释放不重启的话独占句柄的文件不会真正落盘。重启后打开事件查看器确认没有来源为Servicing或Component Based Servicing的错误事件就可以收工了。5. Windows Server 2012 R2 上 SxS 修复的避坑记录五个真实翻车现场5.1 DISM 卡在 20.0% 不动一卡就是四十分钟现象执行RestoreHealth时进度到 20% 后长时间停滞控制台既不报错也不走百分比。 原因DISM 在访问 Windows Update 源时网络握手超时或者杀毒软件正在实时扫描 winsxs 目录频繁触发文件锁。20% 附近恰好是 DISM 开始读取组件存储清单的阶段文件锁冲突最集中。 解决断开外网或在防火墙里放行对 Windows Update 的 HTTPS 访问临时暂停杀毒软件实时防护改用/LimitAccess挂载本地源。在 2012 R2 上跑 DISM 修组件存储我从不赌外网通畅任何生产服务器都应该准备本地源镜像。5.2 SFC 报告“无法修复某些文件”但 CBS 日志里没有任何具体文件名现象sfc /scannow输出末尾列出“无法修复”的摘要但打开 CBS.log 找不到对应文件路径。 原因SFC 的修复失败发生在组件存储元数据层而不是文件层。比如程序集清单的哈希值校验失败但文件实体并未缺失。SFC 只记录文件级别的错误元数据错误会进入 CBS 的字符串池直接查看会被淹没。 解决不要逐行翻 CBS.log用Findstr加错误码过滤。先跑DISM /RestoreHealth /Source把元数据修掉再重跑 SFC。如果还不行确认系统是否安装了特定更新后立即运行过 SFC——2012 R2 的更新会在组件存储里写新的持久化条目SFC 在更新后第一次运行往往误报这不算真损坏重启两次再扫描就好。5.3 手动把 winsxs 底下的旧更新文件夹挪到别的盘想让 C 盘“瘦身”现象C 盘告急有运维把C:\Windows\winsxs\Install或乱码命名的子目录移动到 D 盘然后系统开始出现大量程序集激活失败部分服务无法启动。 原因winsxs 下的目录不是独立数据而是硬链接集合的锚点。移动目录只是改变了路径可见性但注册表里的激活路径仍指向C:\Windows\winsxs\...系统按旧路径去加载时找不到文件。 解决没有恢复捷径。如果文件还在 D 盘只能按原路径结构反向移回来注意保留文件属性和 NTFS 权限如果已经覆盖或删除只能从备份或者相同补丁版本的机器上复制对应程序集再导入。最稳妥的办法是别动使用 DISM 的 StartComponentCleanup 才是受支持的清理通道。5.4 清理完成但 C 盘剩余空间不升反降现象执行完 StartComponentCleanup 之后C 盘剩余空间不仅没变多反而少了 1 到 2 GB。 原因清理过程需要临时展开程序集以完成索引重建这些临时文件存储在系统盘的C:\Windows\Temp和C:\Windows\SoftwareDistribution里。如果清理过程中途有文件占用导致 Temp 里的展开副本未删除空间就被“吃”掉了。 解决清理完成后手动清一遍 Windows Update 缓存目录。停止 Windows Update 服务后删除SoftwareDistribution\Download下的内容再重启该服务。同时把C:\Windows\Temp里三天前的临时文件清掉。注意不要动C:\Windows\Installer目录那是 MSI 事务缓存删了会产生更多 1935 类问题。5.5 修复完 SxS 后装软件还报 1935但换了安装包就好了现象DISM 和 SFC 均报告正常事件日志也没有新 SideBySide 错误但安装某个特定 MSI 仍然报 1935。 原因安装包本身携带的程序集清单与系统版本不匹配。有些老旧安装包把 VC 2008 运行库的合并模块MSM打包到 msi 里这些合并模块在 2012 R2 的组件存储里无法升级注册导致安装时系统拒绝写入。 解决先识别安装包用的是哪个运行库合并模块。用msiexec /a 包名.msi解包后看Program Files里是否有.msp合并模块文件有的话直接用独立的 VC 可再发行组件安装包代替 MSM装完再装原软件。这种情况和 SxS 文件损坏无关属于软件的打包语言太老别在组件存储上反复折腾浪费时间。6. 留一手本地安装源离线修复 SxS 的习惯如果你手上管着超过三台 Windows Server 2012 R2 Standard我强烈建议你把系统安装镜像和最近一年的月度更新包放内网共享里。这个习惯救过我很多次。做法是准备一台文件服务器把 2012 R2 的 ISO 解压后共享sources\install.wim再按Dism /Online /Cleanup-Image /RestoreHealth /Source:\\file-server\share\install.wim /LimitAccess直接引用。注意这台共享服务器本身不能用你要修复的这台机器来带否则源路径解析会把你自己绕进去。进阶一点的做法是用Dism /Export-Image把当前系统的组件库导出成install.wim然后定期更新这个 wim。这样当你系统补丁装到 2024 年之后本地源和系统状态一致修复时就不会出现0x800f081f找不到匹配源的问题。导出命令如下# 运行在相同补丁级别的参考机器上 Dism /Capture-Image /ImageFile:\\file-server\share\2012r2_ref.wim /CaptureDir:C:\ /Name:2012R2_Ref导出时间很长但一年维护一次值得。验证导出源是否可用执行Dism /Get-WimInfo /WimFile:\\file-server\share\2012r2_ref.wim看映像索引和版本信息再找一台测试机跑一次离线 RestoreHealth。最后一条习惯是每次修复 SxS 之前先给系统做一次快照或克隆。2012 R2 已经过了主流生命周期DISM 修复组件存储虽然是官方路径但底层代码不会再有大版本更新遇到冷门损坏时的行为不如新系统可预期。快照是唯一的后悔药几分钟的准备工作能省掉一整天的重装时间。我的个人规范是不做快照不碰 SxS希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →