PDA

查看完整版本 : 基于PXE启动的WINDOWS 2000/XP的多播克隆


Tony
2004-09-24, 04:32 PM
目前,各学校都建有自已的计算机实验室,这些机房一般都有大量配置相同的计算机。对这些设备的管理和维护,是各学校机房管理中最繁杂的日常工作。特别是学生实验用机,由于学生的误操作或恶作剧造成系统崩溃是常有的事。因此对学生实验用机系统的备份及快速恢复是校园机房日常维护中必须做的工作。快速备份和恢复系统的常用手段之一是硬盘的虚拟还原技术。但虚拟还原并没有完整的备份硬盘数据,如果出现硬盘损坏,虚拟还原软件是无法恢复硬盘数据的。

使用赛门铁克的磁盘管理工具Ghost进行多播克隆,可快速完整的备份和恢复系统。特别是对大量配置相同且连网的计算机。如果连网计算机配有可远程启动的网卡,使用Ghost进行多播克隆将更加方便。下面将介绍怎样采用赛门铁克的磁盘管理工具Ghost 7.5企业版来实现基于PXE的网络远程启动,进行WINDOWS 2000/XP系统的多播克隆。



多播克隆过程简述



  多播克隆过程为:首先在装有Ghost 7.5企业版的服务器端利用“Ghost Boot Wizard”生成一张启动软盘;然后在服务器端运行“GhostCast Server”,做好相关设置,再用刚才生成的启动软盘在装有软驱的工作站上启动机器,连接到服务器,使用Ghost多播服务(Multicast Server)将一台工作站上的硬盘或分区的数据备份到服务器端;改变GhostCast Server”的相关设置,用同样的启动软盘启动其他工作站,连接到服务器,使用Ghost多播服务(Multicast Server)将先前备份的工作站硬盘或分区的映像数据克隆到其他工作站,以实现完整、安全、快速的工作站硬盘克隆。



实现基于PXE的网络启动



对于配有网络远程启动功能的工作站,通过网络远程启动引导工作站自动执行相关操作,可省去用软盘一台一台引导工作站启动的麻烦。要实现PXE网络启动,需要完成以下几个步骤:



1、工作站端PXE启动设置



PXE网络启动一般要求在网卡上加装PXE启动芯片(PXE Boot ROM);对于某些型号的网卡,也可以将PXE启动代码(Boot Code)写入主板的Flash ROM;而一些主板上集成了网卡的,可直接支持PXE启动。

  本文以装有PXE启动芯片的RTL8139网卡为例,其PXE启动设置方式是:机器启动时根据屏幕提示按下Shift+F10,在“Network Boot Protocol”中选择PXE,“Boot Order”中选择Int 18h项。选择Int 18h项是为了让机器按CMOS中设置的启动顺序启动,在后文中将说明其作用。



2、服务器端的软件安装



可选择一台装有WINDOWS 2000 SERVER或WINDOWS SERVER 2003的机器作为服务器,不需要装成域控制器,一般的独立服务器即可。在进行多播克隆时整个局域网不要连入Internet网。服务器上要装有DHCP服务,安装Ghost 7.5企业版和3Com的DABS(Dynamic Access Boot Services)软件。



3、生成PXE启动映像文件



① 在服务器上使用“Ghost Boot Wizard”生成一张启动软盘,其过程如下:

单击“开始”按钮,选择“程序”→“Symantec Ghost” →“Ghost Boot Wizard”进入Ghost启动向导对话框,如图1所示。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-15014471.jpg

图1

单击“下一步”按钮,出现选择网卡对话框,如图2所示。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-15014473.jpg

图2

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-15014475.jpg

图3

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-15014477.jpg

图4

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-15014479.jpg

图5

在图2所示的对话框列表中没有RTL8139网卡,因此我们必须添加网卡,单击“Add”按钮,出现如图3所示的对话框,选择“NDIS2 Driver”,单击“OK”按钮,出现如图4所示对话框,单击其中的“Setup…”按钮,插入网卡驱动程序盘,在随后出现的“浏览文件夹”对话框中选择RTSND.DOS和OEMSETUP.INF文件所在文件夹,然后单击“浏览文件夹”对话框中“确定”按钮。

系统找到相应文件并读出相应参数后,将填入图4 对话框中的各文本框中,如图5所示。

单击图5中的“确定”按钮,回到图2 所示对话框,给新增的网卡取一个名字,然后单击“下一步”,出现如图6所示对话框。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144711.jpg

图6

在图6所示的对话框中,让我们选择DOS版本,如果选择“Use PC-DOS”,可直接单击“下一步”,若要选择“Use MS-DOS”则必须先点击“Get MS-DOS”按钮来读取MS-DOS文件。单击“下一步”后出现如图7所示的对话框中选择“Symantec Ghost”,单击“下一步”,出现如图8所示对话框,选择其中的“DHCP will assign the IP settings”选项,单击“下一步”。其后按屏幕提示插入一张空白磁盘到A驱,系统会根据所做的选择格式化磁盘,然后将所需要的文件拷贝到插入A驱的软磁盘中。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144713.jpg

图7

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144715.jpg

图8

② 修改启动盘

用“Ghost Boot Wizard”生成的启动软盘之目录结构如下:

[\]------+---- [GHOST] ------------------- GHOST.EXE

+---- [NET] ----------------+---- DIS_PKT.DOS

+---- AUTOEXEC.BAT +---- NETBIND.COM

+---- COMMAND.COM +---- PROTMAN.DOS

+---- CONFIG.SYS +---- PROTMAN.EXE

+---- IO.SYS +---- PROTOCOL.INI

+---- MOUSE.COM +---- RTSND.DOS

+---- MSDOS.SYS

上图的目录结构中,用方括号括起来的是目录,其他的是目录中的文件。这只是GHOST生成的启动软盘的目录结构,要达到本文所述的目的还需要对其进行改造。我们不但要远程网络启动进行多播克隆,还要恢复CMOS的设置,做到无人干预的自动恢复。因此还必须在这张启动盘中增加几个文件和修改AUTOEXEC。BAT文件。

要增加的文件一个是CMOS数据读取和写入程序CMOSMENU.EXE,一个是CMOS数据文件CMOS.DAT,这个文件是用CMOSMENU.EXE从工作站的CMOS中读取出来的,在读取数据前,一定要将CMOS中的启动顺序改为第一从软盘或硬盘启动,而不能是LAN,这也是我们在工作站端PXE启动设置中将“Boot Order”设置为Int 18h项的原因,目的在于工作站多播克隆完成重新启动后,不会再进行远程网络启动而从本地软盘或硬盘启动。原启动盘中的MOUSE.COM不用,可将其删除。再增加HIMEM.SYS、EMM386.EXE、REBOOT.COM、PARA.TXT等几个文件,其中REBOOT.COM是一个在DOS下重启系统的小程序,PARA.TXT是一个纯文本文件,其内容只有一个“2”字,用于将参数传递给CMOSMENU.EXE。

CMOSMENU.EXE是一个读取和写入CMOS数据的小程序,其作用是从CMOS中读取数据,或者将CMOS.DAT文件的内容写入CMOS,它可以带参数,带参数“1”是从CMOS中读取数据并保存在CMOS.DAT文件,带参数“2”是将CMOS.DAT文件中的数据重新写回CMOS。因此可以用CMOSMENU.EXE在工作站上先生成数据文件CMOS.DAT。在生成CMOS.DAT文件前,应先设置好CMOS,包括启动顺序,CMOS口令等。然后再生成CMOS.DAT文件,并将文件拷入到我们制作的启动盘中。

所需文件拷入启动盘后,复制一张启动盘,在一张上标记为备份启动,另一张上标记为还原启动,然后修改两张盘中的AUTOEXEC.BAT和CONFIG.SYS两个文件。

备份启动盘中的AUTOEXEC.BAT文件内容如下:

@echo off

prompt $p$g

\net\netbind.com

cd \ghost

echo Loading...

GHOST.EXE -clone,mode=dump,src=1,dst=@MCwin2k3 -sure -fx

cd \

cmosmenu < para.txt

reboot

还原启动盘中的AUTOEXEC.BAT文件内容如下:

@echo off

prompt $p$g

\net\netbind.com

cd \ghost

echo Loading...

GHOST.EXE -clone,mode=load,src=@MCwin2k3,dst=1 -sure -fx

cd \

cmosmenu < para.txt

reboot

上面的“win2k3”是多播服务的作业阶段名称(session name),可根据实际情况填写。

备份和还原启动盘中的CONFIG.SYS文件内容如下:

DEVICE=HIMEM.SYS /TESTMEM:OFF

DEVICE=EMM386.EXE NOEMS

DOS=HIGH,UMB

DEVICE=\net\protman.dos /I:\net

DEVICE=\net\dis_pkt.dos

DEVICE=\net\RTSND.DOS

改造完成后的启动软盘之目录结构如下:

[\]------+---- [GHOST]------------------ GHOST.EXE

+---- [NET] -------------+----- DIS_PKT.DOS

+---- AUTOEXEC.BAT +----- NETBIND.COM

+---- CMOS.DAT +----- PROTMAN.DOS

+---- CMOSMENU.EXE +----- PROTMAN.EXE

+---- COMMAND.COM +----- PROTOCOL.INI

+---- CONFIG.SYS +----- RTSND.DOS

+---- EMM386.EXE

+---- HIMEM.SYS

+---- IO.SYS

+---- MSDOS.SYS

+---- PARA.TXT

+---- REBOOT.COM

③ 生成启动映像文件

在服务器上,单击“开始”按钮,选择“程序” →“3Com Boot Services”→“Boot Image Editor”进入3COM启动映像文件编辑器,所图9如示。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144717.jpg

图9

点击上图中的“Create a TCP/IP or PXE image file”按钮,出现创建TCP/IP映像文件对话框,如图10所示。在“Image file name:”文本框中输入要创建的映像文件名及保存路径。这里我们先创建备份启动盘的映像文件,取名为“ghostbf.img”,保存到“D:\tftpsvr”目录下。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144719.jpg

图10

输入映像文件名和保存路径后,将先前制作的启动软盘(在这里是备份启动软盘)插入A驱,单击“OK”按钮,开始制作启动映像文件,过程如图11所示。完成后重新回到图9所示画面,重复上述操作,制作恢复启动映像文件,这里取名为“ghosthf.img”,和备份启动映像文件一样保存到“D:\tftpsvr”目录下。制作完成后重新回到图9所示画面,单击“Create a PXE boot file.”按钮开始制作启动菜单文件(即工作站远程启动后的选择菜单)。如图12所示。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144721.jpg

图11

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144723.jpg

图12

④ 制作远程启动菜单

在图12所示对话框中,单击“Add”按钮添加菜单项,出现如图13所示对话框。在“Image file”文本框中输入恢复启动映像文件名,或单击“Browse”按钮进行查找。可在“Menu description”文本框中输入菜单项的描述,完成后单击“OK”按钮建立一条菜单选项。重复上述操作,在“Image file”文本框中备份启动映像文件名,建立第二条菜单选项。完成后可看到如图14所示画面。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144725.jpg

图13

在图14中,红色箭头所指示的菜单项是“默认”选项,如果用户不作选择将按该菜单项所指的映像文件启动。菜单标题和等待时间可在图中的“Option”选项卡中设置,系统默认的等待时间是30秒钟,可根据需要进行调整。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144727.jpg

图14

设置好上述项目后,单击“Save”按钮保存设置,在图15所示的对话框中输入启动菜单文件名,这里是“PXEMENU.PXE”,同样保存在“D:\tftpsvr”目录下。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144729.jpg

图15



4、服务器端PXE启动服务设置



① DHCP服务设置

在服务器端,点击“开始”按钮,选择“控制面板”→“管理工具”→“DHCP”,打开HDCP管理控制台,如图16所示。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144731.jpg

图16
选择服务器,如上图中的“win2k3[200.10.10.1]”,在其上单击鼠标右键弹出快捷菜单,选择“属性” →“高级”页面,如图17所示。点击“绑定”按钮,出现如图18所示对话框。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-15014470.jpg

图17

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144733.jpg

图18

在图18中,如果机器配有多块网卡,应选择和内部局域网连接的网卡(即要做多播克隆的)和服务器绑定,在代表网卡的IP地址前的复选框中打上钩,点击“确定”按钮。

返回到图16所示界面后,选择作用域,如图16中的“作用域[200.10.10.1]”,在其上单击鼠标右键弹出快捷菜单,选择“属性” →“高级”页面,如图19所示。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144735.jpg

图19

Windows 2000 Server或WINDOWS SERVER 2003的DHCP服务支持两种启动协议:DHCP和BOOTP。我们可以设定以下三种选择:仅DHCP、仅BOOTP、两者。如果我们的局域网中由其他的DHCP服务器提供动态IP地址分配,那么这里选“仅BOOTP”即可;如果需要这台服务器提供动态IP地址分配,则需要选“两者”。作完选择后,点击“确定”按钮。

接下来设置启动文件名。在作用域下,选择作用域选项,在其上单击鼠标右键弹出快捷菜单,选择“配置选项(C)…”,出现如图20所示对话框。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144737.jpg

图20

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144739.jpg

图21

在图20的“常规”选项卡的列表中,选择可用选项“067:启动文件名”,“数据输入”框的字符串值为我们创建的PXE启动菜单文件名Pxemenu.pxe。注意:只是文件名,不包含路径。DHCP服务设置完成后的界面如图21所示。

② TFTP服务设置

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144741.jpg

图22

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144743.jpg

图23

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144745.jpg

图24

DHCP服务器只是将启动文件名通知给BOOTP客户机,客户机需要通过TFTP服务下载启动文件,因此我们还需要设置TFTP服务。在我们安装的3COM DABS中,就包含了一个TFTP服务组件,单击“开始”按钮,选择“控制面板”→“3Com TFTP”,出现如图22所示对话框,选择“File Transfer”选项卡如图23所示,在选项卡的两个文本框中输入前面我们保存映像文件和启动菜单文件的路径,即:“D:\tftpsvr”,然后选择“Network Cards”选项卡,查看和内部局域网相连的网卡是否在列表中。回到“Service”选项卡,选择“3Com TFTP startup type”为“Automatic”,点击“Start”按钮,单击“OK”按钮完成设置。

http://dev.csdn.net/Develop/ArticleImages/27/27842/CSDN_Dev_Image_2004-5-150144747.jpg

图25



5、启动服务



服务配置完成后,应检查所需要的服务是否都已启动。单击“开始”按钮,选择“程序” →“管理工具”→“服务”,出现如图25所示窗口,在“服务”窗口的列表中,我们可以查看所需要的服务是否都已启动,若没有启动,选择相应“服务”选项,在其上单击鼠标右键弹出快捷菜单,选择“启动”项来启动相应的服务。这里要查看的服务项目有:3Com BOOTP、3Com PXE、3Com TFTP、DHCP Server等。注意:如果配置了“路由和远程访问”服务,应在多播克隆时停止该项服务,否则客户机端可能不能正常工作。

Tony
2004-09-24, 04:33 PM
工作站端WINDOWS 2000/XP克隆前的准备



若工作站端操作系统是WINDOWS 9X,我们可以在一台工作站(参考机)上安装好操作系统和所有应用软件,然后重启系统,修改CMOS设置,设置LAN为第一启动设备。在服务器端运行“Ghost Server”并作相应设置;在工作站端按F10保存CMOS设置,退出CMOS设置后,系统从远程启动,选择启动菜单中的“backup”项,开始在服务器端生成工作站硬盘或分区的克隆映像文件。

若工作站端的操作系统安装的是WINDOWS 2000/XP,则不能像WINDOWS 9X那样直接在服务器端生成克隆映像文件。因为WINDOWS 2000/XP会面临一个重要的问题:如果把同一个磁盘映像部署到多台机器上,它们的安全标识符(SID)都和源机器相同。SID用来标识一台机器在网络上的唯一身份,每一台机器必须不同,但修改SID可不象修改机器名字和TCP/IP配置那么简单,必须使用Ghost Walker之类的工具,在克隆后的机器上修改SID。然而,这种事后修改SID的办法很容易遗留一些问题,例如许多工具未能正确、全面地更正注册表和文件系统中引用的SID。

还有一种方法是利用 WINDOWS 2000/XP提供的系统准备工具Sysprep,在制作磁盘映像之前预先处理参考机。Sysprep是一个“系统准备工具”,它能够在创建磁盘映像之前删除当前操作系统的所有唯一性信息。只要在创建磁盘映像之前先用Sysprep进行预处理,磁盘映像复制到目标机器之后,就不必再用Ghost Walker之类的工具重新删除和配置某些必须唯一的配置信息,特别是可能带来安全隐患的SID重复问题。

相对于其他SID修改工具,Sysprep采取了不同的策略。即使参考机上已经安装了各种应用软件,Sysprep也能够把参考机退回到设置SID之前的状态,确保系统SID的唯一性。在参考机上运行Sysprep后,第一次重新启动时,参考机将回到Windows安装过程最后阶段的状态,即指定机器名和网络标识符的状态,机器的SID就是在这个时候设定。

运行Sysprep的时机是在安装好参考机各种软件之后、制作磁盘映像之前, 执行Sysprep将清除系统中所有必须唯一的配置信息,包括机器的名称、序列号、SID等。参考机经Sysprep处理后,就可以按通常的方式制作磁盘映像文件了。

1、从何处得到Sysprep

Sysprep可以在WINDOWS 2000/XP的安装CD上找到,它在\Support\Tools的DEPLOY.CAB文件中。直接把整个DEPLOY.CAB文件解压缩到操作系统所在硬盘上的\sysprep目录下就可以了,不必安装。当然也可从微软的网站上得到。Sysprep针对WINDOWS 2000/XP有不同的版本,具体使用哪个版本请查阅微软网站上的相关信息。

2、制作安装应答文件

利用Sysprep可将系统重新封装成自动运行的最小化安装过程,这里需要一个安装应答文件:Sysprep.inf,在我们从DEPLOY.CAB文件解压缩出来的\Sysprep目录里,有一个“安装管理器”Setupmgr.exe(如图26所示),运行它就可以帮助我们建立安装应答文件Sysprep.inf。下面是建立过程:

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-15029020.jpg

图26

双击\Sysprep下的Setupmgr.exe启动安装管理向导,出现欢迎屏幕,如图27所示,点击“下一步”。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-15029022.jpg

图27

选择“创建新文件”,如图28所示,点击“下一步”。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-15029024.jpg

图28

选择“Sysprep安装”,如图29所示,点击“下一步”。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-15029026.jpg

图29

后面出现的界面会因所使用的WINDOWS版本和Syprep版本不同而有所不同,本文所使用的是装有SP1的WINDOWS XP,Syprep版本为5.1.2600.1106,在图30所示界面中,选择“Windows XP Professional”,单击下一步。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-15029028.jpg

图30

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290210.jpg

图31

在图31所示界面中,选择“是,完全自动安装”,单击“下一步”。



http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290212.jpg

图32

从图32所示的界面开始,是设置Windows安装过程中要用到的信息。每回答一组问题,点击一次“下一步”按钮,输入完全部信息后,系统弹出要求指定保存应答文件的路径和文件名对话框,如图33所示,输入相应内容,然后点击“确定”按钮,设置过程才算完成。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290214.jpg

图33

在设置Windows安装过程中要用到的应答信息时,有几点需要注意:

① 选择时区时必须手工选择GMT+8(北京)时区,它不会象正式安装过程那样自动选中这个选项;

② 仔细核对产品密钥,安装管理器不会核对密钥是否正确。打错了密钥,全自动安装过程就不可能顺利进行;

③ 由于我们要制作用于多播克隆的磁盘映像文件,计算机名应选择“自动产生计算机名”(Windows 2000必须指定一个计算机名)。如果想按网卡MAC地址来指定计算机名,可用后面将要介绍的程序在目标机重新启动后去修改计算机名,而这里应先选择“自动产生计算机名”;

④ 由于我们后面要做多播,因此管理员密码应设为空(即没有管理员密码);

⑤ 网络组件应选择“典型设置”,实际上也只能选择“典型设置”。在笔者所做的实验中,“自定义设置”实际是无法设置的,因为所有网络组件的选择列表都为空,没法选择。在使用WINDOWS XP操作系统的参考机上要注意,XP本身不带NETBEUI协议,若要用到该协议(如本文后面要介绍的修改计算机名程序),需在此之前安装好该协议,XP下安装NETBEUI协议网上有介绍,在此不再赘述;

⑥ 若想在目标机自动安装过程完成后用户第一次登录时自动运行某些程序,可在“运行一次”设置中添加。本文后面要介绍的一个程序setcpn.exe,用于按网卡MAC地址修改计算机名。为了让程序在用户第一次登录时自动运行,在此添加运行命令,如图34所示。当然,要运行的程序应是在启动安装管理器之前就已经在参考机上安装好了的。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290216.jpg

图34

3、执行Sysprep

安装应答文件Sysprep.inf建立起来后,就可以执行Sysprep.exe了。注意:Sysprep.inf应和Sysprep.exe在同一目录中,如图26所示。在图26所示窗口中,双击“Sysprep.exe”开始执行,此时会弹出一个警告窗口如图35所示,点击“确定”按钮。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290218.jpg

图35

稍作停顿,系统弹出如图36所示对话框,在此对话框中,选择“使用最小化安装”,如果目标机上有非即插即用硬件设置,还应选择“检测非即插即用硬件”,关机模式就用默认的“关机”,设置好后点击“重新封装”按钮,弹出如图37所示的一个警告窗口,点击其中的“确定”按钮,此后我们可以看到一个“Sysprep正在运行”的对话框,当Sysprep处理工作完成后,系统开始执行关机程序,关闭系统。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290220.jpg

图36

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290222.jpg

图37



制作磁盘映像文件



参考机克隆前准备工作完成关机后,即可在服务器端运行“Ghost Server”,操作步骤如下:

1、单击“开始”按钮,选择“程序”→“Symantec Ghost” →“Ghost Server”执行Ghost多播服务(如图38所示)。

2、在Ghost多播服务窗口的“Session Name”文本框中,输入作业阶段名称,该名称应和前面制作的启动软盘中的AUTOEXEC.BAT文件里所使用的作业阶段名称相同,否则客户机远程启动后将找不到多播服务器。

3、选择“Dump From Client”单选按钮,表示从客户机端接收磁盘映像文件。

4、在“Image File”文本框中输入磁盘映像文件名称和保存路径。

5、若是对参考机的整个硬盘进行克隆,选择“Disk”单选按钮,否则选择“Partition”单选按钮。

6、设置完成后,点击“Accept Clients”按钮,准备接收参考机传送过来的数据。

7、重新打开参考机电源开关,进入CMOS设置。注意:千万不能让参考机启动操作系统,否则前面的准备工作等于白做,必须从来一遍。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290224.jpg

图38

8、修改第一启动设备为“LAN”,保存并退出CMOS设置后系统重启,这时我们可看到参考机通过远程网络启动,运行到启动选择菜单时,选择“backup”并回车,一切就OK了。后面我们可看到参考机自动运行Ghost,然后将数据传送到服务器端,在服务器端可看到如图39所示界面。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290226.jpg

图39

当参考机数据传送完成后,会自动重启,由于在自动批处理文件中已经将CMOS重新设置,因此参考机将从自己的硬盘引导,并完成最小化全自动安装过程。服务器端接收完数据后,系统会弹出“Transfer Complete”对话框,点击“确定”按钮结束数据接收过程。



用GHOST做多播克隆



从参考机上得到磁盘映像数据并产生出磁盘映像文件后,即可进行多播克隆了。其具体操作步骤如下:

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290228.jpg

图40

1、在Ghost多播服务窗口的“Session Name”文本框中,输入作业阶段名称,该名称应和前面制作的启动软盘中的AUTOEXEC.BAT文件里所使用的作业阶段名称相同,否则客户机远程启动后将找不到多播服务器。

2、选择“Load TO Clients”单选按钮(如图40所示),表示分发磁盘映像文件到客户机端。

3、在“Image File”文本框中指定磁盘映像文件名称和所在路径。

4、若磁盘映像文件的内容是对整个硬盘数据的备份,选择“Disk”单选按钮,否则选择“Partition”单选按钮。

6、设置完成后,点击“Accept Clients”按钮,等待目标机应答(如图41所示)。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290230.jpg

图41

7、打开所有目标机电源开关,进入CMOS进行设置。

8、修改第一启动设备为“LAN”,保存并退出CMOS设置后系统重启,这时我们可看到目标机从远程网络启动,运行到启动选择菜单时,选择“restore”并回车。目标机将自动运行Ghost,然后等待服务器端发送数据。

9、待所有目标机启动完成后,在图41所示窗口中可看到所有目标机的IP和MAC地址,然后点击“Send”按钮开始发送数据,在服务器端发送过程如图42所示。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290232.jpg

图42

在服务器端数据发送完成后,系统会弹出“Transfer Complete”对话框,点击“确定”按钮结束数据发送过程。目标机接收完磁盘映像文件后会自动重启,由于在自动批处理文件中已经将CMOS重新设置,因此目标机的重启将从自己的硬盘引导,并完成全自动的最小化安装过程。并按照我们设定好的网卡MAC地址——计算机名对应表重新修改所有目标机的计算机名称。

如果许可的话,可在参考机上安装某套远程控制软件的受控端软件,在服务器端安装远程控制的控制端软件。当目标机启动完成后,还可在服务器端控制目标机完成一些其他应用程序的安装,如汉字输入法等。根据笔者的经验,Sysprep在重新封装时,会剔除非微软自带的输入法,因此在目标机启动完成后,必须重装其他汉字输入法。

如果想让目标机自动完成登录。可在服务器端控制目标机添加如下的注册表文件内容到注册表:

REGEDIT4



[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]

"DefaultUserName"="administrator"

"AltDefaultUserName"="administrator"

"AutoAdminLogon"="1"

"DefaultPassword"=""





应注意的问题



1、前面所述的CMOSMENU.EXE程序,只在主板BIOS是AWARD的机器上运行过,对AMI和Phoenix的BIOS主板没有试验过,能否正确读写CMOS不清楚。若出现克隆完成重启时目标机黑屏,可能是CMOS写入不正确。这时应断开计算机电源,打开机箱盖,用跳线环短接一下清除CMOS跳线,复位后装好机箱盖,重开计算机电源应能正常启动。

2、若CMOS设置中第一启动设备没有“LAN”,可将第一启动设备设为软驱或硬盘,然后在PXE启动设置中将“Boot Order”设为INT 19h,并在制作启动菜单文件时添加一项从本地硬盘启动,即在图13中选中“Boot from hard drive”复选框,并将其设为默认启动菜单选项。目标机启动时,若我们不作选择将从本地硬盘启动。

3、参考机网络配置如图43所示,需要安装NETBEUI协议和TCP/IP协议,TCP/IP协议采用自动获得IP地址(如图44所示)。

http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290234.JPG

图43



http://dev.csdn.net/Develop/ArticleImages/27/27843/CSDN_Dev_Image_2004-5-150290236.jpg

图44

4、在此再次强调:主机的配置应基本相同,至少主板、网卡是一致的,才可进行WINDOWS 2000/XP的多播克隆。

5、WINDOWS 2000版的Sysprep在生成安装应答文件Sysprep.inf时,计算机名无法自动产生,必须指定。因此在多台客户机完成数据接收重启后,会报计算机重名的错误,不必理会这个错误,点击错误信息框中的“确定”按钮继续安装。“修改计算机名” 程序执行后,这个错误将不会再报。

Tony
2004-09-24, 04:34 PM
修改计算机名程序



修改计算机名程序是用Visual Basic 6.0编写的一个小程序,其目的是为了使目标机的计算机名按机房管理员的要求进行设置,而非由系统自动随机产生。其原理是根据每台机器的网络MAC地址固定且不会相同,按机器的MAC地址来设置计算机名称。因此必须先生成一张MAC地址——计算机名映射表,程序根据表中的数据查找和机器MAC地址相同的记录,再用记录中的计算机名修改机器名称。

MAC地址——计算机名映射表是一个纯文本文件,其名为netname.dat,数据格式如下:

计算机名,MAC地址

如: winxp1, 000AEB1D6460

winxp2, 00E04CE43C61

aaaaaa, 00E04CE455E2

bbbbbb, 00E04C44365E

cccccc, 00E04C500555

………, ………………

该文本文件必须和生成的应用程序执行文件setcpn.exe在同一个目录中,执行文件setcpn.exe的运行命令是写在Sysprep.inf文件的[GuiRunOnce]段内的,请参见前述的制作应答文件内容。该程序执行后会自动删除netname.dat文件,以避免重复执行,并重新启动计算机,使修改后的计算机名生效。

该程序也可用于WINDOWS 9X操作系统在多播克隆时修改目标计算机名。但须在参考机的注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce下新建一个字符串键——SETCPN,键值为“C:\WINDOWS\SETCPN\setcpn.exe”,它的作用是当网络复制完成并重新启动后,系统自动运行setcpn.exe程序。上面假设setcpn.exe程序和netname.dat文件是存放在C:\WINDOWS\SETCPN目录下,如果不是在此目录下,上面的键值应作相应的修改。

该程序调用了NETBIOS的API函数,因此在参考机上一定要安装NETBEUI协议。由于是用VB编写的程序,因此参考机上要有VB的运行时刻库。如果将程序生成安装包,系统会自动加入运行库。

程序中有一段代码是对五笔字型输入法的处理。使用Sysprep处理过系统后,原来安装的输入法(非Windows系统自带的)会从输入法托盘中消失,但输入法程序本身并没有被删除,只需在注册表中修改相关键值即可使输入法重新出现在输入法托盘中。但各种输入法键值不同,需区别对待。本程序中的键值只是两种五笔字形输入法的。

WINDOWS XP可使用“登录使用欢迎屏幕”设置,并将默认登录用户名设为:administrator,登录密码为空,这样每次计算机启动时就不需要输入密码了。由于administrator权限过高,为避免使用者(如学生)乱改系统设置,可在系统中安装一套虚拟还原软件,每次开机自动还原即可。

WINDOWS XP下生成的安装包在WINDOWS 2000下有时不能安装,解决的办法是在WINDOWS 2000下重新生成一个安装包,用于WINDOWS 2000的安装。



附:程序清单

setcpn.vbp-setcomputername.bas



Option Explicit



'安全关机需调用的API函数

Public Const EWX_LOGOFF = 0 '以其它用户名重新登录系统

Public Const EWX_SHUTDOWN = 1 '终止所有进程并关闭计算机

Public Const EWX_REBOOT = 2 '关掉在进程安全描述表中运行的所有进程,重起计算机

Public Const EWX_FORCE = 4 '强迫进程终止

Public Const EWX_POWEROFF = 8 '在NT下终止所有进程并关闭计算机

Declare Function ExitWindowsEx Lib "user32" (ByVal fuOptions As Long, ByVal dwReserved As Long) As Integer '关闭系统函数



'NT下关机需调用的安全机制API函数

Public Const TOKEN_ADJUST_PRIVILEGES = &H20

Public Const TOKEN_QUERY = &H8

Public Const SE_PRIVILEGE_ENABLED = &H2

Public Const ANYSIZE_ARRAY = 1



Type LUID

lowpart As Long

highpart As Long

End Type



Type LUID_AND_ATTRIBUTES

pLuid As LUID

Attributes As Long

End Type



Type TOKEN_PRIVILEGES

PrivilegeCount As Long

Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES

End Type



Declare Function GetCurrentProcess Lib "kernel32" () As Long

Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long

Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long



'注册表相关操作API函数定义

Public Const HKEY_CLASSES_ROOT = &H80000000

Public Const HKEY_CURRENT_USER = &H80000001

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const HKEY_USERS = &H80000003

Public Const HKEY_PERFORMANCE_DATA = &H80000004

Public Const HKEY_CURRENT_CONFIG = &H80000005

Public Const HKEY_DYN_DATA = &H80000006



Public Const REG_MULTI_SZ = 7

Public Const ERROR_SUCCESS = 0&

Public Const READ_CONTROL = &H20000

Public Const REG_SZ = 1

Public Const REG_DWORD = 4

Public Const REG_EXPAND_SZ = 2

Public Const REG_BINARY = 3

Public Const REG_DWORD_BIG_ENDIAN = 5

Public Const REG_DWORD_LITTLE_ENDIAN = 4

Public Const REG_NONE = 0



Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _

(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long



Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _

(ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _

lpType As Long, lpData As Any, lpcbData As Long) As Long



Public Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" _

(ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, _

ByVal cbName As Long) As Long



Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _

(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long



Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _

(ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _

ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long



Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long



'获取操作系统版本

Public Declare Function GetVersion Lib "kernel32" () As Long



'获取网卡MAC地址、更改计算机名相关操作API函数定义

Public Const NCBASTAT As Long = &H33

Public Const NCBNAMSZ As Long = 16

Public Const HEAP_ZERO_MEMORY As Long = &H8

Public Const HEAP_GENERATE_EXCEPTIONS As Long = &H4

Public Const NCBRESET As Long = &H32



Public Type NET_CONTROL_BLOCK 'NCB

ncb_command As Byte

ncb_retcode As Byte

ncb_lsn As Byte

ncb_num As Byte

ncb_buffer As Long

ncb_length As Integer

ncb_callname As String * NCBNAMSZ

ncb_name As String * NCBNAMSZ

ncb_rto As Byte

ncb_sto As Byte

ncb_post As Long

ncb_lana_num As Byte

ncb_cmd_cplt As Byte

ncb_reserve(9) As Byte '保留,必须为0

ncb_event As Long

End Type



Public Type ADAPTER_STATUS

adapter_address(5) As Byte

rev_major As Byte

reserved0 As Byte

adapter_type As Byte

rev_minor As Byte

duration As Integer

frmr_recv As Integer

frmr_xmit As Integer

iframe_recv_err As Integer

xmit_aborts As Integer

xmit_success As Long

recv_success As Long

iframe_xmit_err As Integer

recv_buff_unavail As Integer

t1_timeouts As Integer

ti_timeouts As Integer

Reserved1 As Long

free_ncbs As Integer

max_cfg_ncbs As Integer

max_ncbs As Integer

xmit_buf_unavail As Integer

max_dgram_size As Integer

pending_sess As Integer

max_cfg_sess As Integer

max_sess As Integer

max_sess_pkt_size As Integer

name_count As Integer

End Type



Public Type NAME_BUFFER

name As String * NCBNAMSZ

name_num As Integer

name_flags As Integer

End Type



Public Type ASTAT

adapt As ADAPTER_STATUS

NameBuff(30) As NAME_BUFFER

End Type



Public Declare Function Netbios Lib "netapi32.dll" _

(pncb As NET_CONTROL_BLOCK) As Byte



Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _

(hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)



Public Declare Function GetProcessHeap Lib "kernel32" () As Long



Public Declare Function HeapAlloc Lib "kernel32" _

(ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long



Public Declare Function HeapFree Lib "kernel32" _

(ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long



Public Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" _

(ByVal lpComputerName As String) As Long



'NT下调用关机函数前需先调用的安全机制函数子过程

Public Sub AdjustToken()

Dim hdlProcessHandle As Long

Dim hdlTokenHandle As Long

Dim tmpLuid As LUID

Dim tkp As TOKEN_PRIVILEGES

Dim tkpNewButIgnored As TOKEN_PRIVILEGES

Dim lBufferNeeded As Long

hdlProcessHandle = GetCurrentProcess()

OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), _

hdlTokenHandle

LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid

tkp.PrivilegeCount = 1

tkp.Privileges(0).pLuid = tmpLuid

tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED

AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), _

tkpNewButIgnored, lBufferNeeded

End Sub



Public Function GetMACAddress() As String

'返回一个格式化的网络控制器的MAC地址

Dim tmp As String

Dim pASTAT As Long

Dim NCB As NET_CONTROL_BLOCK

Dim AST As ASTAT

'IBM NetBIOS 3.0在NCBRESET命令中定义了4个基本NetBIOS环境变量,

'Win32则用OS/2动态连接路由器(DLR)环境。这意味着应用程序使用

'的第一个NCB必须是一个NCBRESET命令,这里有一个例外是NCBENUM命令。

'Windows NT与IBM NetBIOS 3.0对NCB_CALLNAME字段的解释是不同的

NCB.ncb_command = NCBRESET

Call Netbios(NCB)

'为获取以太网卡的媒体访问控制(MAC)地址,使用Netbios()、NCBASTAT命令,

'并将NCB.ncb_CallName设置为"* "(16个字符)。

NCB.ncb_callname = "* "

NCB.ncb_command = NCBASTAT

'对于有多个网卡的机器,需要执行枚举LANA数目,并对每个网卡执行NCBASTAT命令

'即是机器中只有一个网卡,首先枚举有效的LANA数目,并在其中一个有效的LANA上执行

'NCBASTAT命令也是非常不错的。在程序中用硬编码的方式设置LANA数目为0是不可取的。

NCB.ncb_lana_num = 0

NCB.ncb_length = Len(AST)

pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS _

Or HEAP_ZERO_MEMORY, NCB.ncb_length)

If pASTAT = 0 Then

Debug.Print "内存分配失败!"

Exit Function

End If

NCB.ncb_buffer = pASTAT

Call Netbios(NCB)

CopyMemory AST, NCB.ncb_buffer, Len(AST)

tmp = ""

For i = 0 To 5

str1 = Hex$(AST.adapt.adapter_address(i))

If Len(str1) < 2 Then

tmp = tmp & "0" & str1

Else

tmp = tmp & str1

End If

Next

HeapFree GetProcessHeap(), 0, pASTAT

GetMACAddress = tmp

End Function

Tony
2004-09-24, 04:35 PM
'主程序

Sub Main()

Dim wjmc As String, address As String, SKeyVal As String, SKeyVal1 As Long, SS As String

Dim ComputerName As String, MacAddress As String

Dim lpName As String, Vname As String, S1 As String

Dim i As Integer, bj As Integer, Idx As Long, idx1 As Long

Dim wsversion As Long, hKey As Long, hKey1 As Long,

Dim lenData As Long, typeData As Long

Dim ret As Long, ret1 As Long, ret2 As Long, ret3 As Long

wjmc = App.Path + "\netname.dat"

If Dir(wjmc) = "" Then End

wsversion = GetVersion()

address = GetMACAddress() ’获取MAC地址

Open wjmc For Input As #1 ’打开MAC——计算机名映射表文件

Do While Not EOF(1) ' 循环至文件尾。

Input #1, ComputerName, MacAddress ' 将数据读入两个变量。

ComputerName = UCase(ComputerName)

MacAddress = UCase(MacAddress)

If address = MacAddress Then

i = SetComputerName(ComputerName) ’修改NetBIOS计算机名(Computername)

If i = 0 Then

MsgBox "设置计算机名失败!", vbOKOnly

End If

If (wsversion And &H80000000) = 0 Then

ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\ _

Tcpip\Parameters", hKey)

If ret = 0 Then

RegSetValueEx hKey, "NV Hostname", 0, REG_SZ, ByVal ComputerName, _

Len(ComputerName) + 1 ’修改DNS主机名(Hostname)

End If

RegCloseKey hKey

'下面这段程序用于检测是否安装过五笔字型FOR 2K或极品五笔,如果安装过,在输入法面板中恢复这两种输入法的显示。

ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\ _

Keyboard Layouts", hKey)

If ret = 0 Then

Idx = 0

lpName = String(9, Chr(0))

Do

ret1 = RegEnumKey(hKey, Idx, lpName, Len(lpName))

If ret1 = 0 Then

SS = UCase(Left(lpName, 8))

If SS = "E0100804" Or SS = "E0200804" Then

If SS = "E0100804" Then bj = 1 Else bj = 2

ret2 = RegOpenKey(HKEY_CURRENT_USER, "Keyboard Layout\Preload", hKey1)

If ret2 = 0 Then

idx1 = 1

Vname = idx1

Do

ret3 = RegQueryValueEx(hKey1, idx1, 0, typeData, _

ByVal vbNullString, lenData)

If ret3 = 0 Then

S1 = String(lenData, Chr(0))

ret3 = RegQueryValueEx(hKey1, Vname, 0, typeData, ByVal S1, lenData)

S1 = Left(S1, InStr(S1, Chr(0)) - 1)

If UCase(Trim(S1)) = "E0100804" Or UCase(Trim(S1)) = "E0200804" Then

Exit Do

End If

End If

idx1 = idx1 + 1

Vname = idx1

Loop Until ret3 <> 0

If ret3 <> 0 Then

Vname = idx1 - 1

If bj = 1 Then

RegSetValueEx hKey1, Vname, 0, REG_SZ, ByVal "E0100804", 9

Else

RegSetValueEx hKey1, Vname, 0, REG_SZ, ByVal "E0200804", 9

End If

Else

Exit Do

End If

End If

End If

End If

Idx = Idx + 1

Loop Until ret1 <> 0

End If

RegCloseKey hKey

ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\ _

CurrentVersion\Winlogon", hKey)

If ret = 0 Then

'下面键值的设置是:自动登录

SKeyVal = "1"

RegSetValueEx hKey,"AutoAdminLogon",0,REG_SZ,ByVal SKeyVal,Len(SKeyVal)+1

'下面键值的设置是:默认域名

SKeyVal = ComputerName

RegSetValueEx hKey,"DefaultDomainName",0,REG_SZ,ByVal SKeyVal,Len(SKeyVal)+1

'下面键值的设置是:默认用户名

SKeyVal = "administrator"

RegSetValueEx hKey,"DefaultUserName",0,REG_SZ,ByVal SKeyVal,Len(SKeyVal)+1

'下面键值的设置是:登录密码为空

SKeyVal = ""

RegSetValueEx hKey,"DefaultPassword",0,REG_SZ,ByVal SKeyVal,Len(SKeyVal)+1

'下面键值的设置是:登录使用欢迎屏幕(适用于Windows XP)

SKeyVal1 = &H1

RegSetValueEx hKey, "LogonType", 0, REG_DWORD, ByVal SKeyVal, 4

'下面键值的设置是:使用快速用户切换(适用于Windows XP)

SKeyVal1 = &H1

RegSetValueEx hKey, "AllowMultipleTSSessions", 0, REG_DWORD, ByVal SKeyVal, 4

End If

RegCloseKey hKey

End If

Exit Do

End If

Loop

Close #1

Kill wjmc

AdjustToken

ret = ExitWindowsEx(EWX_REBOOT Or EWX_FORCE, 0) '重新启动计算机

End Sub