捕获 Windows 映像时保留驱动程序配置

一种常见的部署方案是从参考计算机捕获单个 Windows 映像,然后将该映像应用于一组采用相同硬件配置的目标计算机。

为了在安装过程中节省时间并加快最终用户的开箱即用体验 (OOBE),可以指示 Windows 安装程序将参考计算机中的驱动程序配置保留为 Windows 映像的一部分。 应该仅在参考计算机上的硬件与目标计算机上的硬件相同时才这样做。 这样,Windows 安装程序会在映像捕获和部署期间保留驱动程序配置。

指示 Windows 安装程序保留驱动程序配置

在捕获映像之前通用化计算机,为此,可以使用一个应答文件来指示 Windows 安装程序保留驱动程序配置。

使用应答文件保留驱动程序配置

  1. 在技术人员计算机上,打开 Windows 系统映像管理器 (Windows SIM)。 单击“开始”,键入“Windows 系统映像管理器”,然后选择“Windows 系统映像管理器”。

  2. 创建新的答案文件,或更新现有的答案文件。 有关详细信息,请参阅创建或打开答案文件有关创作答案文件的最佳做法

  3. 添加 Microsoft-Windows-PnpSysprep/PersistAllDeviceInstalls 设置。 有关详细信息,请参阅本主题的概述部分。

  4. 如果计算机中存在无法检测到的硬件,请包含 Microsoft-Windows-PnpSysprep/DoNotCleanUpNonPresentDevices 设置。 有关详细信息,请参阅本主题的无法检测到的硬件部分。

  5. 使用应答文件通用化计算机。 例如:

    Sysprep /generalize /unattend:C:\unattend.xml
    

概述

Windows 自带的驱动程序包包含支持各种流行硬件的设备驱动程序。 如果特定的硬件需要其他设备驱动程序才能启动,你可以在 Windows 映像中预装其他设备驱动程序。 独立硬件供应商 (IHV) 通常将其他这些设备驱动程序与其设备硬件一起提供。 有关如何添加设备驱动程序的详细信息,请参阅在审核模式下联机添加驱动程序

若要准备要部署到多台计算机的 Windows 映像,必须使用系统准备 (Sysprep) 工具来通用化该 Windows 映像。 通用化 Windows 映像会删除特定于计算机的信息,并为首次启动准备设备驱动程序。 此准备工作包括以下步骤:

  • 删除硬件的设备状态。

  • 将启动关键型驱动程序设置重置为默认值。

  • 删除设备日志文件。

通用化计算机时,请使用包含 Microsoft-Windows-PnpSysPrep\PersistAllDeviceInstalls 设置的应答文件,以节省时间。 此设置可防止 Windows 安装程序删除再重新配置相同硬件的设备状态。 在首次启动时,检测到的设备驱动程序已预先经过配置,从而可能会加速首次启动体验。

重要说明:如果参考计算机上的硬件和硬件配置与目标计算机不同,请避免使用 PersistAllDeviceInstalls 设置。 即使硬件或硬件配置只有细微的差异,也可能导致严重问题或容易忽视的问题。 有关详细信息,请参阅本主题的排查硬件配置有差异的问题

最好不要在主要参考映像中使用 PersistAllDeviceInstalls 设置。 对于采用不同硬件配置的每组计算机,应该首先将主要参考映像加载到采用计划的硬件配置的新参考计算机。 接下来,捕获此设置的新映像并使用 PersistAllDeviceInstalls 设置

有关如何通用化 Windows 映像的详细信息,请参阅 Sysprep(通用化)Windows 安装

有关驱动程序修订版和驱动程序排名的最佳做法

不要在同一映像中保留同一驱动程序包的多个版本或修订版。 使用脱机或联机维护工具更新驱动程序。

通常,当 Windows 安装程序启动某台计算机并且该计算机上存在多个版本的驱动程序包时,安装程序会使用驱动程序排名来确定要安装的驱动程序。 但是,使用 PersistAllDeviceInstalls 设置时,正常的驱动程序排名过程不会发生。 因此,仍可能安装使用过时驱动程序的设备。 有关驱动程序排名的详细信息,请参阅 MSDN 上的 Windows 如何为驱动程序排名

如果必须将某个设备驱动程序添加到使用 PersistAllDeviceInstalls 设置的映像,可使用以下方法之一更新该设备驱动程序

排查硬件配置有差异的问题

若要使 PersistAllDeviceInstalls 设置正常运行,参考计算机和目标计算机上的硬件配置必须相同。 硬件配置包括以下组件:

  • 硬件品牌和型号

  • 固件。 更新、修订版和配置差异可能导致某些设备对匹配的设备驱动程序报告不同的条件或使用不同的资源。 例如:

    • 基于外围组件互连 (PCI) 的设备可在其报告的硬件 ID 中嵌入不同的子系统修订版号。

    • BIOS 修订版可以更改高级配置和电源接口 (ACPI) 命名空间。 这会导致 Windows 安装程序以不同的方式报告现有设备,或将现有设备作为新设备引入。

    • BIOS 系统配置差异可能导致系统设备声明不同的内存、I/O、直接内存访问 (DMA) 或中断请求 (IRQ) 资源。

  • 物理位置。 硬件配置必须使用相同的插槽、端口或插座号连接到外部设备。 例如:

    • PCI 扩展卡必须插入相同的插槽号中。

    • USB 设备必须连接或接线到相同 USB 主机控制器和集成集线器上的相同端口号。

    • 存储设备必须连接到相同的存储控制器和通道。

硬件配置中的低风险、中风险和高风险差异

使用 PersistAllDeviceInstalls 设置时,任何硬件差异都可能导致出现问题。 但有些差异比其他差异更容易造成问题。

低风险差异

对于以下类型的硬件差异,也许可以解决潜在的驱动程序冲突并仍旧使用 PersistAllDeviceInstalls 设置

  • CPU 时钟速度

  • 内存量

  • 硬盘容量

  • 外部输入设备,例如键盘和鼠标设备

  • 监视器

中风险差异

对于以下类型的硬件差异,建议不要使用 PersistAllDeviceInstalls 设置

  • 视频卡

  • 存储驱动器和媒体阅读器,例如光驱和读卡器

  • 内部或集成总线设备,例如 USB 或 1394 设备

存在这种类型的硬件差异时,即使解决潜在的驱动程序冲突,使用此设置也不能缩短安装时间。

高风险差异

对于重大的硬件差异,请不要使用 PersistAllDeviceInstalls 设置。 区别包括:

  • 主板芯片组或 CPU 品牌

  • 存储控制器

  • 外形规格差异,例如从台式机配置更改为笔记本电脑配置,或者从笔记本电脑配置更改为台式机配置

  • 键盘布局差异,例如从标准 101 键键盘更改为日语 106 键键盘

  • Windows 启动卷枚举路径中的任何其他设备

更改硬件配置时可能出现的问题类型

即使硬件或硬件配置只有细微的差异,也可能导致严重问题或容易忽视的问题,例如:

  • 系统不稳定

  • 无法使用设备的某些基本或扩展功能

  • 延长启动时间和安装时间

  • “设备和打印机”文件夹、设备管理器和其他与设备相关的用户界面中的设备命名错误

  • 导致计算机处于不可启动状态的严重系统问题

可能导致系统启动失败的硬件配置差异

如果参考计算机和目标计算机上的启动关键型硬件不同,使用 PersistAllDeviceInstalls 设置可能会导致严重的系统问题,进而导致计算机处于不可启动状态

启动关键型驱动程序包可能属于以下任何 Windows 设备安装类,这些类由驱动程序包中 .inf 文件的 <Version> 节中的 ClassGUID 指令标识

系统提供的设备安装类 ClassGUID

系统

{4D36E97D-E325-11CE-BFC1-08002BE10318}

计算机

{4D36E966-E325-11CE-BFC1-08002BE10318}

处理器

{50127DC3-0F36-415E-A6CC-4CB3BE910B65}

PCMCIA

{4D36E977-E325-11CE-BFC1-08002BE10318}

HDC

{4D36E96A-E325-11CE-BFC1-08002BE10318}

SCSIAdapter

{4D36E97B-E325-11CE-BFC1-08002BE10318}

DiskDrive

{4D36E967-E325-11CE-BFC1-08002BE10318}

CDROM

{4D36E965-E325-11CE-BFC1-08002BE10318}

FDC

{4D36E969-E325-11CE-BFC1-08002BE10318}

FloppyDisk

{4D36E980-E325-11CE-BFC1-08002BE10318}

体积

{71A27CDD-812A-11D0-BEC7-08002BE2092F}

USB

{36FC9E60-C465-11CF-8056-444553540000}

SBP2

{D48179BE-EC20-11D1-B6B8-00C04FA372A7}

1394

{6BDD1FC1-810F-11D0-BEC7-08002BE2092F}

Enum1394

{C459DF55-DB08-11D1-B009-00A0C9081FF6}

键盘

{4D36E96B-E325-11CE-BFC1-08002BE10318}

鼠标

{4D36E96F-E325-11CE-BFC1-08002BE10318}

HIDClass

{745A17A0-74D3-11D0-B6FE-00A0C90F57DA}

端口

{4D36E978-E325-11CE-BFC1-08002BE10318}

有关这些设备安装类的详细信息,请参阅 MSDN 上的系统提供的设备安装类

无法检测到的硬件

将新计算机部署给最终用户时,某些硬件(例如可移动设备或带有开关的设备)在首次启动期间可能不存在或检测不到。 默认情况下,在首次启动时,Windows 安装程序会删除未检测到的硬件的预配置设备状态。

若要部署在首次启动时可能不存在或检测不到的硬件,请将任何适用的设备驱动程序添加到参考映像,连接或打开适用的设备以便 Windows 能够安装它们,然后在捕获映像时使用 Microsoft-Windows-PnpSysprep/DoNotCleanUpNonPresentDevices 设置

重要说明:使用 DoNotCleanUpNonPresentDevices 设置可能导致不必要地存储过多的设备状态并减慢启动速度

排查驱动程序冲突问题

为了避免独立的启动关键型驱动程序包之间存在驱动程序冲突,IHV 必须确保每个设备驱动程序使用不同的服务名称、注册表项值和二进制文件名。

潜在驱动程序冲突的示例

在以下示例中,名为 Fabrikam 的虚构 IHV 生产两种类型的存储控制器:StandardController 和 ExtremeController。 Fabrikam 假设在特定的计算机上每次只会安装一种类型的存储控制器。

驱动程序包将 StandardController 和 ExtremeController 配置定义为使用相同的驱动程序服务名称 storctrl。 storctrl 驱动程序服务使用不同的服务设置,这些设置会根据安装硬件(StandardController 或 ExtremeController)而变化。 由于 StandardController 和 ExtremeController 使用相同的服务,因此它们不能共存。

此示例显示了驱动程序包文件 Storctrl.inf 的内容:

[Version]
Signature = "$WINDOWS NT$"
Class = SCSIAdapter
ClassGuid = {4D36E97B-E325-11CE-BFC1-08002BE10318}
...
[Manufacturer]
%Fabrikam% = Fabrikam,NTx86

[Fabrikam.NTx86]
%StandardController% = StandardController_DDInstall,PCI\VEN_ABCD&DEV_0001
%ExtremeController%  = ExtremeController_DDInstall, PCI\VEN_ABCD&DEV_0002

...

[StandardController_DDInstall.Services]
AddService = storctrl,0x00000002,StandardController_ServiceInstall

[StandardController_ServiceInstall]
ServiceType  = 1 ; SERVICE_KERNEL_DRIVER
StartType    = 0 ; SERVICE_BOOT_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ImagePath    = %12%\storctrl.sys
AddReg       = StandardController_ServiceSettings

[StandardController_ServiceSettings]
HKR,Settings,LowPowerMode,0x00010001,1
HKR,Settings,ErrorCorrection,0x00010001,1

...

[ExtremeController_DDInstall.Services]
AddService = storctrl,0x00000002,ExtremeController_ServiceInstall

[ExtremeController_ServiceInstall]
ServiceType  = 1 ; SERVICE_KERNEL_DRIVER
StartType    = 0 ; SERVICE_BOOT_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ImagePath    = %12%\storctrl.sys
AddReg       = ExtremeController_ServiceSettings

[ExtremeController_ServiceSettings]
HKR,Settings,LowPowerMode,0x00010001,0
HKR,Settings,ErrorCorrection,0x00010001,4
...

如果 StandardController 位于参考计算机上并且在映像捕获期间保留其设置,则 storctrl 驱动程序服务已预先配置。 如果 ExtremeController 位于目标计算机上,Windows 可能会使用旨在用于 StandardController 的预配置设置和文件。 这可能会导致意外结果。

IHV 可使用以下选项之一来帮助解决冲突:

  • 为每项配置单独创建包含不同 .inf 文件的驱动程序包,并在部署期间仅将所需的驱动程序包导入 Windows 映像。 例如,将 Storctrl.inf 拆分为两个不同的 .inf 文件,其中一个版本用于 StandardController,另一个版本用于 ExtremeController,并仅将所需的驱动程序包导入 Windows 映像。
  • 在驱动程序包中为每项配置创建另一个服务。 为每个服务指定不同的名称(例如 storctrl 和 storctrlx),并指向不同的二进制映像文件(例如 Storctrl.sys 和 Storctrlx.sys)。

设备驱动程序和部署概述