WinPE动态配置优化方案
假如有十台机子同时安装windows指定的同一个系统,按照之前的方案制作WinPE的时候,sampa服务器的地址及应答文件名称都被硬编码到WinPE镜像中显然是不行的,这时候需要引入WinPE动态配置
WinPE动态配置主要解决下面几个问题:
1、每台机器使用独立配置文件
2、所有配置在Samba服务器统一修改
3、可根据硬件类型自动选择不同模板
4、新增机器无需重制WinPE镜像
一、准备应答文件
应答文件前文有提到过请参考批量无人值守装机(使用cobbler批量安装windows)
不过此时使用的是动态配置优化方案,这时候的应答文件是由根据物理MAC地址作为文件名称,可在业务程序中提前创建并保存到指定的共享目录中
这里附上已测试成功的windows7应答文件供参考使用:
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend"><settings pass="windowsPE"><!-- 指定系统安装过程中界面的语言 --><component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SetupUILanguage><UILanguage>zh-CH</UILanguage></SetupUILanguage><InputLocale>zh-CH</InputLocale><SystemLocale>zh-CH</SystemLocale><UILanguage>zh-CH</UILanguage><UserLocale>zh-CH</UserLocale></component><!-- 接受 EULA(最终用户许可协议),输入 Windows 密钥 --><component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><UserData><AcceptEula>true</AcceptEula><FullName>sessert</FullName><Organization>sessert</Organization><ProductKey><Key>87VT2-FY2XW-F7K39-W3T8R-XMFGF</Key></ProductKey></UserData><!-- 配置Windows安装类型 --><ImageInstall><OSImage><InstallFrom><MetaData wcm:action="add"><Key>/image/index</Key><Value>4</Value> <!-- 版本索引号 --></MetaData></InstallFrom><InstallTo><DiskID>0</DiskID><PartitionID>2</PartitionID><!-- 安装到C盘 --></InstallTo><!-- 是否显示用户界面 --><WillShowUI>Never</WillShowUI><!-- 必须通过`<InstallTo>`元素明确指定安装目标分区 --><InstallToAvailablePartition>false</InstallToAvailablePartition></OSImage></ImageInstall><!-- 配置Windows系统安装和磁盘分区 --><DiskConfiguration><Disk wcm:action="add"><DiskID>0</DiskID><WillWipeDisk>true</WillWipeDisk><CreatePartitions><!-- 1. 系统保留分区 (100MB) --><CreatePartition wcm:action="add"><Order>1</Order><Size>100</Size><Type>Primary</Type></CreatePartition><!-- 2. C盘系统分区 (50GB 50*1024=51200MB) --><CreatePartition wcm:action="add"><Order>2</Order><Size>51200</Size><Type>Primary</Type></CreatePartition><!-- 3. D盘数据分区 (剩余空间) --><CreatePartition wcm:action="add"><Order>3</Order><Extend>true</Extend> <Type>Primary</Type></CreatePartition></CreatePartitions><ModifyPartitions><ModifyPartition wcm:action="add"><Order>1</Order><PartitionID>1</PartitionID><Label>System Reserved</Label><Format>NTFS</Format><Active>true</Active></ModifyPartition><ModifyPartition wcm:action="add"><Order>2</Order><PartitionID>2</PartitionID><Active>true</Active><Format>NTFS</Format><Label>OS</Label><Letter>C</Letter></ModifyPartition><ModifyPartition wcm:action="add"><Order>3</Order><PartitionID>3</PartitionID><Active>true</Active><Format>NTFS</Format><Label>Data</Label><Letter>D</Letter></ModifyPartition></ModifyPartitions></Disk></DiskConfiguration><!-- 是否开启系统动态更新 --><DynamicUpdate><Enable>false</Enable></DynamicUpdate></component></settings><settings pass="specialize"><!-- 配置计算机名和自动登录 --><component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><ComputerName>*</ComputerName> <!-- * 表示随机产生名字 --> <AutoLogon><Password><Value>sessertpwd</Value><PlainText>true</PlainText></Password></AutoLogon></component></settings><settings pass="oobeSystem"><component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><!-- 配置自动登录 --><AutoLogon><Password><Value>sessertpwd</Value><PlainText>true</PlainText></Password></AutoLogon><!-- 第一次登录执行指令 --><!-- <FirstLogonCommands><SynchronousCommand wcm:action="add"><Order>1</Order><RequiresUserInput>false</RequiresUserInput><Description>关闭防火墙</Description><CommandLine>ipconfig /all</CommandLine></SynchronousCommand></FirstLogonCommands> --><!-- 设置Windows Update保护 --><OOBE><ProtectYourPC>3</ProtectYourPC> <!-- 保护等级 --><NetworkLocation>Work</NetworkLocation> <!-- 工作网络 --></OOBE><!-- 配置系统用户 --><UserAccounts><AdministratorPassword><Value>sessertpwd=</Value><PlainText>true</PlainText></AdministratorPassword><LocalAccounts><LocalAccount wcm:action="add"><Password><Value>sessertpwd</Value><PlainText>true</PlainText></Password><Name>sessert</Name><DisplayName>xxx科技公司</DisplayName><Group>Administrators</Group><Description>Administrators-sessert</Description></LocalAccount></LocalAccounts></UserAccounts><!-- 设置系统时区 --><TimeZone>China Standard Time</TimeZone></component></settings><cpi:offlineImage cpi:source="wim:e:/winpe/cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408/sources/install.wim#Windows 7 ULTIMATE" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>
二、准备自定义脚本文件
需要注意的是该脚本文件编码格式为ANSI)
如果不是ANSI编码格式需要转换成该格式否则执行自定义脚本的时候会中文乱码(window系统自带的记事本另存为一下即可)
这里附上自己测试成功的cmd脚本文件供大家参考使用:
@echo off
setlocal enabledelayedexpansion::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: WinPE 动态部署脚本 - 适用于多机并发安装
:: 功能:自动获取MAC地址,从Samba服务器获取专属应答文件
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::rem [INFO] 开始执行动态部署脚本
echo %date% %time%::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 步骤1:获取网络接口MAC地址
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
echo [STEP 1] 获取本机MAC地址...rem 获取本机MAC地址...
set MAC_ADDR=
set NETCFG_TMP=%TEMP%\netcfg.txtrem 获取第一个有效以太网适配器的MAC地址
ipconfig /all > %NETCFG_TMP%echo NETCFG_TMP: %NETCFG_TMP%
if exist %NETCFG_TMP% (type %NETCFG_TMP%
) else (echo file not found: %NETCFG_TMP%pauseexit /b 1
)rem 方式1:ipconfig指令获取mac地址
for /f "tokens=2 delims=:" %%a in ('type %NETCFG_TMP% ^| findstr /C:"Physical Address" /C:"物理地址"') do (if "!MAC_ADDR!"=="" (set MAC=%%aecho [FOR_IPCONFIG_MAC] : !MAC!rem 去除空格和破折号(因为MAC地址中可能有空格或-和:)set MAC=!MAC: =!set MAC=!MAC:-=!set MAC=!MAC::=!set MAC_ADDR=!MAC!echo [FOR_IPCONFIG_MAC_ADDR] : !MAC_ADDR!)
)rem 方式2:wmic指令获取mac地址
if "%MAC_ADDR%"=="" (for /f "skip=1 tokens=1" %%a in ('wmic nic where "NetConnectionStatus=2" get macaddress') do (if "!MAC_ADDR!"=="" (set MAC=%%aecho [FOR_WMIC_MAC] : !MAC!rem 去除空格和破折号(因为MAC地址中可能有空格或-和:)set MAC=!MAC: =!set MAC=!MAC:-=!set MAC=!MAC::=!set MAC_ADDR=!MAC!echo [FOR_WMIC_MAC_ADDR] : !MAC_ADDR!))
)rem 方式3:兼容Windows7及更早版本
if "%MAC_ADDR%"=="" (for /f "delims=" %%a in (%NETCFG_TMP%) do (set "line=%%a"set "en=!line:Physical Address=!"rem 此处需要处理中文乱码的问题set "ch=!line:物理地址=!"if "!en!" neq "!line!" (for /f "tokens=2 delims=:" %%b in ("!line!") do (if "!MAC_ADDR!"=="" (set "MAC=%%b"echo [FOR_IPCONFIG_OLDEN_MAC] : !MAC!set MAC=!MAC: =!set MAC=!MAC:-=!set MAC=!MAC::=!set MAC_ADDR=!MAC!echo [FOR_IPCONFIG_OLDEN_MAC_ADDR] : !MAC_ADDR!)))if "!ch!" neq "!line!" (for /f "tokens=2 delims=:" %%b in ("!line!") do (if "!MAC_ADDR!"=="" (set "MAC=%%b"echo [FOR_IPCONFIG_OLDCN_MAC] : !MAC!set MAC=!MAC: =!set MAC=!MAC:-=!set MAC=!MAC::=!set MAC_ADDR=!MAC!echo [FOR_IPCONFIG_OLDCN_MAC_ADDR] : !MAC_ADDR!))))
)echo MAC_ADDR: %MAC_ADDR%
if "%MAC_ADDR%"=="" (echo [ERROR] MAC_ADDR == ""pauseexit /b 1
)::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 步骤2:连接Samba部署服务器
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
echo [STEP 2] rem 连接Samba服务器...
set SAMBA_SERVER=192.168.2.132
set SHARE_NAME=share
set DRIVE_LETTER=Z:rem 断开已有连接(如果存在)
net use %DRIVE_LETTER% /delete /y >nul 2>&1rem 建立新连接
net use %DRIVE_LETTER% \\%SAMBA_SERVER%\%SHARE_NAME%
if errorlevel 1 (echo [ERROR] Sambaecho check: echo - SAMBA_SERVER: %SAMBA_SERVER%echo - SHARE_NAME: %SHARE_NAME%pauseexit /b 1
)echo [SUCCESS] DRIVE_LETTER: %DRIVE_LETTER%::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 步骤3:设置应答文件的网络路径并检查应答文件是否存在
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
echo [STEP 3] rem 设置应答文件的网络路径并检查应答文件是否存在...
set TARGET_DIR=win7
set INSTALL_SOURCE=%DRIVE_LETTER%\%TARGET_DIR%
set ANSWER_FILE=%INSTALL_SOURCE%\%MAC_ADDR%.xmlif exist "%INSTALL_SOURCE%\%MAC_ADDR%.xml" (echo Using answer file: %ANSWER_FILE%:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 步骤4:启动Windows安装::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::echo. echo [STEP 4] rem 验证安装源是否存在if not exist "%INSTALL_SOURCE%\sources\install.wim" (echo [ERROR] miss install.wim: %INSTALL_SOURCE%\sources\install.wimnet use %DRIVE_LETTER% /delete /ypauseexit /b 1)rem 启动Windows安装程序...echo [INFO] ANSWER_FILE: %ANSWER_FILE%echo [INFO] INSTALL_SOURCE: %INSTALL_SOURCE%echo [INFO] TARGER_CODE: %INSTALL_SOURCE%\setup.exe /unattend:%ANSWER_FILE%start /wait %INSTALL_SOURCE%\setup.exe /unattend:%ANSWER_FILE%:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 清理资源::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::echo. echo [CLEANUP]net use %DRIVE_LETTER% /delete /y >nul 2>&1del %NETCFG_TMP% >nul 2>&1echo [COMPLETE]echo %date% %time%pause) else (echo Answer file not found: %ANSWER_FILE%:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 清理资源::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::echo. echo [CLEANUP]net use %DRIVE_LETTER% /delete /y >nul 2>&1del %NETCFG_TMP% >nul 2>&1echo [FAILED] echo %date% %time%pause
)
三、修改WinPE启动过程(下面已windows7系统为例)
这里需要注意的是不同版本的Windows系统制作WinPE引导镜像使用的工具也是不一样的。 可以从这里下载:适用于 Windows® 7 的 Windows® 自动安装工具包(AIK)。
下载解压运行 StartCD.exe
安装完成后以管理员身份运行部署工具命令提示
要将上面的custom.cmd脚本文件要放到c:\winpe\mount\Windows\System32目录下
#使用copype名称创建c:\winpe目录,并在该目录下生成WinPE预安装所需的文件copype amd64 c:\winpe#imagex挂载WinPE的启动文件到mount目录,挂载前可以清空一下之前的挂载 dism /cleanup-wim(也可以使用dism命令挂载)imagex /mountrw c:\winpe\winpe.wim 1 c:\winpe\mount#将执行自定义脚本文件命令写入到本地驱动器(custom.cmd脚本文件要放到c:\winpe\mount\Windows\System32目录下)echo call custom.cmd >> c:\winpe\mount\Windows\System32\startnet.cmd#完成以后提交保存并去除挂载imagex /unmount c:\winpe\mount /commit#生成win PE ISO镜像,路径及名称为c:\winpe\winpe_win7_amd64.isocopy c:\winpe\winpe.wim c:\winpe\ISO\sources\boot.wimoscdimg -n -bC:\winpe\etfsboot.com c:\winpe\ISO c:\winpe\winpe_win7_amd64.iso
最后使用重新生成WinPE镜像引导自动装机测试