xiaowuhello
【转载】Win7 封装深入研究教程《步步为营封 Win7》C

Win7 封装深入研究教程《步步为营封 Win7》C

2009-12-06 00:21

步步为营封WIN7》磁盘控制器

(一)概念

关于磁盘控制器驱动,这似乎是个老生常谈的问题了。从大概两年前我就一直在努力的纠正“SATA驱动、串口驱动”这些概念错误,但效果不佳,直至今日仍有部分技术人员将这些具有很大偏颇性的词语挂在嘴边,乃至误导更多的新手。所以今天我会再次重复强调一下“磁盘控制器”和“磁盘控制器驱动”的概念,新手请务必读懂,老手也有必要进行重温。

什么是磁盘控制器?从字面上也大概可以看出,磁盘控制器的作用是管理和控制磁盘。这里的“磁盘”是一个广义的概念,泛指现在常用的机械硬盘和固态硬盘。磁盘控制器有集成于主板上的,也有独立的(如各类SCSI卡),而且磁盘控制器是由来已久的,不是到“SATA时代”才开始出现的。我们这里一定要搞清楚三个问题:

1、磁盘控制器与磁盘无关。

系统是通过磁盘控制器来识别磁盘的,所以磁盘控制器上的磁盘无论是什么样子(无论是PATA、SATA、RAID、SCSI以及等等)系统是绝对不会操心的,系统唯一关心的是它能否识别磁盘控制器,如果能识别磁盘控制器那么磁盘控制器就会告诉系统怎么去管理磁盘。

这就好像以为领导要找一份档案材料,他只要找的到档案室的管理员就可以,至于这个档案室管理员去什么样的档案柜上怎么去找档案材料,领导是无需担心的。就像系统无需操心磁盘类型是一样的

原版系统中(无论是WINXP还是WIN7)都会包含一定量的磁盘控制器驱动,这些驱动可以应付部分磁盘控制器,而且一般而言,应付并口磁盘控制器是没有什么问题的。但随着时间的推移,随着新硬件和新磁盘控制器的推出,系统自带的磁盘控制器驱动会越来越显得单薄,这就是为什么我们在系统封装与部署时必须增补额外磁盘控制器驱动的原因。

2、磁盘控制器驱动是针对磁盘控制器的

上文已述,系统并不关心磁盘是什么样的,而系统只需要能够控制磁盘控制器就可以了。那么系统要怎么才能拥有对磁盘控制器的控制能力?答案就是通过驱动程序。系统通过磁盘控制器驱动获得对磁盘控制器的控制能力,从而控制磁盘。

3、磁盘控制器工作模式与磁盘类型无关。

现在硬盘的各种标识让人眼花缭乱,而各种关于磁盘控制器工作模式的描述又让人产生各种混淆,SATA、SATAII、AHCI、RAID以及等等,但我这里要说的是,你的硬盘是SATA那么系统就真的把你的硬盘当做SATA了吗?答案为否。

刚才已经说了,系统通过磁盘控制器了解磁盘,而磁盘控制器又有着多种工作和控制模式。在CMOS里我们可以看到对磁盘控制器的设置,大多磁盘控制器拥有多种工作模式,例如IDE模式、AHCI模式、RAID模式等等。如果你是一个SATA硬盘,而磁盘控制器开启的是IDE模式,那么很遗憾,系统仅仅把你的硬盘当做普通IDE硬盘来对待。建议,如果您的硬盘支持更高级的工作模式,请把CMOS里的设置也相应调整以提高磁盘性能。

说完这些概念,我请大家在今后不要再谈论所谓“SATA硬盘驱动”了,这句话带有很大的错误性,并容易误导更多的新手!

(二)磁盘控制器驱动

封装用磁盘控制器驱动(俗称SRS驱动)和即插即用磁盘控制器驱动还是有区别的。

封装用磁盘控制器驱动属于系统关键设备驱动,随系统启动而启动,属于不可或缺的驱动,如果没有这个驱动系统就无法控制磁盘控制器,从而无法操作磁盘,结果就是造成系统的宕机。即插即用磁盘控制器驱动则不同,它就像显卡和声卡的驱动一样,不安装仅仅是无法发挥硬件的最大效能而已,例如显卡驱动不装各种效果无法开启、声卡驱动不装会无声音等。但封装用磁盘控制器驱动和即插即用磁盘控制器驱动本身是无区别的,所以这只是同一种驱动的两种工作模式罢了。

那么封装用磁盘控制器驱动是怎么工作的呢?

1、系统启动时检测系统关键设备列表,并准备将这个列表中的设备启动起来,这个列表在注册表中的:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase

打开CriticalDeviceDatabase键,其下是所有系统关键设备的硬件ID。而我们看一个一硬件ID名命名的键,一般包括ClassGUID和Service子键,键值为拥有此硬件ID的设备的设备所属类和所调用的系统服务。

如果当前磁盘控制器存在于系统关键设备中,那么就根据磁盘控制器硬件ID的Service键去寻找它所需要使用的服务。而如果当前磁盘控制器不存在于系统关键设备中,则直接蓝屏宕机。

2、使用磁盘控制驱动服务,系统的所有服务都位于:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services

当然也包括磁盘控制器驱动的服务。而如果当前磁盘控制器所需要的驱动服务并不存在,则直接蓝屏宕机。

我们打开一个磁盘控制器驱动的服务,这个服务包括很多子键,但其中较为重要的是ImagePath和Start,它们分别规定了本服务要加载哪个驱动文件和本服务的启动方式。

3、加载磁盘控制器驱动文件,启用磁盘控制器。由启动的磁盘控制器驱动服务决定加载哪个驱动文件,这些驱动文件一般都位于C:\Windows\System32\drivers中,而如果这个驱动文件在被加载的时候不存在,则直接蓝屏宕机。

通过如上描述,我们发现了如下一个过程:

系统关键设备-->设备驱动服务-->设备驱动文件。

(1)当前磁盘控制器是否属于系统关键设备,不属于则宕机,属于则根据系统关键设备列表中的相应描述,去寻找这个磁盘控制器所对应的驱动服务;

(2)如果找不到这个磁盘控制器所对应的驱动服务,则宕机,找得到则根据驱动服务中规定的驱动文件,去寻找这个磁盘控制器所对应的驱动文件;

(3)如果找不到驱动文件,则宕机,找得到则使用此驱动控制磁盘控制器。

这是个连贯的过程,哪一个环节出现问题,最终的结果都是宕机。

(三)INF阅读术

阅读驱动的INF文件需要一定的经验积累,同样也需要一定的尝试和失败,所以我这里只能以制作封装用磁盘控制器驱动为目的的INF阅读方法。

以下我以INTEL AHCI磁盘控制器驱动为例介绍,INTEL的驱动写的标准且简介,而且INTEL驱动本身是最为稳定的,建议新手练手时选取INTEL的驱动。

1、读出驱动所属类

01.[version]

02.CatalogFile=iaAHCI.cat

03.Signature="$WINDOWS NT$"

04.Class=hdc

05.ClassGuid={4D36E96A-E325-11CE-BFC1-08002BE10318}

06.Provider=%INTEL%

07.DriverVer=06/04/2009,8.9.0.1023

[/code

version段一般在驱动INF的开头处,Class即为本驱动所属类,而ClassGuid是这个类的GUID。驱动所属类是个重要的信息,在我们制作封装用磁盘控制器驱动的系统关键设备部分有着很重要的地位。

2、读出哪些硬件ID对应本驱动,而每个硬件ID又使用了哪个驱动服务

这一般需要去读两个段,一个是:

复制代码

[code]

01.[Manufacturer]

02.%INTEL%=INTEL_HDC,ntx86

Manufacturer段规定了如下哪个段是用来记录驱动描述、所用服务、驱动ID的。“INTEL_HDC”是主段名,“,”后面的是附加段名。例如在这个描述中,如下可能有两个段包括驱动描述、所用服务和驱动ID信息:INTEL_HDC段,或INTEL_HDC. ntx86段。

INTEL的磁盘控制器是一体化的驱动,从XP到WIN7用的驱动是相同的,所以它的Manufacturer段的内容比较简单。有些驱动针对不同系统是分开的,可能会有针对XP和WIN7的不同设置,请根据实际情况进行应变。

另一个需要我们阅读的段十分重要,这个段也是由Manufacturer段规定出来的

01.[INTEL_HDC.ntx86]

02.%PCI\VEN_8086&DEV_2681&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_2681&CC_0106

03.%PCI\VEN_8086&DEV_27C1&CC_0106.DeviceDesc% = iaStor_Inst,PCI\VEN_8086&DEV_27C1&CC_0106

04.%PCI\VEN_8086&DEV_27C5&CC_0106.DeviceDesc% = iaStor_mobl_Inst,PCI\VEN_8086&DEV_27C5&CC_0106

05.%PCI\VEN_8086&DEV_2821&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_2821&CC_0106

06.%PCI\VEN_8086&DEV_2829&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\VEN_8086&DEV_2829&CC_0106

07.%PCI\VEN_8086&DEV_2922&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_2922&CC_0106

08.%PCI\VEN_8086&DEV_2929&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\VEN_8086&DEV_2929&CC_0106

09.%PCI\VEN_8086&DEV_3A02&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_3A02&CC_0106

10.%PCI\VEN_8086&DEV_3A22&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_3A22&CC_0106

11.%PCI\VEN_8086&DEV_3B29&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\VEN_8086&DEV_3B29&CC_0106

12.% @8 N%PCI\VEN_8086&DEV_3B2F&CC_0106.DeviceDesc% = iaStor_mobl_Inst, PCI\VEN_8086&DEV_3B2F&CC_0106

13.%PCI\VEN_8086&DEV_3B22&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_3B22&CC_0106

“=”前的部分是关于这个驱动的文字描述,我们可以在INF的String段里看到,不过这个对我们制作封装用磁盘控制器驱动基本没什么作用。

“=”后的部分,“,”前是针对本硬件ID哪些段对它进行了处理,例如“iaStor_Inst”,如下各段中凡以此开头的,都是针对本硬件ID的处理,包括为本硬件ID添加哪个服务。

( i“=”后的部分,“,”后是磁盘控制器的硬件ID,如“PCI\VEN_8086&DEV_3B29&CC_0106”。

这些磁盘控制器的硬件ID将在随后被我们添加到封装用磁盘控制器驱动的系统关键设备中,而它们所对应的服务将是我们下一步阅读的目标。

3、读出硬件所对应的服务。

在刚才的INTEL_HDC.ntx86段中,我们获得了本驱动可支持的硬件ID列表,现在我们要把这些ID对应的服务找出来。例如:

%PCI\VEN_8086&DEV_3A22&CC_0106.DeviceDesc% = iaStor_Inst, PCI\VEN_8086&DEV_3A22&CC_0106

规定了PCI\VEN_8086&DEV_3A22&CC_0106的各类操作由iaStor_Inst相关段决定,那我们就去寻找iaStor_Inst的相关段,直到找到:

01.[iaStor_Inst.Services]

02.8 N9 v3 ]6 f; K. zAddService = iaStor, %SPSVCINST_ASSOCSERVICE%, iaStor_Service_Inst, iaStor_EventLog_Inst

本段中决定要添加一个服务(AddService),名为“iaStor”,添加方法由“iaStor_Service_Inst”段决定,添加的事件日志由“iaStor_EventLog_Inst”段决定。随后我们找到“iaStor_Service_Inst”段。

复制代码

01.[iaStor_Service_Inst]

02.DisplayName = %*PNP0600.DeviceDesc%

03.ServiceType = %SERVICE_KERNEL_DRIVER%

04.StartType = %SERVICE_BOOT_START%

05.ErrorControl = %SERVICE_ERROR_NORMAL%

06.ServiceBinary = %12%\iaStor.sys1 j J- Z* C" E- S; E

07.LoadOrderGroup = SCSI Miniport

08.AddReg = iaStor_parameters_AddReg

DisplayName,服务的显示名,这对我们制作封装用磁盘控制器驱动没太大关系。

ServiceType,服务的类型,这里是“内核级驱动”。

StartType,服务启动类型,这里是“随系统启动”。

ErrorControl,报错类型,这里是“一般性报错”。

ServiceBinary,这个其实是驱动文件的位置,%12%代表System32\drivers,则完整驱动文件路径为“System32\drivers\iaStor.sys”。

LoadOrderGroup,驱动所属的组。

AddReg,这一般是为本服务额外添加的注册表键和键值。

通过阅读这些,我们知道了硬件ID为“PCI\VEN_8086&DEV_3A22&CC_0106”的设备所需服务的基本概况,特别是我们得知了这个驱动服务所加载的驱动文件名称及位置。以此类推,解决其他的硬件ID。

从INF里读到了这些信息,我们就可以着手制作WIN7的封装专用磁盘控制器驱动了。

(四)制作封装专用磁盘控制器驱动

制作封装专用磁盘控制器驱动其实就是一个将INF转成REG的过程,曾经有过这种工具,但我个人并不建议大家使用。如果使用者并不明白INF转REG的真正原理,就很难了解这项技术的真正内在本质,更难于在出现问题时能够独立解决,这个技术的公共交流带来了很多不便。本节内容我会和大家一起亲手将INTEL AHCI磁盘控制器驱动的INF转成封装用的REG文件,以让大家更加了解这项技术的本质。

上文中,我们已经介绍了INF阅读的基本方法,下面我们来对INF进行一下转化。

1、系统关键设备部分

这部分的注册表键和键值遵守如下样式:

01.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\(硬件ID)]

02."ClassGUID"="(类的GUID)"

03."Service"="(对应的服务名)"

硬件ID,读取自INTEL_HDC.ntx86段,例如“PCI\VEN_8086&DEV_2922&CC_0106”

类的GUID,读取自version段,“ClassGuid={4D36E96A-E325-11CE-BFC1-08002BE10318}”

对应的服务名,读取自INTEL_HDC.ntx86段,由“PCI\VEN_8086&DEV_2922&CC_0106”对应的iaStor_Inst段所派生的iaStor_Inst.Services决定服务名,为“iastor”

那么“PCI\VEN_8086&DEV_2922&CC_0106”的系统关键设备部分注册表应该写为:

01.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\ PCI#VEN_8086&DEV_2922&CC_0106]

02."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

03."Service"=" iastor "

(注意硬件ID中的“\”变为“#”)

以此类推,将其他硬件ID的系统关键设备的注册表键和键值写完

2、驱动服务部分

分的注册表写起来比较容易,但要注意对应关系,即INF中的名字和REG中的名字不同。

回顾一下iaStor_Service_Inst段,依据此段写封装用磁盘控制器驱动的驱动服务时,不是所有的部分都需要,我将它简化一下:

01.[iaStor_Service_Inst]

02.ServiceType = %SERVICE_KERNEL_DRIVER%

03.StartType = %SERVICE_BOOT_START%

04.ErrorControl = %SERVICE_ERROR_NORMAL%

05.ServiceBinary = %12%\iaStor.sys

06.LoadOrderGroup = SCSI Miniport

INF中带有“%%”的部分,在INF的String段有期对应的值,最简单的方法可以全文搜索一下两个“%”之间的内容,即会找到他们对应的值。如本例中,替换为值后为:

01.[iaStor_Service_Inst]

02.ServiceType = 1

03.StartType = 0

04.ErrorControl = 1

05.ServiceBinary = system32\drivers\iaStor.sys

06.LoadOrderGroup = SCSI Miniport

这些部分在注册表中分别对应:

01. INF中的ServiceType对应注册表中的Type;

02. INF中的StartType对应注册表中的Start;

03. INF中的ErrorControl对应注册表中的ErrorControl

04. INF中的ServiceBinary对应注册表中的ImagePath

05. INF中的LoadOrderGroup对应注册表中的Group。

而服务部分的一般样式为:

01.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\(服务名)]

02."ErrorControl"

03."Group"=""

04."ImagePath"=""

05."Start"=

06."Type"=

则我们转化后为:

01.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\iaStor]

02."ErrorControl"=dword:00000001

03."Group"="SCSI Miniport"

04."ImagePath"="system32\drivers\IaStor.sys"

05."Start"=dword:00000000

06."Type"=dword:00000001

这样,服务部分我们也搞定了。

3、驱动文件

差点忘记了,不要忘记把驱动程序文件“IaStor.sys”也提取出来,在执行系统封装时复制到“ImagePath”所规定的位置即可。

经过全部过程后,我们可以制作出来一份INTEL AHCI磁盘控制器的封装用磁盘控制器驱动了!这份驱动的注册表文件为:

01.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_2681&CC_0106]

02."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

03.G"Service"="iaStor"

04.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_27C1&CC_0106]

05."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

06."Service"="iaStor"

07.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_27C5&CC_0106]

08."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

09."Service"="iaStor"

10.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_2821&CC_0106]

11."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

12."Service"="iaStor"

13.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_2829&CC_0106]

14.{"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

15."Service"="iaStor"

16.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_2922&CC_0106]

17.[. r2 k! T"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"4 b- N+ I# x4 }

18."Service"="iaStor"

19.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_2929&CC_0106]

20."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

21."Service"="iaStor"

22.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_3A02&CC_0106]

23."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

24."Service"="iaStor"

25.- ^% ^4 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_3A22&CC_0106]

26."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

27."Service"="iaStor"

28.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_3B29&CC_0106]

29."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

30."Service"="iaStor"

31.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_3B2F&CC_0106]

32."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

33."Service"="iaStor"

34.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#VEN_8086&DEV_3B22&CC_0106]

35."ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

36."Service"="iaStor"

37.[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\iaStor]

38."ErrorControl"=dword:00000001

39."Group"="SCSI Miniport"

40."ImagePath"="system32\drivers\IaStor.sys"

41."Start"=dword:00000000

42."Type"=dword:00000001

至此,我们学会了制作封装用磁盘控制器驱动的方法。制作封装用磁盘控制器驱动需要长期的实践和总结,也需要经历无数的失败才能成就最后的成功!

[4]《步步为营封WIN7》初级部署控制

在Windows XP封装时代,我们用Sysprep.inf来控制部署过程中的基本问答部分,以实现基本的无人值守安装。

到了Windows Vista/2008/7这代系统以后,微软改用了文件映像系统安装方式、大幅的改进了系统部署过程中的各种控制项目,微软也提供了“Windows系统映像管理器(Windows System Image Manager,简称SIM)”来实现对Windows Vista/2008/7这代系统部署过程的控制,SIM所能管理的项目种类繁多,如果能够得心应手的使用SIM那么对系统各方面的控制将会达到一个不错的高度。

SIM用来生成一个XML文件,此文件可以用于普通系统安装或系统封装部署中的各种控制项目,我们讨论的是系统封装与部署,所以今天我们所讨论关于SIM的使用均是以“为实现更方便快捷的系统封装与部署”为核心来进行的。有关SIM的进一步使用,请大家逐步摸索,今天我们只研究在系统封装部署最常用的部分。

XWAIK中包含很多与Windows系统映像定制相关的内容,包括完整全面的帮助文档,选中不解的部分F1一下会更快得到答案。

(一)SIM的基本使用

下载WAIK,安装完毕后,打开SIM,进入如下界面:

菜单栏,【文件】,【新建应答文件】,这时会提示:

单击【是】,选择系统映像(Windows7的系统映像可以到Windows7系统光盘的source目录提取):

选中系统映像,SIM经过检测后会询问你要以这个映像中的哪个版本为依据进行设置,选择与您对应的版本,例如Ultimate

【确定】后SIM会有相应的改变:

SSIM中我们最常用的有:

1、左下角的【Windows 映像】,这里可以选择我们要进行设定的模块-

2、中间靠上部分的【应答文件】,这里我们会以树状结构预览到我们的各项设定,包括如下时机:

(1)【windowsPE】,众所周知Windows7在安装前会启动一个WINPE环境以执行系统安装,这个设定就是关于这个PE的

(2)【offlineServicing】,这部分设定是关于离线服务的,一般用不到

(3)【generalize】,这部分设定很重要,关于一般系统部署过程的

(4)【sepcialize】,这部分设定很重要,关于特殊系统部署过程的

(5)【auditSystem】和【auditUser】,这两部分是关于系统审核的,一般用不到

(6)【oobeSystem】,这部分设定很重要,关于OOBE过程的

3、右侧的【属性】,这里用于设定每个选项的具体属性

SIM遵循这样一种过程,在【Windows 映像】中选择要设定的模块,将选中的模块传送到【应答文件】中适当的实机,后在【属性】中对刚刚传送来的实机进行详细设定。"

下面我就以实例讲解使用SIM的一般过程:

第一,添加要在“部署中”调用的程序

【Windows 映像】Components中选择“Windows-Deployment”模块,并右键单击其下的:“RunSynchronous”子模块,单击【添加设置传送到sepcialize】

(RunSynchronous和RunAsynchronous的功能是相同的,都是添加调用程序,但RunSynchronous是逐个运行的,而RunAsynchronous是不等待上一个运行结束即运行下一个的)

右键【应答文件】中刚传送来的RunSynchronous,单击【插入新建RunSynchronousCommand】,以创建新的调用

单击刚刚添加的RunSynchronousCommand,在右侧的【属性】部分设置其属性,主要有设定:

Description(描述):我们设定为“InDeploy”

Order(被调用的顺序):我们设定为“1”

Path(要调用的程序名):我们设定为“%WinDir%\Test -InDeploy”

如果有更多调用,请仿照这个过程,添加更多程序就可以了,注意设定一下Order属性'

第二,添加“首次登录”调用的程序

【Windows 映像】Components中选择“Windows-Shell-Setup”模块,并右键单击其下的:“FirstLogonCommands”子模块,单击【添加设置传送到oobeSystem】

右键【应答文件】中刚传送来的FirstLogonCommands,单击【插入新建SynchronousCommand】,以创建新的调用

单击刚刚添加的SynchronousCommand,在右侧的【属性】部分设置其属性,主要有设定:$ j6 z: A/ [3 e% n- l. i" C. ]! a

Description(描述):我们设定为“FirstLogon”

LOrder(被调用的顺序):我们设定为“1”

CommandLine(要调用的程序名):我们设定为%WinDir%\Test.exe -FirstLogon”

如果有更多调用,请仿照这个过程,添加更多程序就可以了,注意设定一下Order属性

第三,添加“进入桌面后”调用的程序

【Windows 映像】Components中选择“Windows-Shell-Setup”模块,并右键单击其下的:“LogonCommands”子模块,单击【添加设置传送到oobeSystem】

右键【应答文件】中刚传送来的LogonCommands,单击【插入新建AsynchronousCommand】,以创建新的调用

单击刚刚添加的AsynchronousCommand,在右侧的【属性】部分设置其属性,主要有设定:

Description(描述):我们设定为“Go2Desktop”

Order(被调用的顺序):我们设定为“1”

CommandLine(要调用的程序名):我们设定为“%WinDir%\Test.exe -Go2Desktop”

如果有更多调用,请仿照这个过程,添加更多程序就可以了,注意设定一下Order属性

第四,添加OOBE阶段设定项目

【Windows 映像】Components中选择“Windows-Shell-Setup”模块,并右键单击其下的:“OOBE”子模块,单击【添加设置传送到oobeSystem】

单击刚传送到【应答文件】中的OOBE部分,查看右侧【属性】部分进一步设定:

HideEULAPage:设定为true,即为跳过协议界面;设定为false,则不跳过

HideWirelessSetupInOOBE:设定为true,即跳过OOBE中的无线设定部分;设定为false,则不跳过

NetworkLocation:有三个值,Home(家庭)、Work(工作)、Other,根据情况设定

ProtectYourPC:1、2、3三个值,对应自动获取所有补丁、自动获取重要补丁、不自动升级三个选项

SkipUserOOBE:跳过用户OOBE过程

通过这四个例子,我想大家对SIM的使用已经有了一定的熟悉,SIM中还有N多值可以设定,大家可以逐步尝试。如遇到不明确的内容,可以选中选项后按F1,WAIK有详细的帮助文档。

(二)Sysprep3.14的使用

自Windows Vista开始,微软更新了Sysprep程序,版本为3.14。新版Sysprep.exe与以往版本差异很大,参数如下:

复制代码

01./audit

02.重新启动计算机进入审核模式。审核模式使您可以将其他驱动程序或应用程序添加到 Windows。您还可以在将 Windows 安装发送给最终用户前对其进行测试。

03.如果指定了无人参与 Windows 安装程序文件,则 Windows 安装程序的审核模式将运行 auditSystem 和 auditUser 配置阶段。

04./generalize

05.准备要作为映像的 Windows 安装。如果指定此选项,所有唯一的系统信息将从 Windows 安装中删除。安全 ID (SID) 重置,所有系统还原点将被清除,事件日志也将被删除。

06.下次计算机启动时,将运行 specialize 配置阶段。将创建新的安全 ID (SID),如果用于 Windows 激活的时钟三次没有被重置,将其重置。

07./oobe

08.重新启动计算机进入“欢迎使用 Windows”模式。“欢迎使用 Windows”允许最终用户自定义其 Windows 操作系统、创建用户帐户、命名计算机和其他任务。在“欢迎使用 Windows”启动前,将立即处理答案文件中 oobeSystem 配置阶段的所有设置。

09./reboot

10.重新启动计算机。使用该选项审核计算机并确保首次运行体验正确工作。

11./shutdown

12.在 sysprep 命令完成运行后关闭计算机。

13./quiet

14.运行 Sysprep 工具而不显示屏幕确认消息。如果自动运行 Sysprep 工具,则使用该选项。

15./quit

16.运行指定命令后,关闭 Sysprep 工具。

17./unattend:answerfile

18.在无人参与安装期间,将答案文件中的设置应用到 Windows。

19./ Vanswerfile

20.指定要使用的答案文件的路径和文件名。

在无人参与安装期间,将答案文件中的设置应用到 Windows。

指定要使用的答案文件的路径和文件名。

读完这些参数的朋友应该注意的到了一点:/unattend:answerfile,举例:/unattend:D:\xxx.xml。到这里大家应该看明白了,微软新一代系统的部署并不是在系统部署过程中才去读取无人值守文件的内容,而是在系统封装时就将这些信息读入了,读入的方法正是使用sysprep3.14的命令行加以设定!

好的,下面我们就来看一个使用sysprep3.14封装系统的实例,以便于更深入的了解这个过程中要注意的问题。

我们在刚才是一共SIM生成无人职守应答文件时,设定了在部署中、首次登录、进桌面调用的名为Test的程序,这个程序我放在了附件里,有需要请下载。注意,如果设定了要运行不存在的程序,则系统部署过程中会直接报错,请特别注意。所以如果你按照刚才SIM的使用实例中设定了调用windows文件夹下的test.exe程序,那么务必在执行下述例子之前将test.exe放入windows文件夹。

1、将我们刚才生成的Untitled.xml放在D盘根目录下,打开命令提示符,运行如下命令:复制代码

01.c:\windows\system32\sysprep\sysprep.exe /oobe /generalize /quit /quiet /unattend:d:\Untitled.xml

2、运行成功,系统封装过程开始

由于我设定的是“/quit ”,所以封装后不会重启,在确认无其他调整后,手动重启计算机

3、系统部署到下图阶段时(部署中),会调用我们的test.exe运行

4、部署完毕进入系统,进入OOBE过程

5、OOBE结束,首次登录:

6、首次登录时调用我们的test.exe

7、首次进桌面调用我们的test.exe

到这里,我们就通过使用SIM,配合sysprep的命令行参数,完成了一次自动化封装,并对系统部署过程进行了简单的控制。

但我个人认为这并不完美:

1、几遍我们在SIM中设置了部分OOBE部分的自动应答,但OOBE过程还是过长,封装部署的目的就是快速,这个过程耽误了太多时间;

2、每次部署后都要新建用户,这对国内普遍使用Administrator登陆的习惯不符。

用过ES3_WIN7封装模块的朋友可能已经发现了,ES3_WIN7封装模块具有自动跳过OOBE和直接使用ADMIN登陆的能力,这大大提高了系统部署速度,简化了系统设置过程,直接减少了劳动量。这是怎么达到的?请听下回分解!

步步为营封WIN7》进阶部署控制

使用和拓展系统封装与部署技术的目的有二:

1、在尽可能保证稳定的基础上加快系统安装速度,减少重复的机械化的无意义劳动,提高工作效率;

2、降低技术门槛,让需要多步骤执行的过程简化为按几个按钮就能完成的事情。

如果是为了这两个目的考虑,那么我们在学会了基本的部署阶段控制的基础上,就要拓展一些内容了。在上一章里我说过,一般的WIN7封装与部署有两个缺点:

1、使用非ADMIN登陆不符合中国用户的习惯;

2、繁琐的OOBE过程有效的降低了我们的工作效率,增加了不必要的负担。

那么本章的目的就明确了:

1、想办法自动激活ADMIN账户

2、跳过OOBE过程

3、接管部署过程以实现1和2。

(一)自动激活ADMIN

WIN7的ADMIN账户默认是禁用的,我们可以在封装前将其设置为启用,而后方便我们的自动化封装工作。

[但烦人的问题也随即出现了,ADMIN账户在封装后又会自动改为禁用。本想大不了在封装后再手工开启呗,结果发现部署完成后ADMIN账户又自动禁用了(无语……)。好吧,看来微软是无论如何也要禁用ADMIN了,那么这个问题就由我们来解决吧。

1、激活ADMIN账户的方法

这个并不复杂,其实只需要一行批处理命令就可以了:

复制代码

01.net user Administrator /Active:yes

这个命令是WIN7自带的,不是第三方的,所以稳定性和适用性无需担心。

AU3的写法是:

复制代码

01.RunWait(@ComSpec & " /c " & "net user Administrator /Active:yes", "", @SW_HIDE)

大家可以参照

2、激活ADMIN的时机

系统部署到进入桌面的过程大致为:

系统部署-->重启-->系统OOBE-->首次登录-->桌面

在“系统部署”这个步骤完成后系统会自动禁用ADMIN账户,而我们如果跳过了OOBE过程,就直接到了“首次登录”这个步骤。但这样就造成了问题,即ADMIN没有被激活,跳过OOBE后又没有新账户可以用(除非封装前残留了其他账户),这样就造成了系统内无可用用户!这个后果就严重了,没有用户可用,也无法创建新用户,那么这个系统就无法被登录和使用,则这个系统就成了名副其实的废物……

我们通过SIM设定后,系统部署中、首次登录、桌面我们都有可用接口,但自动禁用ADMIN是在部署后执行的,而由于我们跳过了系统OOBE过程,则我们又必须在首次登录前就激活ADMIN,所以系统部署中、首次登录、桌面三个接口我们都无法使用。我们需要这样一个时机,即在系统部署完成后(即windeploy.exe运行完毕后,随后详解)ADMIN被禁用后,执行ADMIN的激活,才能达到我们需要的目的

这样我们就需要更强大的部署过程控制能力,以实现部署后这个程序调用接口(当然,顺道我们也可以实现部署前程序调用接口)。至于详细怎么做,本章第“(三)”部分会详细说明

(二)跳过OOBE过程

这个的实现相对简单,回想上一章我们使用SIM设定OOBE功能模块的时候,OOBE部分有一个属性叫做“SkipMachineOOBE”。

根据说明上说,SkipMachineOOBE是在WIN7测试时才使用的一个参数,在一般的系统安装中是被废弃的属性。但实践证明,在系统部署过程中这个选项可以有效的跳过OOBE过程。实践出真知,无论它本来的设计意图是什么,只要能够实现我们的目的,就是好功能,没有必要过于拘泥于理论。

在SIM中我们将OOBE模块的SkipMachineOOBE设置为“true”

SkipMachineOOBE一旦被设置为“true”,OOBE过程就会被跳过,则OOBE部分的其他设定就没有太多意义了,所以我取消OOBE的其他设定。

保存,系统封装时使用这个xml配置文件,就会跳过系统OOBE过程。

需要注意的是,如果没有自动激活ADMIN且封装前系统内没有余留其他用户,则不要使用此功能。原因在“(一)”中我已经说明。

(三)接管部署

系统封装与部署主要就是执行了两个程序:

1、system32\sysprep\sysprep.exe,运行这个程序执行系统封装,我们已经很熟悉这个了

2、system32\oobe\windeploy.exe,系统进入系统部署模式后,自动运行这个程序以完成系统部署中的各项功能

那么,系统是如何知道进入系统部署模式后要运行哪个程序那?或者说,系统是怎么知道要运行windeploy.exe以完成系统部署的?

打开注册表“HKEY_LOCAL_MACHINE\SYSTEM\Setup”,看一下“Setup”键的键值,一般为“oobe\windeploy.exe”,这下我们明白了,是这个键值规定了要执行什么。那么如果我们加入了自己写的部署控制程序,又更改这个键值指向我们的程序,是不是就可以接管部署过程了?答案是“可以”。

为了更好测试,我们以批处理的方式来实现。写如下批处理,名为deploy.cmd:

复制代码

01.start /wait %windir%\system32\oobe\windeploy.exe

02.net user Administrator /Active:yes

即为先调用windeploy.exe完成系统部署,而后使用命令行激活ADMIN账户。

好的,我们来实践一下。首先我们运行sysprep.exe执行系统封装,别忘记加载我们刚才生成的用于跳过OOBE过程的无人值守xml文件,一定要设置封装完毕后退出,以方便其后的设定。(如果xml中还规定了调用其他程序,例如上一章的test.exe,别忘记将test.exe放入所规定的windows文件夹)

封装完毕后,打开注册表编辑器,到“HKEY_LOCAL_MACHINE\SYSTEM\Setup”键下

将setup键值改为“deploy.cmd”

而后将deploy.cmd复制到system32目录下。(setup键值规定的程序是以system32为起始目录的,不可使用绝对路径)!

完成后,重启计算机,进入系统部署过程。可以看到我们写的批处理接管了部署过程,由我们的批出里调用windeploy执行部署过程,windeploy执行完毕后还会由命令行自动激活ADMIN。

部署完成后,重启计算机,自动跳过OOBE过程,直接以ADMIN登陆系统

到这里,我们就用最原始的批处理完成了对WIN7部署过程的接管。如果您讨厌批处理的黑框,可以尝试用AU3等写一个类似的程序。

有的朋友可能要问了,那部署前接口怎么实现?这个简单,只要是运行于“start /wait %windir%\system32\oobe\windeploy.exe”之前的不就是部署前调用吗?以后我们可以很方便的在windeploy.exe运行前执行例如驱动解压等过程,就像现在XP部署过程一样。

最基本和最核心的方法我已经带给了大家,大家想开出什么花,由大家自己发挥吧!

到这里,我们实现了自动激活ADMIN、自动跳过OOBE,有效的加快了系统部署过程,减少了不必要的操作。本章中,我们还学习了如何接管部署过程,以及部署前和部署后接口的实现方法。本章虽然比较短,但内容比较多,请大家认真阅读,多加实践。