ESD = Electronic Software Download,是微软高度压缩加密的离线映像格式(UUP 更新介质默认格式);原生 DISM 不支持直接对 ESD 执行 /Apply-Unattend ,ESD → 解密转换为 WIM → DISM 挂载 WIM 注入 unattend →(可选)再转回 ESD;不能直接挂载 ESD 并 Apply-Unattend

应答文件 (unattend.xml) | Microsoft Learn

PS C:\WINDOWS\system32> dism /?

部署映像服务和管理工具
版本: 10.0.26100.5074


DISM.exe [dism_options] {Imaging_command} [<Imaging_arguments>]
DISM.exe {/Image:<path_to_offline_image> | /Online} [dism_options] {servicing_command} [<servicing_arguments>]

描述:

  DISM 枚举、安装、卸载、配置和更新 Windows 映像中的功能和程序包。可以使用的命令取决于提供的映像以及映像是处于脱机还是运行状态。


FFU 命令:

  /Capture-Ffu            - 将物理磁盘映像捕获到新的 FFU 文件中。
  /Apply-Ffu              - 应用 .ffu 映像。
  /Split-Ffu              - 将现有 .ffu 文件拆分成多个只读已拆分 FFU 文件。
  /Optimize-Ffu           - 优化 FFU 文件,使其其可应用于不同大小的存储
。

WIM 命令:

  /Apply-CustomDataImage  - 冻结自定义数据映像中包含的文件。
  /Capture-CustomImage    - 将自定义设置捕获到 WIMBoot 系统上的增量 WIM 文件中。捕获的目录包括所有子文件夹和数据。
  /Get-WIMBootEntry       - 显示指定磁盘卷的WIMBoot 配置项。
  /Update-WIMBootEntry    - 更新指定磁盘卷的 WIMBoot 配置项。
  /List-Image             - 显示指定映像中的文件和文件夹的列表。
  /Delete-Image           - 从具有多个卷映像的 WIM 文件删除指定的卷映像。
  /Export-Image           - 将指定映像的副本导出到其他文件。
  /Append-Image           - 将其他映像添加到 WIM 文件中。
  /Capture-Image          - 将驱动器的映像捕获到新的 WIM 文件中。捕获的目录包含所有子文件夹和数据。
  /Get-MountedWimInfo     - 显示有关安装的 WIM 映像的信息。
  /Get-WimInfo            - 显示有关 WIM 文件中的映像的信息。
  /Commit-Wim             - 保存对安装的 WIM 映像的更改。
  /Unmount-Wim            - 卸载安装的 WIM 映像。
  /Mount-Wim              - 从 WIM 文件安装映像。
  /Remount-Wim            - 恢复孤立的 WIM 安装目录。
  /Cleanup-Wim            - 删除与损坏的已安装 WIM映像关联的资源。

通用映像处理命令:

  /Split-Image            - 将现有 .wim 文件拆分为多个只读拆分 WIM (SWM) 文件。
  /Apply-Image            - 应用一个映像。
  /Get-MountedImageInfo   - 显示有关安装的 WIM 和 VHD 映像的信息。
  /Get-ImageInfo          - 显示有关 WIM、VHD 或 FFU 文件中映像的信息。
  /Commit-Image           - 保存对装载的 WIM 或 VHD 映像的更改。
  /Unmount-Image          - 卸载已装载的 WIM 或 VHD 映像。
  /Mount-Image            - 从 WIM 或 VHD 文件装载映像。
  /Remount-Image          - 恢复孤立的映像装载目录。
  /Cleanup-Mountpoints    - 删除与损坏的已安装映像关联的资源。

映像规格:

  /Online                 - 以正在运行的操作系统为目标。
  /Image                  - 指定脱机 Windows 映像的根目录的路径。

DISM 选项:

  /English                - 用英文显示命令行输出。
  /Format                 - 指定报告输出格式。
  /WinDir                 - 指定 Windows 目录的路径。
  /SysDriveDir            - 指定名为 BootMgr 的系统加载程序文件的路径。
  /LogPath                - 指定日志文件路径。
  /LogLevel               - 指定日志(1-4)中所示的输出级别。
  /NoRestart              - 取消自动重新启动和重新启动提示。
  /Quiet                  - 取消除错误消息之外的所有输出。
  /ScratchDir             - 指定暂存目录的路径。

若要获得有关这些 DISM 选项及其参数的详细信息,请在紧挨着 /? 之前指定一个选项。

  示例:
    DISM.exe /Mount-Wim /?
    DISM.exe /ScratchDir /?
    DISM.exe /Image:C:\test\offline /?
    DISM.exe /Online /?

DISM 管理 ESD 映像 + 注入 Unattend 无人值守脚本 完整解构文档

前置核心结论 ESD = Electronic Software Download,是微软高度压缩加密的离线映像格式(UUP 更新介质默认格式);原生 DISM 不支持直接对 ESD 执行 /Apply-Unattend、离线修改组件这类高级离线服务操作,和 WIM 存在本质能力鸿沟。 整体流程:ESD → 解密转换为 WIM → DISM 挂载 WIM 注入 unattend →(可选)再转回 ESD;不能直接挂载 ESD 并 Apply-Unattend。

一、底层原理

1. ESD 与 WIM 底层差异

  • WIM:基于单实例压缩(LZX/LZMS),文件结构开放,支持直接挂载、读写、离线服务(Apply-Unattend、添加驱动 / 更新)
  • ESD:基于LZMS 极限压缩 + 加密块,属于 UUP 专用分发格式,内部结构封装,不支持直接读写挂载、不支持离线事务修改;ESD 本质是只读分发包,不是可直接编辑的服务映像。

2. DISM 处理 ESD 的两套底层逻辑

1)只读查询类(原生直接支持) dism /Get-WimInfo /WimFile:xxx.esd 底层:wimapi2.dll内置 ESD 解析器,仅读取元数据、索引清单,不加载可修改的映像层

2)离线修改 / 注入 unattend(无法直接 ESD 执行/Mount-Wim/Apply-Unattend/Add-Driver/Add-Package 这类能力仅可作用于 WIM。 底层限制:ESD 没有可读写的挂载事务层,CBS、unattendparser 引擎无法直接对加密 ESD 块落地配置。 ✅ 标准链路: ESD(只读) → dism /Export-Image 转WIM → DISM挂载WIM + /Apply-Unattend注入unattend →(可选)Export-Image再压缩回ESD

3. Unattend 注入在 ESD 场景的执行时序

原始ESD介质
    ↓
DISM Export-Image 导出为标准WIM(解密解压)
    ↓
DISM /Mount-Wim 挂载WIM
    ↓
DISM /Image:挂载目录 /Apply-Unattend /Unattend:xxx.xml
    ↓
【和普通WIM逻辑一致】
offlineServicing节点 → DISM直接执行落地
specialize/oobeSystem节点 → 预埋unattend文件到映像Panther\UnattendGC、写入Setup注册表标记
    ↓
DISM /Commit /Unmount-Wim 保存修改后的WIM
    ↓
(可选)DISM Export-Image 将修改完成的WIM重新压缩生成ESD
    ↓
使用新ESD部署:Setup会自动解压ESD,加载内置unattend,在对应pass执行配置

4. 关键底层细节

ESD 转 WIM、WIM 转 ESD 本质是映像重打包,不是原地修改;重打包会重新生成完整文件哈希,文件体积会明显变化:

  • ESD 压缩率更高(体积最小),但耗时最长
  • WIM 压缩率适中,支持编辑修改

二、依赖文件清单

表格

文件 核心作用
dism.exe DISM 主入口
dismcore.dll DISM 核心框架,管理映像导出 / 转换事务
wimapi2.dll WIM/ESD 通用解析、导出引擎,负责 ESD 解密解压
unattendparser.dll unattend.xml 解析(仅在 WIM 挂载阶段生效)
cbs.dll / cbsapi.dll offlineServicing 阶段组件落地(仅 WIM 模式可用)
setupapi.dll 写入 Panther cbs.log/setupact.log
windeploy.exe 部署阶段执行 specialize/oobeSystem 节点
msoobe.exe OOBE 阶段执行 oobeSystem 配置
unattend.xml 三阶段应答模板(WSIM 预校验)

三、依赖关系

  1. 进程依赖
    • ESD 查询:仅 dism.exe + wimapi2.dll,无需挂载
    • ESD 注入 unattend 完整流程:必须经过「ESD→WIM 转换」,所有 unattend 注入动作都发生在 WIM 阶段
  2. 版本依赖 DISM 版本必须匹配 ESD 来源版本;旧版 DISM 不支持新版 UUP 生成的 ESD 解析。Win10 1709 + 才完整支持 ESD 导出能力。
  3. 文件依赖 源 ESD 不能损坏、不能是部分分块 ESD;文件锁占用会导致导出失败。
  4. 前置校验依赖 unattend.xml 必须先用 WSIM 匹配目标 OS 版本,否则节点会被跳过(和普通 WIM 风险一致)

四、完整逻辑链路

① 准备源ESD + 已校验unattend.xml
② dism /Get-WimInfo 读取ESD索引清单(仅元数据读取,不解压)
③ dism /Export-Image 将ESD指定索引导出为标准WIM
④ dism /Mount-Wim 挂载新生成WIM
⑤ dism /Image:<mount> /Apply-Unattend 注入应答
⑥ dism /Unmount-Wim /Commit 保存修改后的WIM
⑦ 【可选】dism /Export-Image 将修改后的WIM重新压缩输出ESD
⑧ 使用新ESD介质部署,Setup运行时自动解压ESD,加载内置unattend自动执行任务

五、配套链

✅ 配套工具

  1. WSIM:制作、校验 unattend.xml,匹配系统组件版本
  2. SetupDiag:部署后解析 Panther 日志,排查 unattend 节点不生效
  3. 之前交付脚本:
    • Batch-WIM-Inject-Unattend.ps1(WIM 注入核心脚本,本流程中间环节直接复用)
    • Check-Unattend-Status.ps1(部署后自动校验脚本)
  4. ProcMon:跟踪 DISM 导出、挂载、写入 unattend 的 IO 行为

✅ 核心标准命令模板

::1. 查看ESD索引(原生直接支持)
dism /Get-WimInfo /WimFile:D:\source\install.esd

::2. ESD索引导出为WIM(关键前置)
dism /Export-Image /SourceImageFile:D:\source\install.esd /SourceIndex:1 /DestinationImageFile:D:\temp\install.wim /Compress:max

::3. 挂载WIM + 注入unattend(和普通WIM完全一致)
dism /Mount-Wim /WimFile:D:\temp\install.wim /Index:1 /MountDir:D:\mount
dism /Image:D:\mount /Apply-Unattend /Unattend:D:\unattend_3pass.xml
dism /Unmount-Wim /MountDir:D:\mount /Commit

::4.【可选】修改完成的WIM重新打包为ESD
dism /Export-Image /SourceImageFile:D:\temp\install.wim /SourceIndex:1 /DestinationImageFile:D:\output\install.esd /Compress:esd

✅ 上下游链路

上游:UUP 下载生成 ESD 介质 中游:ESD→WIM→注入 unattend→可选回写 ESD 下游:PE/Setup 部署、Sysprep、OOBE、UnattendGC

六、边界与高频坑点(重点)

  1. 核心硬限制:DISM 不能直接挂载 ESD,不能直接对 ESD 执行 / Apply-Unattend 网上很多文档误区,直接写/Mount-Wim指向 esd 文件,会直接报错。所有离线修改、unattend 注入必须中转 WIM。
  2. ESD 转 WIM、WIM 转 ESD是全量重打包,不是增量修改,大镜像耗时极长,占用大量磁盘临时空间。
  3. /Compress:esd参数仅 Win10 1709 及以上版本 DISM 支持;老版本无法输出 ESD。
  4. UUP 分块 esd(.esd、.001.esd 这类分片包)DISM 无法直接导出,必须先合并。
  5. 重新生成 ESD 之后,原有 ESD 哈希完全变化,数字签名失效;企业校验介质完整性场景需要重新处理。
  6. ESD 仅支持单实例标准映像,不支持自定义多索引灵活维护(多索引维护优先使用 WIM)。
  7. 和 WIM 共同风险:unattend.xml 组件版本不匹配 → specialize/oobeSystem 节点被跳过;部署后残留 UnattendGC 的 unattend.xml 会反复触发 OOBE。
  8. ESD 部署阶段解压开销更大,老旧 PE 环境可能出现解压超时、部署卡死。

 

使用DISM管理ESD映像并添加无人值守脚本与管理WIM映像类似。以下是使用DISM命令添加无人值守脚本到ESD映像的基本步骤:

  1. 创建无人值守脚本: 创建一个无人值守脚本(通常为XML格式),其中包含您希望在安装过程中执行的任务和设置。

  2. 加载映像: 使用 dism /Mount-Image 命令加载ESD映像文件到一个临时目录中。假设安装映像文件为C:\path\to\install.esd,您可以执行以下命令:

    cmdCopy Code
    dism /Mount-Image /ImageFile:C:\path\to\install.esd /Index:1 /MountDir:C:\Mount
  3. 添加无人值守脚本: 将创建的无人值守脚本复制到挂载的ESD映像中。假设脚本文件名为"unattend.xml",您可以使用以下命令将其添加到映像中:

    cmdCopy Code
    copy C:\path\to\unattend.xml C:\Mount\Windows\Panther\unattend.xml
  4. 卸载映像: 添加完无人值守脚本后,卸载挂载的ESD映像:

    cmdCopy Code
    dism /Unmount-Image /MountDir:C:\Mount /Commit

    此命令将保存对映像所做的更改。

  5. 清理: 清理任何临时文件或目录。

确保在执行这些操作之前备份映像文件,并验证脚本的正确性。

posted @ 2024-04-10 14:56  suv789  阅读(380)  评论(0)    收藏  举报