Skip to content

生产环境 MDT + WDS 批量装机详细搭建文档 ​

2026 状态说明

Microsoft 已宣布 Microsoft Deployment Toolkit(MDT)立即退休。现有 MDT 安装仍可继续运行,但不再获得功能更新、问题修复、安全更新或未来 Windows 版本兼容性更新。

本文因此定位为:存量环境维护、实验室、迁移过渡,以及已有 MDT/WDS 环境重建参考。新建长期生产部署平台时,应同步评估 Windows Autopilot 或 Configuration Manager OSD。

1. 配置 VMware NAT 网络 ​

如果 Windows Server 运行在 VMware Workstation 中,先为整个实验环境准备一个独立的 NAT 网段。本教程使用 VMnet8:虚拟机通过 NAT 访问外部网络,Windows Server 负责给实验客户端提供 DHCP。VMware 自带 DHCP 必须关闭,避免两个 DHCP 服务器同时分配地址。

1.1 设置 VMnet8 为 NAT ​

建议先关闭实验虚拟机,再打开 VMware Workstation → 编辑 → 虚拟网络编辑器,选择 VMnet8:

如需自动配置 VMnet8,可下载下面的工具:

下载 Configure-VMnet8.exe

VMware VMnet8 NAT 配置

上图配置完后点击 NAT 设置后,进行下面的配置:

VMware VMnet8 NAT 设置

不要同时启用 VMware DHCP

VMware DHCP 和 Windows Server DHCP 同时运行时,客户端可能随机拿到错误的地址、网关或启动信息,导致 PXE 不稳定。关闭 VMware DHCP 后,必须先完成 Windows Server DHCP 角色和作用域配置,测试客户端才会获得地址。

VMware 官方通常将 VMnet8 用作 NAT 网络;实际网关地址以 NAT 设置窗口显示的值为准。VMware 虚拟网络编辑器说明

1.2 将虚拟机连接到 VMnet8 ​

在每台参与测试的虚拟机中打开 虚拟机设置 → 网络适配器:

  1. 选择 自定义:VMnet8。
  2. 确认网卡已连接,并勾选“启动时连接”。
  3. Windows Server、测试客户端和其他实验虚拟机都连接到同一个 VMnet8。
  4. Windows Server 的 DHCP 作用域应使用 192.168.1.0/24 网段,并排除 NAT 网关和主机虚拟网卡所使用的地址。

NAT 网段只负责虚拟机访问外部网络;PXE 测试客户端必须和 DHCP、WDS、MDT 服务器连接到同一个 VMnet8,否则无法从这台服务器获取 DHCP 和 PXE 响应。

2. 准备基础环境 ​

本教程统一以 Windows Server 2025 作为部署服务器系统,并先按 §2.0 配置静态 IP 地址。

2.0 使用 PowerShell 配置静态 IP 和 DNS(加域前必做) ​

本教程固定使用以下实验网络参数:

项目固定值
Windows Server 静态 IP192.168.1.10
子网掩码255.255.255.0(前缀长度 24)
默认网关192.168.1.1
域控本机 DNS127.0.0.1
公网 DNS 转发器114.114.114.114、8.8.8.8

本教程的常见场景是:这台 Windows Server 2025 同时承载 AD DS、DNS、DHCP、WDS 和 MDT。公网 DNS 不能直接填写到域控网卡;域控网卡应指向本机 DNS,公网 DNS 只配置为 DNS 转发器,否则可能无法解析 AD 的域名和 _ldap._tcp 等定位记录,导致加域和 MDT 自动加域失败。微软 DNS 客户端设置最佳实践

运行前确认

以下命令会清除当前网卡的 IPv4 地址和默认路由,再写入固定值。只在这台实验服务器上执行,并确认 VMware 网络编辑器中的 VMnet8 网段确实是 192.168.1.0/24、网关是 192.168.1.1。如果服务器有多块网卡,只保留实际连接 VMnet8 的网卡处于“已连接”状态。

以管理员身份打开 PowerShell,整段执行:

本教程默认本机就是第一台域控。如果使用已有的其他域控,请将脚本中的 $LocalDNS 改为该域控的内网 IP,并跳过后面的本机 DNS 转发器命令。

powershell
$ServerIP = "192.168.1.10"
$PrefixLength = 24
$Gateway = "192.168.1.1"
$LocalDNS = "127.0.0.1"

# 自动选择第一块已连接的网卡;多网卡环境只保留 VMnet8 网卡连接
$Adapter = Get-NetAdapter | Where-Object Status -eq "Up" | Sort-Object ifIndex | Select-Object -First 1
if (-not $Adapter) { throw "没有找到已连接的网卡,请先检查 VMnet8 网络适配器。" }

# 关闭 DHCP,清理旧 IPv4 地址和默认路由
Set-NetIPInterface -InterfaceIndex $Adapter.ifIndex -Dhcp Disabled
Get-NetIPAddress -InterfaceIndex $Adapter.ifIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue |
    Remove-NetIPAddress -Confirm:$false -ErrorAction SilentlyContinue
Get-NetRoute -InterfaceIndex $Adapter.ifIndex -AddressFamily IPv4 -DestinationPrefix "0.0.0.0/0" -ErrorAction SilentlyContinue |
    Remove-NetRoute -Confirm:$false -ErrorAction SilentlyContinue

# 写入固定 IP、网关和本机 DNS
New-NetIPAddress -InterfaceIndex $Adapter.ifIndex -IPAddress $ServerIP -PrefixLength $PrefixLength -DefaultGateway $Gateway
Set-DnsClientServerAddress -InterfaceIndex $Adapter.ifIndex -ServerAddresses $LocalDNS

Get-NetIPConfiguration -InterfaceIndex $Adapter.ifIndex

2.0.1 修改计算机名称(加入域或提升域控前) ​

完成静态 IP 配置后、执行 §2.1 或加入已有域之前,先修改服务器名称。本教程默认使用 MDT01,这样后面的 Bootstrap.ini 示例可以直接对应;如果网络中已有同名计算机,请换成唯一名称,并同步修改后文所有 MDT01。

以本机内置管理员账户打开管理员 PowerShell,执行:

powershell
$ComputerName = "MDT01"

if ($env:COMPUTERNAME -ne $ComputerName) {
    Rename-Computer -NewName $ComputerName -Force
    Restart-Computer
} else {
    Write-Host "计算机名称已经是 $ComputerName,无需修改。"
}

如果名称发生变化,服务器会立即重启。重启后使用 MDT01\实际本地管理员账户名 登录,再继续 §2.1;如果名称没有变化,则直接继续下一步。

客户端、MDT 部署环境和其他域成员的 DNS 应通过 DHCP 统一下发为 192.168.1.10,不要下发公网 DNS。若只是域控提升前临时下载更新,可以暂时使用公网 DNS;完成域控提升后必须改回本机 DNS。

2.1 如何搭建域控制器(新建林) ​

本节适用于环境中还没有任何 AD 域的情况:在一台全新的 Windows Server 2025 上安装 AD 域服务角色,并将其提升为新林中的第一台域控制器。执行本节前,请先完成 §2.0.1 的计算机重命名并重新登录。

必须使用本机内置管理员账户登录

执行本节前,必须使用本机内置管理员账户登录 Windows Server,并用该账户打开管理员 PowerShell 执行域控配置。默认名称通常是 Administrator;如果该账户已经被重命名,就使用重命名后的实际名称。不要使用普通本地用户、域账户,或通过“运行方式”临时切换到其他账户来执行。

如果该内置管理员账户密码为空,Install-ADDSForest 会在前置条件检查阶段失败,提示本地管理员账户密码不符合要求。请先通过计算机管理设置密码:

  1. 按 Win + R,输入 compmgmt.msc 并回车。
  2. 展开 本地用户和组 → 用户。
  3. 找到本机内置管理员账户;如果它已重命名,按重命名后的实际名称查找。必要时可在 PowerShell 执行 whoami 确认当前登录账户。
  4. 右键该账户,选择 设置密码,点击“继续”。
  5. 输入并确认一个强密码,建议同时包含大写字母、小写字母、数字和特殊字符;不要使用空密码。
  6. 右键该账户 → 属性,确认账户没有勾选“账户已禁用”,并确认它属于本地管理员组。

新建林时,本机内置管理员账户会转换为新域中的对应账户,并沿用这里设置的密码。后面脚本提示输入的 DSRM 密码是另一套密码,不能把两者混淆。

完成上面的密码设置后,以管理员身份打开 PowerShell,执行:

powershell
$DomainName = Read-Host "输入域名(例如 huohuo.com)"; $NetbiosName = ($DomainName -split '\.')[0].ToUpper(); Write-Host "自动识别NetBIOS名称: $NetbiosName"; Install-WindowsFeature AD-Domain-Services -IncludeManagementTools; Install-ADDSForest -DomainName $DomainName -DomainNetbiosName $NetbiosName -ForestMode WinThreshold -DomainMode WinThreshold -InstallDns:$true -SafeModeAdministratorPassword (Read-Host -AsSecureString "输入目录服务还原模式(DSRM)密码") -Force

脚本会依次提示输入域名与 DSRM 密码,NetBIOS 名由域名自动推导(huohuo.com → HUOHUO)。执行完成后服务器会自动重启,重启后本机即为域控制器。

重启后再执行以下命令:Install-ADDSForest 会在域控配置完成后自动重启服务器,因此不能把 DNS 转发器命令直接接在上一条命令后面。登录系统并确认 DNS Server 服务已启动后,以管理员身份打开 PowerShell:

powershell
Set-DnsServerForwarder -IPAddress 114.114.114.114,8.8.8.8
Get-DnsServerForwarder

说明:命令中的 WinThreshold 是 AD 域/林功能级别参数,不代表 Windows Server 版本。这里保留兼容性优先的写法;如果是全新且所有域控制器都采用 Windows Server 2025 的林,再根据实际兼容性评估是否提升到 Windows Server 2025 功能级别。

若你的环境已有 AD 域,可跳过本节,直接进入第 3 章安装并配置 DHCP 和 WDS。

3. 安装并配置 DHCP 和 WDS ​

通过服务器管理器添加 DHCP 服务器与 Windows 部署服务(WDS) 角色,这是 PXE 网络启动的基础。独立模式的 WDS 不要求与 AD DS 集成;但本教程还要通过 MDT 自动加域,因此部署服务器仍需能够访问可用的 AD DS/DNS。

本教程的固定部署拓扑

本文按单机部署编写:DHCP、WDS、MDT 必须安装在同一台 Windows Server 上。AD DS/DNS 可以由本机承载,也可以使用现有域控制器;但 MDT 部署共享、WDS PXE 服务和 DHCP 地址分配不拆分到其他服务器。

powershell
Install-WindowsFeature -Name WDS,DHCP -IncludeManagementTools -Restart

命令说明

-Restart 的含义是“只有安装过程判断确实需要重启时才自动重启”,不是无条件重启。如果输出 Restart Needed: No,说明角色已完成安装,可以直接继续 §3.1;如果输出 Restart Needed: Yes,系统会按参数自动重启。

如果希望无论安装结果如何都手动重启一次,安装命令完成后再单独执行:

powershell
Restart-Computer

两个角色务必合并成一条 Install-WindowsFeature 命令安装,避免第一条命令重启后第二条没有机会执行。微软 Install-WindowsFeature 说明

安装后先不要初始化 WDS(初始化在 §7 用 MDT 生成的启动映像来配)。

3.1 完成 DHCP 配置 ​

DHCP 角色安装完成后(如果确实发生了重启,登录系统后继续),还要完成 DHCP 授权、创建 IPv4 作用域,并把客户端需要的网关、AD DNS 和域名通过 DHCP 选项下发。

本教程固定使用以下作用域参数:

项目配置值
作用域名称MDT-PXE-IPv4
DHCP 地址范围192.168.1.1 – 192.168.1.254
子网掩码255.255.255.0
排除范围192.168.1.1 – 192.168.1.99
实际动态地址池192.168.1.100 – 192.168.1.254
默认网关(选项 003)192.168.1.1
DNS 服务器(选项 006)192.168.1.10
DNS 域名(选项 015)§2.1 创建的实际 AD 域名

排除范围会避开 NAT 网关、Windows Server 静态 IP(192.168.1.10)、VMware 主机虚拟网卡及后续预留的静态地址。公网 DNS(114.114.114.114、8.8.8.8)不要填入 DHCP 的 DNS 服务器选项;客户端应先访问本机 AD DNS,再由 DNS 转发器解析公网域名。

3.1.1 完成 DHCP 授权 ​

  1. 打开服务器管理器,点击右上角黄色感叹号,完成 DHCP 的安装后配置;按向导确认当前服务器的凭据和 DHCP 安全组配置。
  2. 打开 服务器管理器 → 工具 → DHCP。
  3. 展开左侧的 DHCP 服务器名称,右键服务器名称,选择 授权。
  4. 等待几秒后右键服务器名称,选择 刷新。服务器图标出现绿色向下箭头,表示授权成功。

在已加入 AD 域的环境中,未经授权的 DHCP 服务器不会正常向客户端租出地址;本教程的 DHCP 与域控在同一台服务器上,因此必须完成授权。

3.1.2 创建、配置并验证 IPv4 作用域 ​

完成 §3.1.1 的 DHCP 授权后,以管理员身份打开 PowerShell,执行以下脚本:

powershell
$ErrorActionPreference = "Stop"
Import-Module DhcpServer

$ScopeId     = [System.Net.IPAddress]"192.168.1.0"
$ScopeName   = "MDT-PXE-IPv4"
$StartRange  = [System.Net.IPAddress]"192.168.1.1"
$EndRange    = [System.Net.IPAddress]"192.168.1.254"
$SubnetMask  = [System.Net.IPAddress]"255.255.255.0"
$Router      = [System.Net.IPAddress]"192.168.1.1"
$DnsServer   = [System.Net.IPAddress]"192.168.1.10"
$ExcludeFrom = [System.Net.IPAddress]"192.168.1.1"
$ExcludeTo   = [System.Net.IPAddress]"192.168.1.99"

# 自动读取本机所属的 AD DNS 域名,避免把域名写死
$ComputerSystem = Get-CimInstance -ClassName Win32_ComputerSystem
if (-not $ComputerSystem.PartOfDomain -or [string]::IsNullOrWhiteSpace($ComputerSystem.Domain)) {
    throw "无法自动识别 AD 域名,请先完成 §2.1,并确认本机已提升为域控制器或已加入 AD 域。"
}
$DomainName = $ComputerSystem.Domain

# 读取现有作用域;不存在时创建并立即激活
$Scope = Get-DhcpServerv4Scope -ScopeId $ScopeId -ErrorAction SilentlyContinue

if ($null -eq $Scope) {
    Add-DhcpServerv4Scope `
        -Name $ScopeName `
        -Description "VMnet8 PXE 实验网络" `
        -StartRange $StartRange `
        -EndRange $EndRange `
        -SubnetMask $SubnetMask `
        -LeaseDuration (New-TimeSpan -Days 8) `
        -State Active

    Write-Host "已创建并激活作用域:$ScopeName"
} else {
    # 已有作用域必须与教程参数一致,防止误覆盖现有网络配置
    $RangeMatches = (
        ([string]$Scope.StartRange -eq [string]$StartRange) -and
        ([string]$Scope.EndRange   -eq [string]$EndRange) -and
        ([string]$Scope.SubnetMask -eq [string]$SubnetMask)
    )

    if (-not $RangeMatches) {
        throw "作用域 192.168.1.0 已存在,但地址范围或子网掩码与本教程不一致,请先检查现有配置。"
    }

    Set-DhcpServerv4Scope -ScopeId $ScopeId -State Active
    Write-Host "作用域已存在且参数一致,已确认处于激活状态。"
}

# 检查并创建排除范围,避免重复执行时报错
$ExclusionExists = @(
    Get-DhcpServerv4ExclusionRange -ScopeId $ScopeId -ErrorAction SilentlyContinue
) | Where-Object {
    ([string]$_.StartRange -eq [string]$ExcludeFrom) -and
    ([string]$_.EndRange   -eq [string]$ExcludeTo)
}

if (-not $ExclusionExists) {
    Add-DhcpServerv4ExclusionRange `
        -ScopeId $ScopeId `
        -StartRange $ExcludeFrom `
        -EndRange $ExcludeTo

    Write-Host "已添加排除范围:$ExcludeFrom - $ExcludeTo"
} else {
    Write-Host "排除范围已经存在,跳过创建。"
}

# 自动配置作用域选项:003 网关、006 DNS、015 DNS 域名
# 只替换这三个选项的作用域级值,不修改其他 DHCP 选项
Set-DhcpServerv4OptionValue `
    -ScopeId $ScopeId `
    -Router $Router `
    -DnsServer $DnsServer `
    -DnsDomain $DomainName

Write-Host "已配置作用域选项:003=$Router;006=$DnsServer;015=$DomainName"

# 显示最终结果
Get-DhcpServerv4Scope -ScopeId $ScopeId | Format-Table ScopeId, Name, State, StartRange, EndRange, SubnetMask, LeaseDuration

Get-DhcpServerv4ExclusionRange -ScopeId $ScopeId | Format-Table StartRange, EndRange

Get-DhcpServerv4OptionValue -ScopeId $ScopeId | Format-Table OptionId, Name, Value

脚本会自动完成以下操作:

  • 创建并激活 MDT-PXE-IPv4 作用域。
  • 设置地址范围为 192.168.1.1 – 192.168.1.254,租期为 8 天。
  • 排除 192.168.1.1 – 192.168.1.99,因此实际可分配地址为 192.168.1.100 – 192.168.1.254。
  • 自动配置 003 网关为 192.168.1.1、006 DNS 为 192.168.1.10、015 DNS 域名为本机自动读取的 AD 域名;如果之前填过公网 DNS,006 会被本机 DNS 替换。
  • 重复执行时跳过已经存在的排除范围;若发现同一网段已有不同配置,则停止并提示,不会直接覆盖。

脚本会自动从本机读取 AD DNS 域名,因此必须在完成 §2.1、服务器已重启并且本机已加入域后执行。本教程不使用 WINS,无需配置 044/046 等 WINS 选项。

验证 DHCP 作用域与作用域选项

在 DHCP 控制台中确认:

  • IPv4 下的 MDT-PXE-IPv4 图标为绿色,状态为已激活。
  • 地址池显示动态范围 192.168.1.100 – 192.168.1.254。
  • 作用域选项包含:003 路由器 192.168.1.1、006 DNS 服务器 192.168.1.10、015 DNS 域名(实际 AD 域名)。
  • 如果需要图形化查看,打开 服务器管理器 → 工具 → DHCP,展开 服务器名称 → IPv4 → 作用域 [192.168.1.0] MDT-PXE-IPv4 → 作用域选项即可。
  • 地址租用会在测试客户端成功获取地址后出现记录。

在测试客户端执行以下命令重新获取租约并查看结果:

cmd
ipconfig /release
ipconfig /renew
ipconfig /all

确认客户端获得 192.168.1.100 – 192.168.1.254 范围内的地址,默认网关为 192.168.1.1,DNS 为 192.168.1.10。

本教程 DHCP、WDS、MDT 同机部署,不在 DHCP 中配置选项 066/067,也不把公网 DNS 下发给客户端。WDS 的代理 DHCP 设置和 PXE 启动选项在 §7.4 处理。微软 DHCP IPv4 作用域配置说明

同机部署提醒

DHCP 与 WDS 安装在同一台服务器时,两者会争用 UDP 67 端口,还需在 §7.4 处理端口冲突并配置 PXE 引导。本节只完成 DHCP 地址分配作用域,WDS 初始化仍延后到 §7。


4. 安装 Windows ADK 与 PE 加载项 ​

MDT 依赖 Windows ADK 中的 Deployment Tools 来处理镜像和生成部署环境。本文默认使用面向 Windows 11 24H2 / 25H2 的路线 B:ADK 10.1.26100.2454 加对应的 Windows PE Add-on 和 servicing patch。

如果 MDT 8456 在 ADK 26100 上生成 WinPE 时出现兼容性问题,可切换到兼容性优先的路线 A:ADK 25398 加对应的 Windows PE Add-on。路线 A 只更换 WinPE 生成工具,不改变要部署的 Windows 11 版本;两条路线都只生成 x64 WinPE。

官方获取页面:ADK 下载与安装 | ADK servicing patch

4.1 自动下载并安装(推荐) ​

网页不能直接替部署服务器运行安装程序。请在部署服务器上以管理员身份打开 PowerShell,复制下面的完整脚本并执行。脚本会从微软官方地址下载并依次安装:

  1. Windows ADK 10.1.26100.2454 的 Deployment Tools。
  2. 与该版本匹配的 Windows PE Add-on。
  3. 当前适用于 ADK 10.1.26100.2454 的 ADK servicing patch KB5101684。

执行条件

  • 服务器必须能够访问互联网,并且使用 x64 Windows Server 2025。
  • 必须以管理员身份运行;建议在安装 MDT 之前执行。
  • 安装程序默认使用 Windows Kits 的默认路径;如果已经用自定义路径安装 ADK,请按 4.2、4.3 的手动方式处理。
  • 脚本不会主动重启服务器;如果安装程序提示需要重启,完成脚本后手动重启,再继续下一节。

粘贴脚本时的提示

将整段多行脚本直接粘贴到 Windows PowerShell 控制台后,如果光标停在最后一行,或左侧仍显示 >>,请再按一次 Enter 提交最后一行。这是控制台等待提交输入的正常现象,不是脚本报错;不要重复粘贴整段脚本。

powershell
$ErrorActionPreference = "Stop"
$ProgressPreference = "SilentlyContinue"

$WorkDir = "C:\MDT-Setup\ADK"
$LogDir  = Join-Path $WorkDir "logs"

# 微软官方安装地址;短链接会自动跳转到 download.microsoft.com
$AdkUrl       = "https://go.microsoft.com/fwlink/?linkid=2289980"
$WinPeUrl     = "https://go.microsoft.com/fwlink/?linkid=2289981"
$AdkPatchUrl  = "https://aka.ms/Windows_ADK_10.1.26100.2454_Update_KB5101684.zip"

$AdkInstaller       = Join-Path $WorkDir "adksetup.exe"
$WinPeInstaller     = Join-Path $WorkDir "adkwinpesetup.exe"
$AdkPatchZip        = Join-Path $WorkDir "Windows_ADK_KB5101684.zip"
$AdkPatchDir        = Join-Path $WorkDir "KB5101684"
$AdkPatchMarker     = Join-Path $AdkPatchDir ".applied"

$AdkRoot            = Join-Path ${env:ProgramFiles(x86)} "Windows Kits\10\Assessment and Deployment Kit"
$DeploymentToolsExe = Join-Path $AdkRoot "Deployment Tools\amd64\DISM\dism.exe"
$WinPeOcDir          = Join-Path $AdkRoot "Windows Preinstallation Environment\amd64\WinPE_OCs"

New-Item -ItemType Directory -Path $WorkDir, $LogDir -Force | Out-Null

function Download-File {
    param(
        [string]$Uri,
        [string]$Path
    )

    if (Test-Path -LiteralPath $Path) {
        $ExistingFile = Get-Item -LiteralPath $Path
        if ($ExistingFile.Length -ge 100KB) {
            Write-Host "已存在,跳过下载:$Path"
            return
        }

        Remove-Item -LiteralPath $Path -Force
    }

    Write-Host "开始下载:$Uri"
    Invoke-WebRequest -Uri $Uri -OutFile $Path -UseBasicParsing

    if (-not (Test-Path -LiteralPath $Path) -or (Get-Item -LiteralPath $Path).Length -lt 100KB) {
        throw "下载文件无效或不完整:$Path"
    }
}

function Install-Setup {
    param(
        [string]$Path,
        [string]$Arguments,
        [string]$Name
    )

    Write-Host "开始安装:$Name"
    $Process = Start-Process -FilePath $Path -ArgumentList $Arguments -Wait -PassThru

    if ($Process.ExitCode -notin @(0, 3010)) {
        throw "$Name 安装失败,退出代码:$($Process.ExitCode)"
    }

    if ($Process.ExitCode -eq 3010) {
        Write-Host "$Name 安装完成,但需要重启后生效。"
    } else {
        Write-Host "$Name 安装完成。"
    }
}

Download-File -Uri $AdkUrl -Path $AdkInstaller
Download-File -Uri $WinPeUrl -Path $WinPeInstaller

# 只安装生成 MDT 启动映像所需的 Deployment Tools
Install-Setup `
    -Path $AdkInstaller `
    -Arguments "/features OptionId.DeploymentTools /norestart /quiet" `
    -Name "Windows ADK Deployment Tools"

# 安装与 ADK 版本匹配的 Windows PE 组件
Install-Setup `
    -Path $WinPeInstaller `
    -Arguments "/features OptionId.WindowsPreinstallationEnvironment /norestart /quiet" `
    -Name "Windows PE Add-on"

# 下载并应用 ADK servicing patch;成功后写入标记,重复执行不会重复应用
if (-not (Test-Path -LiteralPath $AdkPatchMarker)) {
    Download-File -Uri $AdkPatchUrl -Path $AdkPatchZip

    $MspFiles = @(Get-ChildItem -LiteralPath $AdkPatchDir -Filter *.msp -File -Recurse -ErrorAction SilentlyContinue)
    if ($MspFiles.Count -eq 0) {
        New-Item -ItemType Directory -Path $AdkPatchDir -Force | Out-Null
        Expand-Archive -LiteralPath $AdkPatchZip -DestinationPath $AdkPatchDir -Force
        $MspFiles = @(Get-ChildItem -LiteralPath $AdkPatchDir -Filter *.msp -File -Recurse)
    }

    if ($MspFiles.Count -eq 0) {
        throw "ADK servicing patch 中没有找到 MSP 文件。"
    }

    $MsiExec = Join-Path $env:WINDIR "System32\msiexec.exe"
    $AppliedPatchCount = 0
    $NotApplicablePatchCount = 0

    foreach ($Msp in $MspFiles) {
        $PatchLog = Join-Path $LogDir ("msiexec-" + $Msp.BaseName + ".log")
        $PatchArgs = "/l* `"$PatchLog`" /qn /norestart /p `"$($Msp.FullName)`""
        Write-Host "正在应用 ADK servicing patch:$($Msp.Name)"
        $Process = Start-Process -FilePath $MsiExec -ArgumentList $PatchArgs -Wait -PassThru

        if ($Process.ExitCode -in @(0, 3010)) {
            $AppliedPatchCount++
        } elseif ($Process.ExitCode -eq 1642) {
            # 补丁 ZIP 可能包含未安装可选功能的 MSP,例如 Appman Sequencer
            $NotApplicablePatchCount++
            Write-Warning "当前已安装的 ADK 功能不适用此 MSP,已跳过:$($Msp.Name)。请查看日志确认。"
        } else {
            throw "ADK servicing patch 安装失败,退出代码:$($Process.ExitCode)。请查看日志:$PatchLog"
        }
    }

    if ($AppliedPatchCount -gt 0) {
        New-Item -ItemType File -Path $AdkPatchMarker -Force | Out-Null
        Write-Host "ADK servicing patch KB5101684 处理完成:已应用 $AppliedPatchCount 个,跳过 $NotApplicablePatchCount 个不适用 MSP。"
    } else {
        Write-Warning "没有 MSP 成功应用;可能已经安装过补丁,或当前 ADK 版本与补丁不匹配。请查看 $LogDir 下的日志。"
    }
} else {
    Write-Host "ADK servicing patch KB5101684 已处理,跳过重复安装。"
}

if (-not (Test-Path -LiteralPath $DeploymentToolsExe)) {
    throw "未找到 Deployment Tools:$DeploymentToolsExe"
}

if (-not (Test-Path -LiteralPath $WinPeOcDir)) {
    throw "未找到 Windows PE 组件目录:$WinPeOcDir"
}

Write-Host "ADK 与 Windows PE Add-on 已安装并验证完成。"
Write-Host "Deployment Tools:$DeploymentToolsExe"
Write-Host "WinPE 组件目录:$WinPeOcDir"

脚本将安装到默认 Windows Kits 路径,并把安装日志保存在 C:\MDT-Setup\ADK\logs。如果脚本中途报错,请先查看报错内容和日志,不要直接跳过失败步骤。

如果日志中出现 Appman Sequencer ... .msp 返回退出代码 1642,表示该 MSP 对当前未安装的可选组件不适用。脚本会跳过这一个 MSP 并继续处理其他补丁;只要 Deployment Tools 和 WinPE 组件验证通过,就不影响本教程后续的 MDT 部署。

微软当前页面说明,ADK 10.1.26100.2454 配合补丁后支持 Windows 11 24H2/25H2 及 Windows Server 2025;ADK servicing patch 会以 ZIP 中的 MSP 文件形式发布,需通过 Windows Installer 应用。

自动脚本只覆盖本教程默认的路线 B(ADK 10.1.26100.2454)。如果改用路线 A,请按手动方式安装对应版本,不要混用两个版本的 ADK 与 WinPE 组件。

手动安装方式(备用)

4.2 手动安装 ADK(备用) ​

如果不能使用自动脚本,可以下载并手动安装 ADK。安装时务必勾选部署工具(Deployment Tools),这是后续生成启动映像的基础。

以管理员身份运行安装包:

图 1 — 指定安装位置

ADK 安装 - 指定位置

图 2 — Windows 工具包隐私

ADK 安装 - 隐私

图 3 — 许可协议

ADK 安装 - 许可协议

图 4 — 选择安装功能(至少勾选 Deployment Tools)

ADK 安装 - 选择功能

4.3 手动安装 ADK PE ​

官方下载入口:https://learn.microsoft.com/en-us/windows-hardware/get-started/adk-install

  1. 下载与 ADK 10.1.26100.2454 配套的 adkwinpesetup.exe。
  2. 以管理员身份运行安装程序。
  3. 安装位置建议保持默认。
  4. 完成安装后,确认 ADK PE 文件已安装。
  5. 如果没有使用 4.1 的自动脚本,请按微软当前 servicing 说明下载并应用 ADK 补丁。

下载 adkwinpesetup.exe

4.4 安装后验证 ​

完成 ADK 与 Windows PE Add-on 安装后,打开 Windows 设置 → 应用 → 安装的应用

图 5 — 在「设置 → 应用 → 安装的应用」中确认 ADK 与 WinPE Add-on 条目

安装的应用列表中 ADK 与 WinPE Add-on 条目


5. 安装 Microsoft Deployment Toolkit(MDT) ​

MDT 安装在与 DHCP、WDS 相同的这台部署服务器上。后续 D:\DeploymentShare 由本机的 MDT 管理,并由本机 WDS 发布其中的 LiteTouch 启动映像。

Legacy / 已退休组件

MDT 已被 Microsoft 立即退休,不再获得支持、修复、安全更新或未来 Windows 版本兼容性更新。 继续安装 MDT 8456 的目的,是维护已有环境或搭建传统部署实验 / 过渡环境。

5.1 安装 MDT 8456 x64 ​

安装包下载

下载 MicrosoftDeploymentToolkit_x64.msi

  1. 下载 x64 安装包 MicrosoftDeploymentToolkit_x64.msi。
  2. 以管理员身份运行 MSI 安装包。
  3. 接受许可协议,安装路径保持默认即可。
  4. 完成安装后,从开始菜单打开 Deployment Workbench。
  5. 建议使用管理员权限启动 Deployment Workbench,并确认控制台能正常打开。

安装包:MicrosoftDeploymentToolkit_x64.msi 版本:8456

下载包留存建议

由于 MDT 已退休,Microsoft 已提示官方分发包未来可能被移除或弃用。如企业仍需维护 MDT,应按内部软件资产和安全规范留存安装介质、校验值与版本记录,不要从不可信第三方站点获取安装包。


6. 配置 MDT Deployment Share(核心) ​

6.1 创建部署共享 ​

  1. Deployment Workbench → 右键 Deployment Shares → New Deployment Share。
  2. 路径:D:\DeploymentShare(单独数据盘)。
  3. 共享名:DeploymentShare$(保持默认)。
  4. 描述随意。
  5. 向导里勾选以下选项(决定是否在部署向导中提问):
    • ☐ Ask for a computer name(取消)
    • ☐ Ask to join a domain or workgroup(取消)
    • ☐ Ask for Domain and OU(取消)
    • ☐ Migrate user data(取消)
    • ☐ Ask for BitLocker(取消)
  6. 完成后生成 D:\DeploymentShare。

6.2 制作自定义镜像 ​

自定义镜像应在一台专用的参考虚拟机中制作。参考机只负责生成通用 WIM,不要加入生产域,也不要提前安装具体机型的驱动;机型驱动统一在第 6.4 节由 MDT 注入。

镜像只保留所有目标电脑都需要的内容。计算机名、静态 IP、域加入、域组策略、机型驱动、BitLocker、部署账号和个人数据都不要固化到 WIM 中,分别交给 MDT、域控或目标机部署阶段处理。

6.2.1 预装软件与组策略配置 ​

这一步在参考机中完成。建议使用与目标电脑一致的系统版本,使用本地管理员完成安装和测试;不要登录个人 Microsoft 账户,也不要把参考机加入域。

先完成软件安装和策略配置,再进行清理、Sysprep 和 WIM 捕获。这样后面的通用化步骤只负责删除设备唯一信息,不会遗漏需要写入基础镜像的公共内容。

设置电源计划为“卓越性能” ​

如果部署环境希望优先保证虚拟机和台式机的性能,可在参考机中以管理员身份打开 PowerShell,把下面整行命令一次性复制并执行。命令会先查找已有的“卓越性能”计划;如果计划尚未显示,则复制系统模板后再启用,同时设置熄屏时间并输出当前活动计划:

powershell
$g=[regex]::Match([string](powercfg /list | Select-String "Ultimate Performance|卓越性能" | Select-Object -First 1),"(?i)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}").Value; if(-not $g){$g=[regex]::Matches((powercfg /duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61 2>&1 | Out-String),"(?i)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}") | Select-Object -Last 1 | ForEach-Object Value}; if(-not $g){throw '未找到或无法创建卓越性能电源计划,请执行 powercfg /list 检查。'}; powercfg /setactive $g; powercfg /change monitor-timeout-dc 20; powercfg /change monitor-timeout-ac 0; powercfg /getactivescheme

只需执行这一条命令并回车一次。命令中的字符串使用普通 ASCII 引号,避免从网页复制时中文弯引号导致 PowerShell 出现 UnexpectedToken。确认最后输出的活动计划名称为卓越性能(Ultimate Performance)。其中 monitor-timeout-dc 20 表示电池供电时 20 分钟关闭屏幕,monitor-timeout-ac 0 表示接通电源时永不自动关闭屏幕;这两个设置只修改熄屏时间,不修改系统睡眠时间。/duplicatescheme 只负责复制电源计划,/setactive 才会将它设为当前计划;它不会修改 BIOS,也不是 CPU 超频。卓越性能会减少部分节能行为,笔记本可能增加耗电、发热和风扇噪声;如果同一镜像还要部署到电池设备,应改为在 MDT 或电源策略中按机型决定。微软:Powercfg 命令行选项

需要放进基础镜像的软件 ​

只安装每台目标电脑都必须使用、且版本变化不频繁的软件。软件应使用官方安装包,并在安装后重启、打开测试,确认没有安装失败或待处理的重启任务。

组策略的处理原则 ​

在参考机中按 Win + R,输入 gpedit.msc,只设置所有目标电脑都适用的通用本地策略。先保留当前策略备份,再执行 gpupdate /force,用 gpresult /r 检查结果。

以下内容不要写入基础镜像:域密码和服务账号、固定本地管理员密码、密码/锁定策略、域证书私钥、静态 IP 和 DNS、计算机名称、映射盘和打印机、组织代理、WSUS 地址、BitLocker 密钥,以及只适用于某个部门或机型的策略。这些内容应放在域 GPO、MDT 规则或任务序列中。

可选:使用 Microsoft 安全基线整理组策略

如果需要统一安全策略,可下载与目标 Windows 11 版本匹配的 Microsoft Security Compliance Toolkit 和 Windows 11 安全基线,先用 Policy Analyzer 检查冲突,再在参考机副本上用 LGPO 测试。不要把 Windows Server 2025 安全基线直接导入 Windows 11,也不要未经测试一次性导入整套策略。Microsoft Security Compliance Toolkit · Windows 安全基线

如果需要保留本地策略的回滚点,在不参与捕获的 D: 数据盘或外置盘中执行 LGPO.exe /b D:\MDT-Image-Work\LGPO-Backup /n "Win11-Base";不要把备份目录放在将要捕获的系统盘中。导入测试备份时使用 LGPO.exe /g D:\MDT-Image-Work\LGPO-Backup,然后执行 gpupdate /force。

建议验证登录、网络访问、Windows Update、业务软件、打印、远程管理和 MDT 加域流程;通过后,优先将长期维护的策略迁移到域 GPO,避免每次更新镜像都要重新维护本地策略。

6.2.2 清理镜像与捕获前检查 ​

  1. 卸载仅用于测试的软件,删除桌面、下载目录、临时文件、浏览器登录信息、个人文件和临时测试账户。
  2. 确认参考机没有加入域、没有连接工作或学校账户,也没有保存 Wi-Fi、VPN、代理和组织证书私钥。
  3. 执行 Windows Update,完成需要的重启;安装程序和日志不要留在镜像中。
  4. 用 manage-bde -status 检查系统盘。如果系统盘已启用 BitLocker 或设备加密,应先关闭/解密,或确保 WinPE 能够解锁后再捕获。
  5. 保存一份参考机快照,并记录镜像版本、Windows 内部版本、已安装软件及其版本。后续更新从快照重新制作,不要在已经通用化并启动过的系统上继续修改。

完成上述人工清理后,以管理员身份打开 PowerShell,将下面整行命令复制并执行一次。该命令只读取状态,不会自动删除文件、账户或修改 BitLocker:

powershell
Get-ComputerInfo | Select-Object WindowsProductName,WindowsVersion,OsBuildNumber,OsArchitecture; Get-NetFirewallProfile | Select-Object Name,Enabled; Get-Service wuauserv,MpsSvc -ErrorAction SilentlyContinue | Select-Object Name,Status,StartType; gpresult /r; manage-bde -status

确认命令输出的系统版本、网络防火墙、更新服务、本地策略和 BitLocker 状态符合预期后,再执行下一步 Sysprep。微软建议先在运行中的参考设备(审核模式)中加入应用和自定义项,完成后再通用化并捕获镜像。微软:修改 Windows 映像

6.2.3 执行 Sysprep 通用化 ​

进入参考机桌面后按 Win + R,输入 sysprep 并按回车,打开“系统准备工具”。也可以直接运行 C:\Windows\System32\Sysprep\Sysprep.exe。按下面方式设置:

  1. 系统清理操作选择进入系统全新体验(OOBE)。
  2. 勾选通用。
  3. 关机选项选择关机,不要选择重新启动。
  4. 点击确定,等待 Sysprep 完成并自动关机。

图 6 — Sysprep 通用化设置示意图

Sysprep 通用化设置:选择 OOBE、勾选通用并选择关机

也可以以管理员身份打开命令提示符,执行等效命令:

cmd
C:\Windows\System32\Sysprep\Sysprep.exe /generalize /oobe /shutdown

参数作用:

  • /generalize:删除 SID 和硬件相关的唯一信息,使镜像可部署到其他电脑。
  • /oobe:部署后的客户端首次启动时进入 Windows 初始设置阶段,后续由 MDT 应答文件继续完成配置。
  • /shutdown:通用化完成后自动关机,便于立即进入 WinPE 捕获。

计算机关机后,不要再次从参考机的 Windows 系统盘启动,应直接切换到 WinPE。重新进入已通用化的 Windows 会开始 specialize / OOBE 阶段,需要再次执行 Sysprep 后才能捕获。

如果 Sysprep 失败,先检查以下日志:

text
C:\Windows\System32\Sysprep\Panther\setuperr.log
C:\Windows\System32\Sysprep\Panther\setupact.log

详细参数可参考微软 Sysprep 命令行说明。

6.2.4 在 WinPE 中捕获 WIM ​

Sysprep 关机后,从 WinPE 启动参考虚拟机。捕获方式选择一种即可:使用下面视频中的 Dism++ 图形界面,或使用微软 DISM 命令。

方法一:使用 Dism++

  1. 在 WinPE 中打开 Dism++,选中已经通用化的离线 Windows 系统。
  2. 进入恢复功能 → 系统备份。
  3. 将保存位置设置到另一块数据盘或网络共享。
  4. 镜像名称建议填写 Windows 11 Custom,文件名建议使用 Windows11-Custom.wim。
  5. 开始捕获并等待完成,不要中断虚拟机或断开保存镜像的磁盘。

方法二:使用 DISM

先确认 WinPE 中各分区的盘符。WinPE 下的 Windows 分区不一定是 C::

cmd
diskpart
list volume
exit

下面示例假设 Windows 分区是 C:,保存镜像的数据盘是 D:。如果实际盘符不同,必须先修改变量:

cmd
set OSDrive=C:
set ImageDrive=D:
md %ImageDrive%\Images

dism /Capture-Image /ImageFile:%ImageDrive%\Images\Windows11-Custom.wim /CaptureDir:%OSDrive%\ /Name:"Windows 11 Custom" /Description:"Windows 11 custom reference image" /Compress:max /CheckIntegrity /Verify

/Compress:max 会减小 WIM 文件体积,但捕获时间更长;/CheckIntegrity 和 /Verify 用于检查映像完整性。完整参数可参考微软 DISM Capture-Image 说明。

6.2.5 验证捕获结果 ​

捕获完成后,不要立即删除参考虚拟机。先验证 WIM 是否能够读取:

cmd
dism /Get-WimInfo /WimFile:D:\Images\Windows11-Custom.wim

确认命令能够列出镜像索引、名称和 Windows 版本,并检查 WIM 文件大小是否合理。验证通过后,将 WIM 复制到 MDT 服务器的安全存储位置,再进入 6.3 导入操作系统。

推荐保留

保留 Sysprep 前的虚拟机快照、最终 WIM 和对应的 SHA-256 校验值。以后更新软件或补丁时,从快照继续制作新版本,不要在已经通用化并启动过的镜像上反复修改。

6.3 导入操作系统 ​

下面是一段实操演示视频:

  1. 右键 Deployment Shares → Import Operating System。
  2. 选 Custom image file,指向你自定义为.wim后缀的镜像文件。
  3. 这一步保持默认
  4. 目录名任意。
  5. 然后等待导入完成。

6.4 导入驱动 ​

生产环境建议按机型隔离驱动,避免不同型号之间互相污染。

6.4.1 确认电脑型号 ​

优先使用 PowerShell 查看制造商和型号:

powershell
Get-CimInstance Win32_ComputerSystem | Select-Object Manufacturer,Model

旧版系统也可以使用:

powershell
wmic computersystem get manufacturer,model

也可以使用 Win + R → 输入 msinfo32 → 查看“系统型号”。

记录输出结果,后续目录名称应尽量与 Model 值完全一致。

6.4.2 创建机型驱动目录 ​

在 Deployment Workbench 中进入:

text
Out-of-Box Drivers → 右键 → New Folder

本方案按型号直接创建目录:

text
Out-of-Box Drivers
├── Latitude 5420
└── ThinkPad T14

目录名必须与 MDT 收集到的 %Model% 值一致。

6.4.3 导入驱动包 ​

  1. 下载对应机型的官方驱动包。
  2. 将驱动包解压到临时目录。
  3. 在对应机型目录上右键,选择 Import Drivers。
  4. 指向该机型驱动包的解压目录。
  5. 等待 MDT 扫描并导入 .inf 驱动文件。

驱动包建议只导入对应机型和对应 Windows 版本的驱动,不要把多个型号的驱动混在同一个目录中。

常用驱动包地址:

6.4.4 选择驱动注入方案 ​

两种方案只能选一种。不要同时配置 DriverGroup001 和 DriverSelectionProfile,否则驱动范围可能叠加。

快速选择

机型少、目录简单时,优先使用 DriverGroup 方案;机型较多、需要组合公共驱动或精确控制驱动范围时,使用 Selection Profile 方案。

方案核心配置
DriverGroup 方案DriverGroup001=%Model%;Inject Drivers 的 Selection Profile 设置为 Nothing
Selection Profile 方案DriverSelectionProfile=%Model%;由变量动态选择 Profile

6.4.5 方案一:使用 DriverGroup 注入驱动 ​

本方案使用 DriverGroup001 按型号选择驱动,因此不需要为每个型号单独创建 Selection Profile。

优点:

  • 配置简单,新增机型时只需新增对应目录。
  • 规则集中在 CustomSettings.ini 中,便于统一管理。

缺点:

  • 依赖 %Model% 与目录名完全匹配。
  • 对品牌区分、公共驱动和复杂目录控制较弱。

适用场景:

机型数量较少、目录结构简单的部署环境。

在任务序列中找到:

text
Preinstall → Inject Drivers

将 Choose a selection profile 设置为:

text
Nothing

这样 MDT 才会主要按照 CustomSettings.ini 中的驱动组配置注入驱动:

ini
DriverGroup001=%Model%

Selection Profile 和 DriverGroup 是叠加关系。如果保留默认 Selection Profile,可能会把大量无关驱动一起纳入部署。

6.4.6 方案二:使用 Selection Profile 注入驱动 ​

如果不想使用 DriverGroup001,也可以为每个机型创建一个 Selection Profile,并让 MDT 根据 %Model% 自动选择对应 Profile。

优点:

  • 可视化管理,能够精确选择驱动子目录。
  • 适合组合公共驱动和机型专属驱动。

缺点:

  • 需要维护多个 Selection Profile。
  • Profile 名称必须与 %Model% 变量匹配,配置复杂度较高。

适用场景:

机型较多,或需要精细控制驱动范围的部署环境。

  1. 进入 Advanced Configuration → Selection Profiles。

  2. 为每个机型创建一个 Profile,名称必须与 MDT 的 Model 值一致,例如:

    text
    Latitude 5420
    ThinkPad T14
  3. 每个 Profile 只勾选对应的机型驱动目录。

  4. 在 CustomSettings.ini 中使用:

    ini
    DriverSelectionProfile=%Model%
  5. 在任务序列的 Preinstall → Inject Drivers 中,将 Choose a selection profile 设置为 Nothing,让 DriverSelectionProfile 动态变量接管选择。

采用此方案时,应删除或停用下面这条配置,避免 DriverGroup 和 Selection Profile 叠加:

ini
DriverGroup001=%Model%

6.4.7 验证驱动匹配 ​

部署前确认以下内容:

  • 目标电脑的 %Model% 值已准确记录。
  • 驱动目录名称与 %Model% 完全一致。
  • 任务序列启用了 Inject Drivers。
  • Choose a selection profile 设置为 Nothing。
  • 根据实际选择的方案检查对应配置,不能两套同时启用:
    • DriverGroup 方案:CustomSettings.ini 使用 DriverGroup001=%Model%,并删除或停用 DriverSelectionProfile。
    • Selection Profile 方案:CustomSettings.ini 使用 DriverSelectionProfile=%Model%,并删除或停用 DriverGroup001;Profile 名称与 %Model% 完全一致。

部署完成后,在设备管理器中确认没有黄色感叹号。

6.5 导入应用程序(可选) ​

Applications → New Application:

  1. 选 Application with source files(保持默认)。
  2. 输入软件名称
  3. 指向安装包位置(安装包必须在文件夹内,文件夹名称必须的安装包名称一样包含后缀)
  4. 保持默认
  5. 填入软件的静默安装参数,如微信:WeChatSetup.exe /S
  6. 一直下一步即可

6.6 创建任务序列(Task Sequence) ​

  1. Task Sequences → New Task Sequence。
  2. ID:WIN11-PRO(自定义),Name:Windows 11 专业版 标准部署。
  3. Template 选 Standard Client Task Sequence。
  4. 选刚导入的 Win11 OS。
  5. 默认。
  6. Full Name 填实际使用者或自定义名称,Organization 填公司名;Edge 主页默认空白,可改为想要访问的地址。
  7. 设置目标电脑本地管理员账户密码,账户名称按实际部署需求自定义。
  8. 一直下一步完成配置

6.7 任务序列各阶段说明 ​

标准客户端任务序列通常按以下顺序执行:

阶段执行环境主要作用
InitializationWinPE / Windows初始化 MDT 环境,读取部署规则和变量。
ValidationWinPE检查内存、CPU、电池、网络及部署前提条件。
State CaptureWinPE 或 Windows使用 USMT 捕获用户状态;全新装机通常不需要此阶段。
PreinstallWinPE执行安装前准备,包括磁盘分区、驱动注入和离线配置。
InstallWinPE将 WIM/ESD 操作系统映像应用到目标磁盘,或运行升级安装程序。
PostinstallWinPE对已写入磁盘的系统进行离线收尾配置,然后重启进入 Windows。
State RestoreWindows在进入 Windows 后恢复用户状态、安装应用、更新系统并完成策略配置。

Preinstall 阶段的典型步骤 ​

  • Gather local only:收集本地用户配置。
  • New Computer only:新计算机部署时执行的状态捕获规则。
  • Validate:再次检查硬件、磁盘和部署条件。
  • Format and Partition (BIOS/UEFI):根据固件类型将磁盘初始化为 MBR 或 GPT。
  • Copy Scripts:将 MDT 脚本及自定义脚本复制到本地。
  • Offline User State Capture:在 WinPE 中使用 USMT 离线捕获用户数据。
  • Refresh only:刷新当前计算机时执行的状态捕获规则。
  • Configure:配置网络、磁盘及相关部署参数。
  • Enable BitLocker (Offline):在 Windows 尚未启动时执行 BitLocker 的离线配置。
  • Inject Drivers:注入存储控制器、网卡及其他硬件驱动。
  • Apply Patches:向离线 Windows 映像注入更新补丁。
  • Next Phase:标记当前阶段完成,并准备重启进入下一阶段。

Install 阶段 ​

  • Install Operating System:将选定的 Windows 映像应用到目标磁盘。
  • Next Phase:标记操作系统安装阶段完成。

Postinstall 阶段 ​

此阶段仍在 WinPE 中执行。系统映像已经写入磁盘,但尚未进入完整的 Windows 运行环境。

  • Copy Scripts:将 MDT 脚本和自定义脚本复制到目标系统,例如 %OSDisk%\\Scripts。
  • Configure:向目标系统应用 Unattend.xml,完成网络、磁盘等离线配置。
  • Add Windows Recovery (WinRE):添加 Windows 恢复环境,用于系统修复和重置。
  • Next Phase:完成离线配置并重启进入 Windows。

State Restore 阶段 ​

此阶段已进入 Windows,适合执行必须依赖完整系统环境的在线操作。

  • Restore User State:恢复之前捕获的用户状态。
  • Install Applications:安装 Applications 节点中指定的软件。
  • Windows Update (Pre-Application Installation):安装应用前执行 Windows 更新。
  • Windows Update (Post-Application Installation):安装应用后再次执行 Windows 更新。
  • Enable BitLocker:在 Windows 环境中启用 BitLocker。
  • Apply Local GPO Package:应用本地组策略包。

注意:应用程序安装、Windows Update、在线 BitLocker 和本地 GPO 均属于 State Restore,不属于 Postinstall。Postinstall 仍运行在 WinPE 中,主要负责离线配置。

6.8 配置规则(CustomSettings.ini / Bootstrap.ini) ​

MDT 的规则配置决定部署向导显示哪些页面、是否自动命名和加域、如何匹配驱动,以及部署结束后的动作。主要涉及两个配置文件:

  • CustomSettings.ini:客户端连接部署共享后读取,控制部署流程和部署参数。
  • Bootstrap.ini:WinPE 启动后最先读取,负责定位并连接 MDT Deployment Share。

6.8.1 CustomSettings.ini ​

在 MDT Deployment Share 上右键 → Properties → Rules 选项卡,即可编辑。

下面是本教程当前采用的基础配置。每条注释都放在对应规则条目的同一行末尾,便于阅读和排错。

ini
[Settings]

Priority=Default ; 指定 MDT 读取的默认规则区域

[Default]

SkipBDDWelcome=YES ; 跳过 MDT 欢迎页面
SkipTaskSequence=NO ; 保留任务序列选择页面
SkipComputerName=YES ; 跳过计算机名称输入页面
SkipAdminPassword=YES ; 跳过本地 Administrator 密码输入页面
SkipProductKey=YES ; 跳过产品密钥输入页面
SkipDomainMembership=NO ; 保留域加入设置页面
SkipLocaleSelection=YES ; 跳过语言和区域设置页面
SkipTimeZone=YES ; 跳过时区设置页面
SkipApplications=NO ; 保留应用程序选择页面
SkipAppsOnUpgrade=YES ; 升级部署时跳过应用选择页面
SkipUserData=YES ; 跳过用户数据迁移页面
SkipComputerBackup=YES ; 跳过计算机备份页面
SkipBitLocker=YES ; 跳过 BitLocker 设置页面
SkipCapture=YES ; 跳过镜像捕获页面
SkipSummary=YES ; 跳过部署摘要确认页面
SkipFinalSummary=YES ; 跳过最终完成摘要页面

OSInstall=YES ; 允许执行操作系统部署
_SMSTSORGNAME=MDT Deployment ; 设置 MDT 部署界面显示的组织名称
UserDataLocation=NONE ; 不迁移旧用户数据
DoCapture=NO ; 不执行 WIM 镜像捕获
SLShareDynamicLogging=\\MDT01\DeploymentShare$\Logs ; 部署过程中实时写入日志
SLShare=\\MDT01\DeploymentShare$\Logs ; 部署完成后汇总日志
FinishAction=REBOOT ; 部署完成后自动重启

UILanguage=zh-CN ; 使用简体中文系统界面语言
UserLocale=zh-CN ; 使用中国区域格式
InputLocale=zh-CN ; 使用中文(简体)默认输入区域
SystemLocale=zh-CN ; 使用中文(简体)系统区域设置
KeyboardLocale=zh-CN ; 使用中文(简体)默认键盘布局
KeyboardLocalePE=zh-CN ; 使用中文(简体)WinPE 键盘布局
TimeZoneName=China Standard Time ; 使用中国标准时间

JoinDomain=huohuo.com ; 指定目标 Active Directory 域
DomainAdmin=Administrator ; 指定用于加域的账号
DomainAdminDomain=HUOHUO ; 指定加域账号所属的 NetBIOS 域名
DomainAdminPassword=qwertyuiop!1 ; 指定加域账号密码

OSDComputerName=HH-%SerialNumber% ; 使用设备序列号作为计算机名
DriverGroup001=%Model% ; 按设备 Model 变量选择对应的驱动目录

日志会保存到 \MDT01\DeploymentShare$\Logs。使用前请在 D:\DeploymentShare\Logs 创建 Logs 文件夹,并确认访问部署共享的账号具有写入权限;部署完成后可以直接在该目录查看客户端日志。

6.8.2 Bootstrap.ini ​

在 Deployment Share 属性中点击 Edit Bootstrap.ini。它在 WinPE 启动阶段使用,决定客户端连接哪个部署共享。

对应文件为 D:\DeploymentShare\Control\Bootstrap.ini。修改后需要执行 Update Deployment Share,再将新生成的 LiteTouchPE_x64.wim 同步到 WDS。

ini
[Settings]

Priority=Default ; 指定 MDT 读取的默认规则区域

[Default]

DeployRoot=\\MDT01\DeploymentShare$ ; 指定 MDT 部署共享的网络路径

UserDomain=HUOHUO ; 指定共享访问账号所属的域

UserID=Administrator ; 指定访问 Deployment Share 的账号

UserPassword=qwertyuiop!1 ; 指定共享访问账号密码

SkipBDDWelcome=YES ; 跳过 MDT 欢迎页面

KeyboardLocale=zh-CN ; 使用中文(简体)默认键盘布局

安全建议:本示例为便于实验使用同一个域 Administrator 账号访问共享并执行加域。生产环境不要使用域管理员账号进行批量部署,应拆分为“共享读取账号”和“加域账号”,分别只授予部署共享读取权限与目标 OU 的计算机账户权限,并按组织规范轮换密码。

6.9 生成启动映像(Update Deployment Share) ​

  1. 右键MDT Deployment Shares → Update Deployment Share。
  2. 选 Completely regenerate the boot images(首次或改了 Bootstrap 后必须完全重建)。
  3. 完成后在 D:\DeploymentShare\Boot\ 生成:
    • LiteTouchPE_x64.wim(WDS 用)
    • LiteTouchPE_x64.iso(备用,U 盘/ISO 启动)

7. 配置 WDS ​

7.1 初始化 WDS ​

服务器显示“未配置”,说明 WDS 角色已经安装,但尚未完成初始化。首次使用 WDS 必须先完成配置向导。

7.1.1 打开配置向导 ​

  1. 打开 服务器管理器。
  2. 选择 工具 → Windows 部署服务。
  3. 展开左侧的 服务器。
  4. 右键当前服务器,选择 配置服务器。

7.1.2 选择服务器模式 ​

在“安装选项”页面选择:

text
独立服务器

本教程选择独立服务器模式,适合以下场景:

  • 希望 WDS 自己维护 PXE 客户端和启动配置,不依赖 AD DS 中的预配置计算机账户。
  • 实验室、测试环境,或需要先把 PXE 流程跑通的过渡环境。
  • 希望将 WDS 的 PXE 服务与 MDT 的部署规则分开管理。

注意:独立服务器只改变 WDS 的客户端和配置管理方式,不会取消 MDT 的域加入能力。部署过程中,目标电脑仍可以通过 CustomSettings.ini 和任务序列加入域;但服务器本身仍需满足共享访问、DNS、DHCP 和 PXE 通信要求。WDS 的独立模式也支持维护自己的设备数据库。微软 WDS 客户端管理说明

7.1.3 指定远程安装目录 ​

设置远程安装文件夹:

text
D:\RemoteInstall

不要与 MDT 部署共享使用同一个目录:

text
D:\DeploymentShare
D:\RemoteInstall

两个目录用途不同:

  • DeploymentShare:保存 MDT 规则、任务序列、驱动、应用和 LiteTouch 文件。
  • RemoteInstall:保存 WDS 的 PXE 启动文件和 WDS 启动映像。

远程安装目录应使用本机 NTFS 路径,并确保所在磁盘有足够空间。向导完成后,WDS 会创建相关文件夹和共享,例如 REMINST$。

7.1.4 代理 DHCP 服务器 ​

如果当前服务器同时运行了 Microsoft DHCP,向导会显示“代理 DHCP 服务器”页面。按截图保留以下两个选项:

  • ☑ 不侦听 DHCP 和 DHCPv6 端口
  • ☑ 配置代理 DHCP 的 DHCP 选项

这两个选项分别用于解决 DHCP 与 WDS 争用 DHCP 端口的问题,并让 DHCP 向客户端声明 PXE/代理 DHCP 信息。Microsoft DHCP 会继续负责分配 IP 地址,WDS 负责 PXE 启动响应。微软关于 WDS 与 DHCP 共存的说明

本教程固定采用 DHCP、WDS、MDT 同机部署,因此按截图同时勾选这两个选项。Microsoft DHCP 继续负责分配 IP 地址,WDS 通过代理 DHCP 提供 PXE 启动信息;不要把 DHCP 或 WDS 拆到另一台服务器。

7.1.5 设置 PXE 响应策略 ​

在 PXE 响应设置中选择:

text
响应所有客户端计算机(已知和未知)

本教程使用独立服务器模式,建议先选择此项。所有符合条件的 PXE 客户端都可以收到 WDS 响应,便于首次部署和排查网络启动问题。

如果需要限制未知设备,可以选择:

text
仅响应已知客户端计算机

独立服务器模式下,应提前在 WDS 自己的设备数据库中登记或审批客户端;不要把“已知客户端”理解为必须在 Active Directory 中预配置计算机账户。微软 WDS 响应策略说明

建议:

  • 独立服务器首次部署:响应所有已知和未知客户端。
  • 独立服务器正式环境:按需要登记设备后,仅响应已知客户端。
  • 单机部署:确保客户端与这台部署服务器处于可互通的同一网络,并且同一网段不要再有其他 PXE 服务响应。

7.1.6 完成初始化后的检查 ​

完成向导后确认:

  • WDS 控制台中的服务器状态不再显示“未配置”。
  • D:\RemoteInstall 目录已经创建。
  • REMINST$ 共享已经存在。
  • Windows Deployment Services 服务正在运行。
  • DHCP 服务已经授权,作用域已启用并能正常分配地址。
  • 防火墙允许 DHCP、TFTP 和 PXE 所需通信。
  • 此时不要添加原版 boot.wim,下一步添加 MDT 生成的 LiteTouchPE_x64.wim。

使用 PowerShell 检查 WDS 服务:

powershell
Get-Service WDSServer

正常状态应为:

text
Status : Running

使用 WDS 命令查看服务器配置:

powershell
wdsutil /Get-Server /Show:Config

完成初始化后,进入 §7.2 添加:

text
D:\DeploymentShare\Boot\LiteTouchPE_x64.wim

WDS 负责 PXE 和 TFTP 分发,真正的 MDT 部署逻辑来自 LiteTouch 启动映像。微软 PXE/WinPE 配置说明

7.1.7 WDS 服务没有及时响应 ​

配置向导在“任务进度”页面启动 WDS 时,可能出现:

服务没有及时响应启动或控制请求。

在本教程的单机部署场景中,常见原因是 Windows Deployment Services 服务没有自动启动,仍处于停止状态。这不一定表示 RemoteInstall 或 MDT 启动映像损坏,可以先手动启动服务。

  1. 关闭或完成配置向导,回到 Windows 部署服务 控制台。
  2. 右键服务器名称,选择 所有任务 → 启动。
  3. 等待服务器状态变为已启动,再点击刷新。

手动启动 Windows 部署服务

为避免服务器重启后再次出现同样问题,打开 services.msc,找到 Windows Deployment Services,将“启动类型”设置为:

text
自动

也可以使用管理员 PowerShell 设置并立即启动:

powershell
Set-Service -Name WDSServer -StartupType Automatic
Start-Service -Name WDSServer
Get-Service -Name WDSServer

确认返回的状态为 Running 后,再继续 §7.2 添加 MDT 的 LiteTouchPE_x64.wim。

7.2 添加 MDT 启动映像 ​

WDS → 服务器 → Boot Images → 右键 Add Boot Image →指向 D:\DeploymentShare\Boot\LiteTouchPE_x64.wim → 命名 MDT LiteTouch Win11 (x64)。

这是关键一步:WDS 不再用自己的 boot.wim,而是用 MDT 生成的 LiteTouchPE,部署逻辑才完整。

7.3 配置启动(UEFI/安全启动) ​

  • WDS 默认会为 x64 UEFI 提供 wdsmgfw.efi,LiteTouchPE 由 Microsoft 签名,安全启动可用,无需关 Secure Boot。
  • 确认客户端 BIOS 设 UEFI + 网络启动(PXE over IPv4) 优先。

7.4 DHCP 与 WDS 同机配置 ​

本教程中 DHCP、WDS、MDT 全部在同一台服务器,因此不配置 DHCP 选项 066/067,也不使用 DHCP Relay。

完成 WDS 配置向导后,打开 WDS → 服务器属性 → DHCP 选项卡,确认:

  • ☑ Do not listen on DHCP ports
  • ☑ Configure DHCP option 60 to "PXEClient" (同时确认 DHCP 服务已授权、作用域已启用并且地址池可用)

如果 DHCP 与 WDS 同机但未启用上述设置,常见结果是 DHCP 地址可以正常分配,但 PXE 客户端无法获得 WDS 启动响应。微软说明:DHCP 与 WDS 共用服务器时,WDS 不应继续占用 DHCP 使用的端口。微软 WDS 与 DHCP 共存说明


8. 域加入权限委派(改用普通账号时) ​

当前示例使用域 Administrator 账号加域,且未在 CustomSettings.ini 中指定 MachineObjectOU,Windows 默认会将新计算机账户放入域的 Computers 容器,因此无需额外委派权限。只有改用普通域账号并需要使用自定义 OU 时,才执行以下委派,并在规则中重新加入 MachineObjectOU。

  1. AD 用户和计算机 → 建 OU WDS_Computers。
  2. 右键 OU → 委派控制 → 添加实际加域账号 → 选“创建、删除以及管理计算机账户”并勾选“将计算机加入域”。
  3. 按组织策略管理实际加域账号的密码与过期策略,优先使用托管服务账号或其他低权限方案。
  4. 部署共享 NTFS:给实际共享访问账号及运维组授予所需权限;DeploymentShare$ 不向普通用户开放。

9. Win11 24H2(ADK 26100)WinPE 生成坑的规避 ​

9.1 打开 Windows PE 选项卡时 MMC 管理单元崩溃 ​

现象 ​

在 Deployment Workbench 中打开 Deployment Share → Properties → Windows PE 时,出现:

MMC 在一个管理单元检测到错误,将卸载此管理单元。

这个问题通常不是 Deployment Share 配置错误,而是 MDT 8456 仍尝试访问新版 ADK 中已经缺失或不完整的 x86 WinPE 路径。Windows 11 ADK 已逐步取消 x86 WinPE 支持,MDT 的旧管理单元因此可能崩溃。

处理方法 ​

  1. 关闭 Deployment Workbench。

  2. 用管理员 PowerShell 创建 MDT 期望存在的空目录:

    powershell
    New-Item -ItemType Directory -Force `
      -Path "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\x86\WinPE_OCs"
  3. 重新打开 Deployment Workbench,进入 Deployment Share → Properties → Windows PE。

  4. 只保留 x64 平台,禁用或取消 x86 支持。

  5. 确认下面的 x64 目录存在:

    text
    C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs
  6. 执行 Update Deployment Share,选择 Completely regenerate the boot images。

创建 x86 空目录只是为了绕过 MDT 管理单元的旧路径检查,并不代表要生成 x86 启动映像。Windows 11 部署建议使用 x64 WinPE。

如果仍然崩溃,确认 Windows ADK 与 Windows PE Add-on 版本完全一致;还可以优先改用 ADK 25398。微软社区记录过相同的 MDT/新版 ADK MMC 崩溃问题:MDT and ADK setup for Windows 11 cause error in MMC。

9.2 WinPE 生成失败或启动异常 ​

若你坚持用路线 B(24H2 基线 PE),Update Deployment Share 可能报: MakeWinPEMedia / The ADK WinPE 路径找不到 或生成后 PE 无法启动。

规避手段(按推荐顺序):

  1. 优先路线 A:改用 ADK 25398(§4 路线 A),部署的 OS 仍是 24H2,无功能损失。

  2. 应用 MDT 24H2 补丁:用官方/社区发布的 MDT 8456 24H2 支持补丁包,覆盖:

    • C:\Program Files\Microsoft Deployment Toolkit\Templates\LiteTouchPE.xml
    • ...\Templates\LiteTouchPE.xml 与 Binary\x64\PSProvider 相关脚本 覆盖后完全重建启动映像(§6.9)。
  3. 兜底(手动 PE):若仍失败,用 ADK 手动生成:

    powershell
    # 管理员 PowerShell
    & "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\copype.cmd" amd64 D:\WinPE
    # 把 MDT 的脚本/Unattend 注入后 MakeWinPEMedia,再把生成的 wim 作为 WDS 启动映像

    此法维护成本高,仅作救急。


10. 客户端 PXE 启动与验证 ​

  1. 客户端开机 → 进入启动菜单(如 F12)→ 选 IPv4 PXE Boot。
  2. 应看到 WDS 加载 MDT LiteTouch Win11 (x64)。
  3. 进入 LiteTouch 向导:
    • 本教程的 SkipTaskSequence=NO 会保留任务序列选择页面,部署时手动选择任务序列;如需自动选择,参见 6.8.1.1。
    • 本教程的 SkipLocaleSelection=YES 已固定中文(中国)、默认微软拼音和北京时间,因此不会显示 Locale and Time 页面。
    • 本教程的 SkipAdminPassword=YES 会跳过 Administrator Password 页面;本地 Administrator 密码已在创建任务序列时设置,不从 CustomSettings.ini 读取。
    • 本教程的 SkipApplications=NO 会保留应用程序选择页面;需要自动安装指定应用时,参见 6.8.1.1。
    • 按任务序列执行 UEFI/GPT 分区、驱动注入和操作系统安装。
    • 本教程的 SkipDomainMembership=NO 会保留 Domain Membership 页面;继续前请核对域名和加域账号。
    • 使用 JoinDomain 和 DomainAdmin 配置完成加域;由于未指定 MachineObjectOU,计算机账户默认进入域的 Computers 容器。
    • FinishAction=REBOOT 会在任务序列完成后自动重启客户端。
  4. 完成后重启,登录域,验证:
    • 计算机名 = 序列号(或你定义的规则)
    • 已加入 huohuo.com,计算机对象位于域的 Computers 容器
    • 设备管理器无黄色感叹号(驱动匹配正确)

11. 运维与排错 ​

现象排查
客户端 PXE 卡在 " contacting server "检查 DHCP 作用域地址池、WDS 服务、代理 DHCP 设置、防火墙 UDP 69/4011
LiteTouch 启动后提示连不上 \\MDT01\DeploymentShare$查 Bootstrap.ini 的服务器名、UserID/密码、共享权限和网络连通性
加域失败查实际加域账号的权限、域名、账户是否锁定/过期和默认计算机容器设置
驱动不匹配(设备带感叹号)核对 Model 字符串、已选择的驱动方案、目录/Profile 名称
24H2 PE 生成失败见 §9,回退路线 A
部署慢部署共享移到独立高速盘;多机并发开 WDS 多播(Multicast)

进阶:

  • 多播:WDS → 服务器属性 → Multicast,对一次性大规模并发有效。
  • MDT Database:把机型→驱动/应用/设置做成 SQL 数据库,适合机型很多的环境。
  • LTI/ZTI:当前是 LTI(Lite Touch);配合 SCCM 才是 ZTI。

12. 上线前检查清单 ​

  • [ ] Windows Server 2025 已完成计算机重命名(默认 MDT01),时间/DNS 正常
  • [ ] ADK + WinPE add-on 版本一致(25398 或 26100+补丁)
  • [ ] MDT 8456 安装完成
  • [ ] WDS 角色安装,RemoteInstall 目录就位
  • [ ] DeploymentShare 在独立盘,共享 DeploymentShare$
  • [ ] Win11 OS 映像已导入
  • [ ] 已选择一种驱动方案,并完成对应配置:DriverGroup 或 Selection Profile,不能同时启用
  • [ ] CustomSettings.ini / Bootstrap.ini 已配(加域、跳过向导)
  • [ ] (可选)如使用自定义 OU,已配置 MachineObjectOU 并委派实际加域账号权限
  • [ ] Update Deployment Share 完全重建成功,生成 LiteTouchPE_x64.wim
  • [ ] WDS 已添加 LiteTouchPE 启动映像
  • [ ] DHCP 已授权、作用域已启用,WDS DHCP 选项卡的两个同机配置已勾选
  • [ ] WDSServer 启动类型为 Automatic,当前状态为 Running
  • [ ] 一台样机 PXE 实测通过,驱动/加域验证 OK
  • [ ] 大规模并发前评估多播

附:常用 PowerShell 速查 ​

powershell
# 安装 DHCP 与 WDS 角色(本教程为同机部署)
Install-WindowsFeature -Name WDS,DHCP -IncludeManagementTools -Restart

# 重启 WDS 服务
Restart-Service WDSServer

# 设置 WDS 为自动启动并立即启动
Set-Service -Name WDSServer -StartupType Automatic
Start-Service -Name WDSServer

# 完全重建 MDT 启动映像(等效于控制台 Update)
# 在 Deployment Workbench 右键 Update Deployment Share 即可

# 查看 ADK 版本
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots"

# 查客户端机型字符串(建驱动目录前必查)
Get-CimInstance Win32_ComputerSystem | Select-Object Manufacturer,Model

文档版本:v1.0 | 适用 MDT 8456 + ADK 25398/26100 + Windows Server 2025 + Win11

留言

还可输入 500 字
留言加载中…

基于 VitePress 构建