DISM.exe /Get-ImageInfo 作用:离线读取 WIM/SWM/ESD 映像元数据、索引、版本、版本标识、内置功能清单,不挂载映像即可查询基础信息;搭配 /Index 可进一步读取映像内部详细信息 适用:Windows ADK、系统部署、WIM 运维、批量定制镜像查看 WIM 文件中的映像信息和功能列表,要将多个功能应用于 WIM 文件,

dism /Get-ImageInfo 完整解构

命令全称:DISM.exe /Get-ImageInfo 作用:离线读取 WIM/SWM/ESD 映像元数据、索引、版本、版本标识、内置功能清单,不挂载映像即可查询基础信息;搭配 /Index 可进一步读取映像内部详细信息 适用:Windows ADK、系统部署、WIM 运维、批量定制镜像

一、底层原理

DISM(Deployment Image Servicing and Management,部署映像服务和管理),dism /Get-ImageInfo 属于离线映像元数据解析模式不会将 WIM 挂载到目录、不启动离线服务栈,仅解析 WIM 文件头部 + XML 元数据。

  1. WIM 底层结构:WIM 是基于单实例存储 (SIS)的归档文件,文件头部包含全局元数据 + 多个映像索引 (Index),每个索引自带[IMAGE_METADATA](版本、SKU、语言、默认启用的 Windows 功能)。
  2. 执行逻辑:
    • DISM 调用 WIMGAPI(Windows Imaging API),直接读取 wim 头部、映像目录元数据
    • 不解压文件、不落地写入临时系统目录,仅内存解析元数据
    • 当附加 /Index:N 参数时,会解析该索引内部的 offline Servicing Metadata,读取可选功能(Features)、包清单
  3. /Mount-Wim 的本质区别:
    • /Get-ImageInfo只读元数据,离线轻量解析,无需占用挂载目录,不需要管理员(部分版本读取本地 wim 需要管理员)
    • /Mount-Wim:把 wim 映射到 NTFS 目录,启动完整离线 servicing 栈,可以增删驱动、包、功能

二、依赖文件

DISM.exe 本体路径:C:\Windows\System32\Dism.exe

  1. 核心 API 库(必须)
    • wimgapi.dllWIM 核心解析库,负责 WIM/ESD/SWM 文件读写、元数据提取(最核心依赖)
    • dismcore.dll:DISM 核心业务逻辑,封装 wimgapi、包管理、功能解析
    • dismprov.dll:提供 Windows 功能、组件清单解析提供程序
    • api-ms-win-core-* 系列 API 集:基础文件、内存、字符串 API
  2. 辅助依赖(读取 Feature 功能列表时加载)
    • servicingstack.dll:离线组件库解析(CBS 离线栈)
    • cmi.dllcmiprovider.dll:组件清单解析
  3. 配套文件(非程序依赖,是 WIM 内部自带)
    • WIM 内部元数据:\$WIM\Metadata、组件清单 CBS Manifest(只有带 /Index 才读取)
  4. 32/64 隔离:SysWOW64 存在独立 32 位 dism.exe / wimgapi.dll,只能解析 32 位相关映像,解析 64 位 WIM 容易异常

三、依赖关系(调用链路)

完整正向调用链路

dism.exe (控制台入口)
        ↓
dismcore.dll 解析命令行参数(识别 /Get-ImageInfo /Index)
        ↓
wimgapi.dll → 打开目标 *.wim / *.esd / *.swm
        ↓
读取WIM头部 + 映像索引元数据(名称、版本、SKU、大小)
        ↓
如果带 /Index:N:
            → dismprov.dll + servicingstack.dll
            → 读取该索引内CBS组件清单、可选Windows功能列表
        ↓
格式化文本输出到控制台

依赖关系总结

  1. dism.exe 强依赖 dismcore.dll + wimgapi.dll,缺少 wimgapi.dll 该命令直接报错无法读取 WIM
  2. 单纯不带 / Index 的基础信息查询,不依赖 CBS 离线栈;只有查询映像内功能清单时才加载 servicingstack 相关组件
  3. 该命令不依赖 WMI、不依赖 rpcss、不依赖 windows update 服务,纯本地文件解析

四、逻辑链路(正常链路 + 故障链路)

✅ 正常链路示例命令:

# 基础:列出WIM所有索引概要信息
dism /Get-ImageInfo /ImageFile:D:\sources\install.wim
# 进阶:读取索引1内部详细信息 + 功能清单
dism /Get-ImageInfo /ImageFile:D:\sources\install.wim /Index:1

✅ 正常流程:文件可访问 → wimgapi 解析成功 → 输出映像版本、SKU、大小、语言、功能列表 ❌ 典型故障链路:

  1. WIM 文件损坏 → wimgapi 返回 ERROR_BAD_FORMAT → 提示无法识别映像
  2. 文件权限不足 → CreateFile 拒绝访问 → 读取失败
  3. ESD 加密压缩映像、旧版 wimgapi 不支持 → 无法解析元数据
  4. 缺少 servicingstack.dll → 基础信息能读出,但功能列表无法展示
  5. SWM 分卷缺失后续分片 → 元数据读取失败

五、配套链(配套命令、工具、注册表、组件)

配套项目 说明
wimlib(第三方开源替代) 跨平台读取 WIM 元数据,功能对标 wimgapi
dism /Mount-Wim /Unmount-Wim WIM 挂载 / 卸载配套命令
dism /Get-WimInfo 旧别名,等价 /Get-ImageInfo(部分文档混用)
Get-WindowsImage (PowerShell) Dism 模块 PowerShell 等价命令(Dism.psd1)
ADK 部署工具包,自带独立版本 dism/wimgapi,可在 PE 环境使用
CBS 组件库 映像内部可选功能清单的数据源
oscdimg ISO 打包配套工具
wimlib-imagex ImageX(老工具,DISM 替代 ImageX)

PowerShell 等价原生命令:

Get-WindowsImage -ImagePath D:\sources\install.wim
Get-WindowsImage -ImagePath D:\sources\install.wim -Index 1

六、边界(限制、坑点、约束)

  1. 文件格式支持边界 ✅ 支持:.wim.swm(分卷 WIM)、.esd(高压缩电子下载映像,Win10+ wimgapi 才支持) ❌ 不支持:VHD/VHDX、ISO 原始文件(必须先提取里面的 install.wim)
  2. /Index 参数边界
    • 不加 /Index仅输出索引概要,不会展示功能清单、组件包
    • 增加 /Index:N:才会加载 CBS 栈,输出映像内 Windows 可选功能清单
  3. PE 环境边界 WinPE 内置精简版 DISM/wimgapi,部分老 PE 版本无法解析新版 ESD 映像
  4. 权限边界 读取本地磁盘普通 wim 多数不需要管理员;读取系统目录、只读保护分区内 WIM 需要管理员权限
  5. 版本兼容边界 低版本系统自带的 wimgapi 无法解析新版 Win11 生成的 WIM/ESD(元数据版本升级),需要用新版 ADK 的独立 DISM
  6. 只读边界 /Get-ImageInfo 仅查询,不能修改 WIM 内任何内容;修改映像需要挂载后操作
  7. 大文件性能边界 超大 WIM(几十 GB)元数据解析很快,因为只读取头部,不会遍历全部文件内容

七、补充常用扩展命令 & 报错速查

# 导出信息到文本
dism /Get-ImageInfo /ImageFile:D:\sources\install.wim /Index:1 > wim_info.txt

常见报错:

  • 0x8007000D:WIM 文件损坏、格式无效
  • 0x80070005:权限不足无法读取映像文件
  • 0x800f0805:索引不存在 / 无法读取组件清单(servicing 栈缺失)

目录

  1. dism /Mount-Wim/Unmount-Wim /Cleanup-Wim 完整解构
  2. DISM PowerShell 模块(Dism.psd1)全套命令对照表
  3. WIM/ESD/SWM/VHD 镜像运维标准 SOP

前置说明: 整套能力底层均依赖 wimgapi.dll + dismcore.dll + CBS 离线服务栈;PE、ADK 独立 DISM 和系统内置 DISM 版本存在能力差异;ESD 为高压缩只读映像,部分操作受限。


1 dism /Mount-Wim/Unmount-Wim /Cleanup-Wim 完整解构

1.1 底层原理

/Mount-Wim:将 WIM 索引离线挂载到本地 NTFS 空目录,基于 WIM 单实例存储 (SIS),不会完整解压所有文件,内核通过文件筛选驱动映射文件,启动CBS 离线 servicing 栈,可修改驱动、包、可选功能、注册表。 /Unmount-Wim:卸载已挂载映像,二选一模式:/Commit(保存修改写入原 WIM)、/Discard(丢弃所有变更)。 /Cleanup-Wim:清理残留挂载会话、无效 WIM 挂载点、系统中缓存的 SIS 资源、孤立的脱机 servicing 状态,处理异常崩溃遗留的锁、无法删除的挂载目录。

完整调用链路

dism.exe
    ↓
dismcore.dll 解析参数(Mount/Unmount/Cleanup)
    ↓
wimgapi.dll 打开WIM文件、校验索引、创建SIS映射
    ↓
启动离线CBS栈(servicingstack.dll / cmi.dll)
    ↓
文件系统筛选驱动(wimfltr.sys)把WIM内文件映射到本地挂载目录
    ↓
Unmount:提交/丢弃变更,解除wimfltr映射,释放句柄
    ↓
Cleanup-Wim:枚举系统WIM挂载会话,清理残留句柄、缓存

核心依赖文件

文件 作用
dismcore.dll DISM 核心逻辑、参数调度
wimgapi.dll WIM 读写、索引、SIS 管理核心 API
wimfltr.sys WIM 文件系统筛选驱动(挂载核心内核组件)
servicingstack.dll 离线 CBS 组件 / 包管理
cmi.dll / cmiprovider.dll 组件清单解析
api-ms-win-core-* 基础系统 API 集

依赖关系边界

  1. wimfltr.sys 是挂载必备,PE 精简镜像若缺失该驱动,Mount-Wim 直接失败;
  2. ESD 映像默认只读,可以 Mount 但不能 Commit 提交修改
  3. SWM 分卷 WIM 挂载时需要所有分片文件齐全;
  4. 挂载目录必须为空、NTFS 分区,不能是压缩 / 加密目录

1.2 逻辑链路(正常 + 故障链路)

✅ 标准完整流程

dism /Mount-Wim /WimFile:D:\install.wim /Index:1 /MountDir:D:\mount
→ 修改离线映像(添加驱动、启用功能、替换文件)
→ dism /Unmount-Wim /MountDir:D:\mount /Commit

✅ 丢弃修改

dism /Unmount-Wim /MountDir:D:\mount /Discard

✅ 清理异常残留(挂载崩溃、目录被占用无法卸载)

dism /Cleanup-Wim

❌ 典型故障链路

  1. wimfltr 未加载 → 挂载失败,提示缺少筛选驱动
  2. 挂载目录存在文件 / 权限不足 → 0x80070005 / 0x8007000D
  3. 进程占用挂载目录(资源管理器、编辑器打开 mount 内文件)→ Unmount 提交失败
  4. ESD 执行 Commit → 报错,ESD 不支持写入修改
  5. 异常断电崩溃 → 挂载会话残留,目录无法删除,必须执行 Cleanup-Wim

1.3 配套链

  • 配套查询:dism /Get-MountedWimInfo 查询当前已挂载映像
  • PowerShell 等价模块:Dism.psd1 的 Mount-WindowsImage / Dismount-WindowsImage / Remove-WindowsImage
  • ADK 独立 DISM:部署服务器批量镜像制作
  • 配套工具:imagex(旧版,已被 DISM 替代)、wimlib
  • 配套命令:dism /Add-Driver /Add-Package /Enable-Feature(挂载后修改映像)

1.4 边界约束(重点坑)

  1. 挂载数量上限:系统默认并发挂载会话有限,大量并行挂载会直接报错;
  2. 不支持 FAT32/exFAT 挂载目录,强制要求 NTFS;
  3. 系统正在使用的文件无法在离线映像内直接替换(离线模式本身不影响正在运行的 OS);
  4. /Cleanup-Wim 不会主动删除用户自己创建的挂载目录,只清理系统登记的挂载会话与 SIS 缓存;
  5. 新版 Win11 部分环境 wimfltr 驱动有变更,老版本 ADK 无法挂载新版 WIM;
  6. 分卷 SWM 挂载时,修改 Commit 后会重新生成分片,原有 SWM 失效

1.5 常用示例

# 挂载
dism /Mount-Wim /WimFile:D:\sources\install.wim /Index:1 /MountDir:D:\mount
# 提交保存并卸载
dism /Unmount-Wim /MountDir:D:\mount /Commit
# 丢弃修改卸载
dism /Unmount-Wim /MountDir:D:\mount /Discard
# 清理所有残留WIM会话
dism /Cleanup-Wim
# 查询已挂载
dism /Get-MountedWimInfo

2 DISM PowerShell 模块(Dism.psd1)全套命令对照表

模块名称:Dism.psd1,内置在 Windows/ADK,需要管理员,底层封装 wimgapi,推荐生产脚本优先使用 PS 命令,比 dism.exe 更容易自动化捕获返回对象 导入模块:Import-Module Dism

PowerShell Cmdlet 等价 DISM 命令 核心功能
Get-WindowsImage dism /Get-ImageInfo 获取 WIM/ESD/SWM 映像索引概要信息
Get-WindowsImageContent dism /Get-WimInfo /Index:N 列出映像内所有文件路径清单
Mount-WindowsImage dism /Mount-Wim 挂载 WIM 索引到本地目录
Dismount-WindowsImage dism /Unmount-Wim 卸载映像(Commit/Discard)
Remove-WindowsImage dism /Delete-Wim 删除 WIM 内某个索引
Export-WindowsImage dism /Export-Image 导出 / 压缩 / 拆分 WIM,WIM→ESD 转换
Split-WindowsImage dism /Split-Image 将大 WIM 拆分为 SWM 分卷
Add-WindowsDriver dism /Add-Driver 向离线映像注入驱动
Remove-WindowsDriver dism /Remove-Driver 删除离线映像内驱动
Get-WindowsDriver dism /Get-Drivers 查询离线映像内置驱动
Add-WindowsPackage dism /Add-Package 注入 MSU/CAB 更新包
Remove-WindowsPackage dism /Remove-Package 删除离线更新包
Get-WindowsPackage dism /Get-Packages 查询映像内安装包
Enable-WindowsOptionalFeature dism /Enable-Feature 开启系统可选功能(.NET3.5 等)
Disable-WindowsOptionalFeature dism /Disable-Feature 关闭可选功能
Get-WindowsOptionalFeature dism /Get-Features 查询可选功能状态
Repair-WindowsImage dism /Online /Cleanup-Image 在线修复当前运行系统(不是离线 WIM)
Save-WindowsImage dism /Capture-Image 捕获当前系统分区生成新 WIM
Get-WindowsMountedImage dism /Get-MountedWimInfo 查询已挂载映像
Clear-WindowsMountedImage dism /Cleanup-Wim 清理残留挂载会话缓存

简短示例(PS 挂载 + 启用功能)

Import-Module Dism
Mount-WindowsImage -ImagePath D:\install.wim -Index 1 -Path D:\mount
Enable-WindowsOptionalFeature -Path D:\mount -FeatureName NetFx3 -All
Dismount-WindowsImage -Path D:\mount -Save

重要边界

  • Repair-WindowsImage 是在线系统修复,不能用于离线 WIM;
  • Export-WindowsImage 可以实现 WIM 转 ESD(高压缩);
  • 该模块在精简 PE 中可能缺失,只能回退 dism.exe;
  • PowerShell 对象输出便于批量巡检、导出报表,适合域自动化脚本。

3 WIM/ESD/SWM/VHD 镜像运维标准 SOP

适用场景:装机镜像定制、批量母盘制作、离线更新注入、镜像归档、故障修复 前置区分 4 种格式核心特性 | 格式 | 可读写 | 挂载修改 | 典型用途 | |---|---|---|---| | WIM | ✅ | ✅ | 通用部署镜像,可多索引 | | ESD | ❌只读 | ✅挂载但不能 Commit | 微软官方下载高压缩镜像 | | SWM | ✅ | ✅ | 分卷 WIM,适合 FAT32U 盘(单文件 4G 限制) | | VHD/VHDX | ✅ | ✅(Attach) | 虚拟磁盘,可直接 Hyper-V 启动 |

SOP 总流程

Step1 镜像信息采集(基线核验)

  1. 校验文件哈希,确认镜像未损坏
  2. 读取索引、版本、SKU、内置包、可选功能
    Get-WindowsImage -ImagePath D:\install.wim
    Get-WindowsImage -ImagePath D:\install.esd -Index 1
  3. 确认是否为 ESD 只读镜像(提前规避 Commit 报错)

Step2 镜像修改准备

  1. 创建空 NTFS 挂载目录
  2. 清理历史残留挂载会话
    Clear-WindowsMountedImage
  3. 挂载映像
    Mount-WindowsImage -ImagePath D:\install.wim -Index 1 -Path D:\mount

Step3 离线定制(按需执行)

  • 注入驱动:Add-WindowsDriver
  • 注入累积更新 CAB/MSU:Add-WindowsPackage
  • 开启可选功能:Enable-WindowsOptionalFeature
  • 修改离线注册表(直接修改 mount 目录下\Windows\System32\config\SOFTWARE

⚠️ ESD:本步骤只能查看,不能保存修改

Step4 卸载 & 保存镜像

  1. 确认无进程占用 mount 目录
  2. 提交或丢弃
    Dismount-WindowsImage -Path D:\mount -Save
  3. 可选:导出压缩 / 转 ESD / 拆分 SWM
    # WIM转ESD高压缩
    Export-WindowsImage -SourceImagePath D:\install.wim -SourceIndex 1 -DestinationImagePath D:\install.esd -Compression High
    # 拆分4G单文件SWM
    Split-WindowsImage -ImagePath D:\install.wim -DestinationPath D:\swm\install.swm -FileSize 4096

Step5 VHD/VHDX 分支流程(和 WIM 独立)

VHD 不是 WIM 体系,使用 Diskpart+Dism 配合:

  1. 创建 VHD → 挂载 VHD
  2. 把 WIM 应用写入 VHD 分区 dism /Apply-Image
  3. 配置 BCD 引导,可直接 Hyper-V 启动
# 示例:应用WIM到VHD分区
dism /Apply-Image /ImageFile:D:\install.wim /Index:1 /ApplyDir:V:\

Step6 校验 & 归档

  1. 重新读取镜像信息,验证版本、包是否注入成功
  2. 生成镜像清单报表
  3. 归档原始镜像 + 定制后镜像,记录变更日志
  4. 测试部署验证(虚拟机测试装机)

Step7 异常处理 SOP

  1. 挂载失败 → 检查 wimfltr 驱动、目录权限、是否 NTFS
  2. Unmount 占用报错 → 排查资源管理器 / 编辑器句柄,必要时重启后 cleanup
  3. ESD 提交报错 → 改用 Export 导出为新 WIM 再修改
  4. 镜像损坏 → 使用原始介质重新获取,不要强行修复损坏 WIM

运维禁忌清单

❌ 不要直接在线系统下随意离线注入包 ❌ ESD 镜像不要尝试 Commit 写入 ❌ 不要在压缩 / 加密 NTFS 目录挂载 WIM ❌ 不要并发大量挂载会话 ❌ SWM 修改后原有分片失效,必须使用新生成的分卷

配套巡检脚本扩展点(可直接产出)

  • 批量遍历目录下所有 wim/esd,自动输出版本清单
  • 自动检测镜像是否损坏、索引有效性
  • VHD 批量创建 + WIM 自动注入一键脚本

目录

  1. dism /Apply-Image/Capture-Image /Export-Image 完整解构
  2. WIM 镜像自动化打包一键工程脚本(批量装机流水线可用)
  3. DISM 离线注入驱动 / 更新包排错 SOP

前置统一说明 三条命令底层均依赖 wimgapi.dll + dismcore.dllCapture/Export 属于 WIM 归档处理,Apply 是将 WIM 内容落地写入分区;不依赖 wimfltr.sys 挂载驱动(和 Mount-Wim 区分开),常用于装机部署、母盘抓取、镜像格式转换。


1 dism /Apply-Image/Capture-Image /Export-Image 完整解构

1.1 dism /Capture-Image(捕获分区 → 生成 WIM)

✅ 作用:抓取正在运行或离线的分区文件,基于单实例存储 SIS 打包生成 WIM 映像,常用于母盘封装。

等价 PS:Save-WindowsImage

底层原理

遍历目标分区文件,通过 wimgapi 做 SIS 去重,写入 WIM 流,生成映像元数据;不会自动执行系统封装(sysprep),仅文件打包。

⚠️ 重点:单纯 Capture 出来的 wim 直接部署会 SID 冲突,生产必须先 sysprep generalize。

调用链路

dism.exe → dismcore.dll → wimgapi.dll → 遍历源分区文件 → SIS压缩去重 → 写入目标WIM

依赖文件

  • dismcore.dll、wimgapi.dll
  • api-ms-win-file-* 基础文件 API
  • 若开启压缩:内置 LZMS/LZX 压缩引擎(wimgapi 内部实现)

边界 & 坑

  1. 默认不捕获分区空闲块、页面文件、休眠文件、系统临时目录;
  2. 支持压缩级别:/Compress:None /Fast /Maximum
  3. 不能直接捕获正在被独占锁定的系统文件(在线捕获需要卷快照 VSS 辅助)
  4. ESD 不能直接 Capture 生成,需要 Capture 后 Export 转 ESD

示例

dism /Capture-Image /ImageFile:D:\母盘.wim /CaptureDir:C:\ /Name:"Win11 企业母盘" /Compress:Maximum

1.2 dism /Apply-Image(把 WIM 释放到分区)

✅ 作用:将 WIM 索引内所有文件释放写入目标分区,装机核心步骤(PE 环境高频使用)

等价 PS:Expand-WindowsImage

底层原理

wimgapi 读取 WIM 流,解压还原文件到目标 NTFS 分区,还原文件安全描述符、权限、目录结构;仅释放文件,不会自动生成 BCD 引导,文件落地后需要单独 bootrec/bcdboot。

调用链路

dism.exe → dismcore.dll → wimgapi.dll → 读取WIM → 解压 → 写入目标分区

依赖文件

dismcore.dll、wimgapi.dll;PE 环境必须具备这两个文件

边界 & 坑

  1. 目标分区必须预先格式化 NTFS;
  2. 不自动处理引导扇区、BCD;
  3. 支持 ESD/SWM 源直接 Apply;
  4. 目标分区空间必须充足(大于 wim 解压后实际占用)

示例

dism /Apply-Image /ImageFile:D:\install.wim /Index:1 /ApplyDir:W:\

1.3 dism /Export-Image(导出 / 转格式 / 压缩 / 拆分索引)

✅ 作用:从源 WIM/ESD 提取索引,输出新映像;核心用途:WIM↔ESD 转换、精简镜像、合并索引、修改压缩级别

等价 PS:Export-WindowsImage

底层原理

wimgapi 读取源映像指定索引,重新 SIS 去重、重新压缩,输出全新 wim/esd,不修改原始文件。

调用链路

dism.exe → dismcore.dll → wimgapi.dll → 读取源索引 → 重新SIS处理 → 输出新映像

边界 & 坑

  1. ESD 本质是高压缩只读映像,只能 Export 生成,不能直接挂载 commit 修改
  2. 可跨格式转换 WIM → ESD / ESD → WIM
  3. 可以提取单索引,剔除多余版本,精简镜像体积
  4. SWM 分卷不支持直接 Export,需要先合并

示例

# WIM转高压缩ESD
dism /Export-Image /SourceImageFile:D:\install.wim /SourceIndex:1 /DestinationImageFile:D:\install.esd /Compress:Recovery
# 提取索引生成精简wim
dism /Export-Image /SourceImageFile:D:\install.wim /SourceIndex:1 /DestinationImageFile:D:\lite.wim /Compress:Maximum

三者汇总配套链

命令 是否需要 wimfltr 是否修改原始 wim 典型环境
Capture-Image 新建文件,不改动源盘 母盘封装、PE
Apply-Image 写入目标分区,不改动 wim PE 装机流水线
Export-Image 新建输出文件,源文件不变 镜像格式转换、精简

配套前置 / 后置工具:sysprep(封装)、bcdboot、bootrec、diskpart(分区预处理)、VSS 快照


2 WIM 镜像自动化打包一键工程脚本(批量装机流水线)

特性:

  1. 自动 Sysprep 通用化 → VSS 快照捕获系统分区 → 输出高压缩 WIM
  2. 自动生成镜像信息清单
  3. 可直接在母机(离线封装环境)执行
  4. 输出日志,适合流水线 CI 调用 ⚠️ 重要:母机提前完成驱动、预装软件、配置优化,关闭杀毒 / 安全软件再运行
<#
WIM母盘自动打包脚本
功能:Sysprep generalize + VSS快照捕获C盘生成WIM,输出镜像信息
#>
#Requires -RunAsAdministrator
$WimOutputPath = "D:\output\win11_master.wim"
$LogPath = "D:\output\build_wim.log"
$TempSnapshotDir = "C:\_wim_snap"
$ImageName = "Win11 Enterprise Master"
$ImageDesc = "批量装机母盘,已sysprep通用化"

Start-Transcript -Path $LogPath

# 1. 创建输出目录
New-Item -Path (Split-Path $WimOutputPath) -ItemType Directory -Force | Out-Null

# 2. Sysprep 通用化(关键,消除SID)
Write-Host "===== 执行Sysprep通用化 ====="
& $env:SystemRoot\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown /quiet
# 👉 注意:sysprep执行后系统会自动关机,如果你想继续脚本自动捕获,需要VSS快照方案(下面快照捕获分支)

<#
【可选:不重启直接快照捕获(适合离线母盘,生产推荐)】
# VSS快照捕获C盘,规避文件锁定
wmic shadowcopy create volume=C:\
# 获取快照路径,然后dism capture快照路径
# 线上生产环境一般采用:sysprep后重启进PE再Capture,最稳妥
#>

# ========== PE环境下的标准捕获代码(流水线主力)==========
<#
dism /Capture-Image /ImageFile:$WimOutputPath /CaptureDir:C:\ /Name:$ImageName /Description:$ImageDesc /Compress:Maximum
# 导出镜像信息清单
dism /Get-ImageInfo /ImageFile:$WimOutputPath > "$(Split-Path $WimOutputPath)\wim_info.txt"
# 计算哈希
Get-FileHash $WimOutputPath -Algorithm SHA256 > "$(Split-Path $WimOutputPath)\wim_sha256.txt"
#>

Write-Host "===== 打包完成,输出文件:$WimOutputPath ====="
Stop-Transcript

PE 端配套一键部署脚本(流水线装机)

# PE环境,diskpart预处理分区后,自动apply wim + 修复引导
$wimFile = "D:\output\win11_master.wim"
$targetDrive = "W:"
dism /Apply-Image /ImageFile:$wimFile /Index:1 /ApplyDir:$targetDrive
bcdboot $targetDrive\Windows /s S: /f UEFI

流水线落地建议

  1. 母机固化基础环境 → 执行 sysprep → 重启进入 PE
  2. PE 内执行 Capture 脚本生成 wim
  3. 自动 Export 转 ESD(可选,缩小 U 盘体积)
  4. 自动输出哈希、版本清单入库
  5. U 盘 / 网络 PXE 分发

3 DISM 离线注入驱动 / 更新包排错 SOP

适用场景:Mount-Wim 挂载离线映像后 Add-WindowsDriver / Add-WindowsPackage 报错

前置基础信息

  • 注入驱动:Add-WindowsDriver 对应 dism /Add-Driver
  • 注入更新包:Add-WindowsPackage 对应 dism /Add-Package(支持 CAB/MSU)

Step1 前置校验(优先执行)

  1. 校验 wim 挂载状态
Get-WindowsMountedImage
  1. 确认映像类型:ESD 只读映像不能提交修改,必须先 Export 导出成 WIM 再注入
  2. 校验挂载目录:NTFS、无压缩、无加密、目录为空、无资源管理器占用
  3. 校验文件完整性:wim 无损坏,dism /Get-ImageInfo 可正常读取索引
  4. 校验驱动 / 包文件:
    • 驱动:必须有 inf 文件,不要直接 exe
    • 更新包:CAB 标准包;MSU 需要离线适配对应系统版本

Step2 分类报错快速定位

报错码 根因 处理方案
0x800f081e 包不适用当前映像版本 更新包版本和系统不匹配,更换对应版本 CAB
0x80070005 权限不足 / 文件占用 管理员运行,关闭所有打开 mount 目录的程序
0x800f0823 CBS 组件清单损坏 源 wim 本身组件库损坏,更换原始干净 wim
0x8007000D INF 无效、驱动包损坏 重新提取原厂驱动 inf
0x800f0805 映像版本不支持该功能 / 包 核对系统 SKU(家庭版不支持部分企业包)

Step3 标准排查流程

  1. 单独测试单包 / 单驱动注入(排除批量文件中某一个坏文件)
    Add-WindowsDriver -Path D:\mount -Driver D:\drivers\single.inf
  2. 查看 CBS 离线日志(最核心排错依据)

    日志路径:D:\mount\Windows\Logs\CBS\CBS.log

  3. 清理旧挂载会话,重新挂载
    Clear-WindowsMountedImage
    Dismount-WindowsImage -Path D:\mount -Discard
    Mount-WindowsImage -ImagePath D:\install.wim -Index 1 -Path D:\mount
  4. 若离线 CBS 栈异常:使用同版本 ADK 的 DISM,不要用老系统自带 dism 处理新 Win11 镜像
  5. 驱动签名问题:测试可临时允许未签名驱动(生产必须带微软 WHQL 签名)

Step4 兜底修复方案

  1. 原始 wim 干净重新导出(Export-WindowsImage),基于新 wim 重新注入
  2. 不要在在线系统直接离线注入大量包,优先 PE / 独立部署机操作
  3. 大批量注入建议循环脚本 + 捕获输出日志,定位失败文件

Step5 生产禁忌

❌ MSU 直接离线注入容易异常,优先提取 MSU 内部 CAB 再 Add-Package ❌ 不要混用跨大版本更新包(Win10 包不能直接注入 Win11 镜像) ❌ ESD 镜像直接注入后 commit(必然失败) ❌ 挂载目录放在压缩盘、FAT32

配套一键批量注入模板

Import-Module Dism
$mountPath = "D:\mount"
$driverFolder = "D:\drivers"
$cabFolder = "D:\updates"
Add-WindowsDriver -Path $mountPath -Driver $driverFolder -Recurse
Get-ChildItem $cabFolder -Filter *.cab | ForEach-Object{
    Add-WindowsPackage -Path $mountPath -PackagePath $_.FullName
}
Dismount-WindowsImage -Path $mountPath -Save

使用 dism /Get-ImageInfo 命令来查看 WIM 文件中的映像信息和功能列表。以下是使用示例:

batCopy Code
dism /Get-ImageInfo /ImageFile:路径\文件名.wim

在这个命令中,您需要将 "路径\文件名.wim" 替换为您要查看的 WIM 文件的实际路径和名称。

执行此命令后,您将看到有关 WIM 文件中每个映像的详细信息,包括索引号、名称、描述等。这样可以帮助您确定要使用的映像索引号以及其包含的功能列表。

 


要将多个功能应用于 WIM 文件,您可以使用 dism /Image 命令并结合 /Add-Capability 参数。以下是示例命令:

batCopy Code
dism /Image:路径\已安装映像 /Add-Capability /CapabilityName:功能名1 /CapabilityName:功能名2 /CapabilityName:功能名3

在这个命令中,您需要将 "路径\已安装映像" 替换为已安装映像的路径,而 "功能名1", "功能名2", "功能名3" 则是您要添加的功能的名称。

例如,如果您要向已安装的映像添加 "NetFx3" 和 "TelnetClient" 功能,命令将如下所示:

batCopy Code
dism /Image:C:\Mount\Windows /Add-Capability /CapabilityName:NetFx3 /CapabilityName:TelnetClient

请注意,您需要以管理员权限运行命令提示符才能执行此操作,并且在执行之前,您可能需要将 WIM 文件加载到某个目录中,以便可以修改它。完成后,不要忘记卸载 WIM 文件以保存更改。


在 WIM 文件中关闭多个功能,您可以使用 dism /Image 命令并结合 /Remove-Capability 参数。以下是示例命令:

batCopy Code
dism /Image:路径\已安装映像 /Remove-Capability /CapabilityName:功能名1 /CapabilityName:功能名2 /CapabilityName:功能名3

在这个命令中,您需要将 "路径\已安装映像" 替换为已安装映像的路径,而 "功能名1", "功能名2", "功能名3" 则是您要删除的功能的名称。

例如,如果您要从已安装的映像中删除 "NetFx3" 和 "TelnetClient" 功能,命令将如下所示:

batCopy Code
dism /Image:C:\Mount\Windows /Remove-Capability /CapabilityName:NetFx3 /CapabilityName:TelnetClient

请注意,您需要以管理员权限运行命令提示符才能执行此操作,并且在执行之前,您可能需要将 WIM 文件加载到某个目录中,以便可以修改它。完成后,不要忘记卸载 WIM 文件以保存更改。


 

posted @ 2024-04-09 08:59  suv789  阅读(409)  评论(0)    收藏  举报