转自:http://zxkh19501.blog.163.com/blog/static/12378517920126271147583/
(教程中批处理内容差不多都是用蓝色表示,要替换的批处理段落通常是用绿色来表示。为保证避免转载过程造成的颜色差异所引起的问题,故把转载地址放在首行。本人秉持着经验传递的精神来分享此贴,不存在抄袭。整篇文章内容未作只字修改,保证原文正品O(∩_∩)O。)
所谓“部署过程中的一些控制”是指Win7安装过程中添加驱动、启用Administrator、OEM自动识别与激活、注册表修改等等。
制作多合一的WIM一般是这样的过程。
第一步,封装一个有补丁和IE9的WIM出来,这个教程的讲的就是这一过程:http://zxkh19501.blog.163.com/blog/static/1237851792012635360717/,此时我们获得一个WIM文件,x64ult.wim。言下之意,封装出来的这个是旗舰版的WIM文件,里面只有一个卷映像,这个卷映像中没有任何OEM资料,需要自行激活。在OEM合集中通常被称为“Retail”。
如果想略过这一步,你可以提取出来官方原版64位的旗舰版出来。具体操作是将install.wim提取到某分区(虚拟光驱动也可以行,路径稍有不同),然后执行IMAGEX命令:imagex /export H:\install.wim 4 H:\x64ult.wim
第二步,以“Retail” 为基础,通过添加不同的OEM资料,在Wim文件中增加卷映像,形成多个OEM版本,类似33in1这样的合集。制作方法参考:http://zxkh19501.blog.163.com/blog/static/1237851792012612114029919/。
但为什么添加了OEM资料包后就可以启用Administrator,就可以直接登录桌面,就可以自动识别OEM信息自动激活,就可以右键增加“记事本打开”等选项呢?这就是Win7安装过程中的个人DIY要控制的一些内容。这个中间环节以前一直没细说,因为大家都是用现成的OEM资料包就可以。今天补上这一些环节,但可能也不会全,比如OEM主题订制、OOBE.CMD中的OEM自动识别等还涉及不到(有空再说),但会讲到大家很关心的驱动包调用及外置接口的使用原理以及启用Administrator等问题。
你现有使用的操作系统最好是Win7(或R2),然后备一张带有X64\X86的PE光盘,这样可以通吃X86和X64的Win7。如果虚拟机里有Win7也是可行的,比如现有操作系统是64位的,虚拟机里是32位的WIN7,有时候需要到32位WIN7中去执行一些批处理。一般来说你要处理X86的WIM,最好是在X86的环境中,这方面DISM命令比较挑剔,IMAGEX相对自由些。
一、驱动包调用及外置接口的使用原理
驱动包调用分两种:一是安装过程中,二是安装结束后首次进入桌面时。
1、安装过程中调用驱动包的实现
我们拿刚封装出来的x64ult.wim为例,此时,WIM中只有一个“Retail”版本。WIM复制一份作为备份,以防制作过程中没处理好。在H分区建一个文件夹(举例:mywim),将x64ult.wim移进来。执行IMAGEX命令行,将x64ult.wim 挂载到H:\mywim\Temp_wim目录下。
MD H:\mywim\Temp_wim
imagex /info H:\mywim\x64ult.wim 1 “Windows 7 旗舰版 64位 [Retail]" "Windows 7 旗舰版"
imagex /mountrw H:\mywim\x64ult.wim 1 H:\mywim\Temp_wim
copy H:\mywim\Temp_wim\windows\system32\config\system H:\mywim
pause
如果没有异常,关闭批处理窗口。此时一个名为“system“的文件(无后缀名)被复制到mywim目录下。这是x64ult.wim中的注册表文件之一。下面要对其进行修改,添加安装过程中调用驱动包的命令。
Windows键+R键,运行“regedit”,调出现在系统的注册表,点击一下“HKEY_LOCAL_MACHINE”,“文件”处选“加载配置单元”,打开前面复制出来的名叫“system“的文件,会让你命名,如X64WIN7,随意取吧。
如上图,你需要修改X64win7中setup里边的Cmdline的值,这里我们举例是个CMD文件,这个文件必须放在WIM中的windows\system32目录下。Dep.cmd的内容如下:
@echo off
if exist "%SystemDrive%\Drv\Drv.exe" (
Start /wait %SystemDrive%\Drv\Drv.exe
)
Start /wait %SystemRoot%\System32\oobe\windeploy.exe
命令的主要内容是,如果存在驱动包的执行文件(Drv.exe)就调用,如果没有就略过。你不一定非得用CMD文件这种形式,也可以用AU3编写个EXE文件,以免安装时弹出个批处理的框框不好看。也可以下载我做好的DepX64.exe、DepX86.exe(附件下载 ),一个用于64位,一个用于32位,如果用这两个文件之一,修改Cmdline的值就不是改成Dep.cmd,而是改为DepX64.exe,或DepX86.exe。或者别人的你不一定放心,你自己做一个,给个AU3代码你自己看。
_Windows_X64()
Exit
Func _Windows_X64()
Local $SystemDrive = EnvGet("SystemDrive")
If FileExists($SystemDrive & "\Drv\Drv.exe") Then
RunWait($SystemDrive & "\Drv\Drv.exe")
RunWait($SystemDrive & "\Windows\System32\Oobe\WinDeploy.exe")
Else
RunWait($SystemDrive & "\Windows\System32\Oobe\WinDeploy.exe")
EndIf
EndFunc
都改好之后,点一下“X64WIN7”,“文件”处“卸载配置单元”,这样,mywim目录下的“system”文件就保存了修改的注册表信息。将“system”文件复制到H:\mywim\Temp_wim\windows\system32\config目录下,替换旧的,将Dep.cmd复制到H:\mywim\Temp_wim\windows\system32目录下。
(如果你不想再对WIM进行什么修改,直接看本文的第四部分)
2、进入桌面调用驱动包的实现
安装结束后首次进入桌面,如果运行一次某个批处理或EXE文件,通常是预先在注册表里加上Runonce(只运行一次)命令,而不是用Run命令,因为RUN命令每次登录桌面都会运行,你需要删除注册表键值才不会每次如此。 如何预先在注册表中加入Runonce命令,后面我们会讲到。这里先说一下,首次进入桌面后用到的批处理文件,主要用于清理系统安装完成后产生的多余文件,以及调用驱动包(绿色字部分)等等。 假定这个批处理文件叫End.cmd,添加卷映像时把它放在H:\mywim\Temp_wim\windows\setup目录下。批处理文件的内容如下:
@Echo Off
COLOR 2F
echo 关闭休眠功能
%windir%\system32\powercfg.exe -h off >nul
echo 清理安装过程的临时文件
IF EXIST "C:\SWTOOLS" RD /Q /S C:\SWTOOLS
IF EXIST "%Systemroot%\Setup\OEMFILES" RD /Q /S %Systemroot%\Setup\OEMFILES
IF EXIST "%Systemroot%\Setup\AIDA64" RD /Q /S %Systemroot%\Setup\AIDA64
IF EXIST "%SYSTEMDRIVE%\AIDA64 REPORTS" RD /Q /S "%SYSTEMDRIVE%\AIDA64 REPORTS"
IF EXIST "%windir%\Setup\Scripts" (
attrib -R -A -S -H %windir%\Setup\Scripts\*.* >nul
rd /q /s %windir%\Setup\Scripts >nul
)
IF EXIST "%windir%\Panther\unattend.xml" (
attrib -R -A -S -H %windir%\Panther\unattend.xml >nul
del /q /f %windir%\Panther\unattend.xml >nul
)
echo 调用驱动包中的EXE文件(如果有)
IF EXIST "%SystemDrive%\Drv\Drv.exe" (
start %SystemDrive%\Drv\Drv.exe
)
del %0
说明:用上“IF EXIST”的意思是,如果指定目录有Drv.exe,那么就运行Drv.exe,如果不存在,则略过,运行下一行(段)命令。这个End.CMD用于桌面调用驱动包的,不会删除系统分区的下Drv和Drivers目录,你要自己手动处理。如果要用于安装过程中调用驱动包的版本,那么上述绿色字部分替换成下面那样:
IF EXIST "%windir%\System32\DepX64.exe" (
attrib -R -A -S -H %windir%\System32\DepX64.exe >nul
del /q /f %windir%\System32\DepX64.exe >nul
)
IF EXIST "%windir%\System32\DepX86.exe" (
attrib -R -A -S -H %windir%\System32\DepX86.exe >nul
del /q /f %windir%\System32\DepX86.exe >nul
)
IF EXIST "%SystemDrive%\Drv" RD /Q /S "%SystemDrive%\Drv
IF EXIST "%SystemDrive%\DrIvers" RD /Q /S "%SystemDrive%\DrIvers
.二、激活内置管理员Administrator
先下载个示例材料($OEM$文件夹,附件),$$目录是与上述的WIM挂载目录H:\mywim\Temp_wim中的windows目录相对应,复制时,就是将$$目录的所有文件夹复制到wiindows目录下。
$OEM$\$$\Panther中有个unattend.xml文件,系统安装时会自动调用这个XML文件。XML的格式是一段前行与后行对称,在一行中也是头与尾对称。格式不能出错,你可以用AIK中的“Windows 系统映像管理器”来验证格式。
示例材料是用于简体中文X64(64位)。如果用于简体中文X86(32位),要将$OEM$\$$\Panther中的unattend.xml文件中的几处"amd64"改为"x86"(用记事本打开即可修改)
如果你需要部署过程中增加一段(或多段)命令来运行CMD文件(或EXE文件)。如下图,复制命令段落并相应修改,添加一段来执行Add.cmd(举例的名字)的命令段落。比如,通过Add.cmd来执行一些常用运行库的安装等等。
settings pass="specialize"表示部署过程中要执行的一些处置,可以加载CMD或EXE文件,以及进行一些系统设置。
settings pass="oobeSystem"表示在登录前要执行的一些处置,可以加载CMD或EXE文件,以及进行一些系统设置。
示例材料中,我们让安装程序在specialize阶段执行一个ActAdmin.cmd文件,激活内置管理员帐号,所以不应当在登录前才处理的。这个CMD文件放在Setup目录下(其实示例中提到的CMD文件,REG文件都我都放在这个目录下)。
ActAdmin.cmd文件具体内容:
@Echo Off
COLOR 2F
net user Administrator /active:yes
net user Administrator_ploc /active:yes
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v FilterAdministratorToken /t REG_DWORD /d 0 /f
del %0
这样,我们通过unattend.xml文件来执行ActAdmin.cmd这个批处理以达到激活内置管理员administrator的目的,为自动登录创造条件。
三、进行一些简单的系统设置订制
如下图,我们将执行下一个名为“MyDiy.cmd”文件,用它来执行一些注册表修改、运行EXE文件等。这个文件也在Setup目录下。
这个CMD文件的内容如下:
::执行一个右键添加“显示隐藏文件与后缀名”的EXE文件::
start /wait %windir%\Setup\Hidden.exe >nul
::导入要修改的注册表项::
start /wait regedit /s %windir%\Setup\MyDiy.reg >nul
del /q /s %windir%\Setup\Hidden.exe >nul
del /q /s %windir%\Setup\MyDiy.reg >nul
del %0
MyDiy.reg的内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel]
;在桌面上显示个人文件夹图标 dword:00000001为不显示
"{59031a47-3f72-44a7-89c5-5595fe6b30ee}"=dword:00000000
;在桌面上显示计算机图标
"{20D04FE0-3AEA-1069-A2D8-08002B30309D}"=dword:00000000
;在桌面上显示网络图标
"{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}"=dword:00000000
[HKEY_CLASSES_ROOT\*\shell\Notepad]
@="用记事本打开该文件"
[HKEY_CLASSES_ROOT\*\shell\Notepad\Command]
@="notepad %1"
;开始菜单显示“运行”栏
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"Start_ShowRun"=dword:00000001
;首次进入桌面运行%windir%\setup\end.cmd
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]
"aa"=hex(2):25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,53,00,65,00,\
74,00,75,00,70,00,5c,00,45,00,6e,00,64,00,2e,00,63,00,6d,00,64,00,00,00
说明:前面所说的如何在首次进入桌面后调用end.cmd来运行驱动包,就在此时(登录桌面前)写入注册表。如果你是想安装过程中调用驱动的,“首次进入桌面后调用end.cmd来运行驱动包”(绿色字)这一段注册表修改项都删除掉。
四、封装
假定你在第一部分“安装过程中调用驱动包的实现”时,将x64ult.wim挂载到H:\mywim\Temp_wim目录下,也假定你准备好了$OEM$文件夹中的所有材料,那么,复制$OEM$中的$$目录下的所有文件夹到H:\mywim\Temp_wim\Windows目录下,提示合并时就合并(如果你仅仅是修改第一部分的所说的“system“的文件,不想订制别的任何内容,连$OEM$文件夹都不用准备,不需要复制什么)。然后,执行IMAGEX命令。
imagex /commit /append H:\mywim\Temp_wim “Windows 7 旗舰版 64位 [MyDiy]"imagex /unmount H:\mywim\Temp_wim
PAUSE
到此为止,x64ult.wim中添加了一个新的卷映像(原先的"Retail"没有变化),这个新的卷映像我们用“MyDiy”来表示,这个映像能调用安装目录分区下Drv文件夹中的驱动包了。将x64ult.wim改名为install.wim,用ultraiso打开官方原版64位WIN7的ISO文件,将新的install.wim替换进sources目录,然后,在sources目录建立一个$oem$文件夹,下一级再建一个$1文件夹,再下一级再建一个Drv文件夹,将驱动包中的EXE文件及其平行的文件夹一起拖进Drv中,将EXE文件改名为Drv.exe。另存ISO,虚拟机测试一下那个标识有“MyDiy”的那个版本,看看是不是大功告成。
五、其他
示例材料中还有AIDA64、OEMFILES、Scripts文件夹,都是跟OEM自动识别、激活有关的,这里不介绍了(有空再说吧),你照用就是了。因为OEMLOGO图片等文件比较多比较大,示例材料中没有提供,但有提供证书。
真有用到OEMLOGO资料包,比较完整的到这里下载:http://zxkh19501.blog.163.com/blog/static/12378517920126149350305/。示例材料只是用来教程演示用的。
本文中很多都是用批处理的形式来处理,如果你精通AU3,你都可以将CMD文件变成EXE文件。不过打包成EXE,看起来专业点,但放心度却下降了,起码CMD文件很容易用记事本打开看看,到底是什么东西。闲话。
附件:
示例材料($OEM$文件夹):
DepX64.exe、DepX86.exe:
http://dl.vmall.com/c0n624bmdw