浅谈基于 VHD 方式在中小型企业内部署 Windows 8的一些思路与方法(4)-1

投稿人:张笑寒

本篇接“浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(3)”(下面简称“思路3),主要对笔者一些想法进行探讨。

 

企业部署操作系统。大体场景有4项:(笔者思路1有介绍)

1.        按照生产力要求,批量进行系统升级
2.        按照生产力要求,批量进行单、双系统部署
3.        应部分同事要求安装新系统,用于体验新系统的魅力(或跟风体验新事物)
4.        系统出问题在找技术员工维护时,直接升级新系统

上三篇(四篇)文章,笔者着重介绍了场景2、场景3、场景4,即单机部署基于VHD文件启动Windows 8及批量部署基于VHD文件启动Windows 8的技术细节。本篇,笔者将对一些非正规IT管理的中小型企业内部署基于VHD文件启动Windows 8的想法进行探讨。

7 网络FTP服务配合批处理文件实现员工自行部署基于VHD文件启动的Windows 8

如部署基于VHD文件启动的Windows 8到企业环境,要不得不考虑一些问题:多台计算机的部署、部署技术人员的能力水平、服务器软硬件成本等。并且,笔者有个想法:在不考虑统一部署的情况、应用场景即上方所提“应部分同事要求安装新系统,用于体验新系统的魅力”,可否由这些公司内非IT专业人士、傻瓜化、自己给自己部署基于VHD文件启动的windows 8。经过一些验证,发现这个想法完全可行。

本质来说,在不使用AD,WDS等简单但有技术含量和维护人工成本稍高的情况下。部署基于VHD文件启动的Windows 8,需要做的事情为笔者在本系列1与2中介绍的技术。笔者在这里将要点归结为下列2项:

1.     员工客户端中拥有准备好的VHD文件
2.     确认启动分区并升级写入VHD启动信息

笔者接触过的中小企业中,很少有IT部门正规化管理。大多中小企业、尤其小规模非IT的企业,公司的IT管理真是一塌糊涂。很多IT员工和杂工无异。并且,这样的企业也无法吸引高水平的IT从业者。所以,笔者本篇想法主要针对该类型企业,实现由公司内(非)IT专业人士、傻瓜化、自己给自己部署基于VHD启动的windows 8。

为了达到该要求,制作时必须考虑较全、简单、提示少、自动化高的程序或批处理文件。修改难度较低。

7.1 使用批处理文件下载FTP服务器内的VHD文件

首先,要实现员工自己DIY部署基于VHD文件启动的windows8,必须让员工通过各种方法获到制作好的VHD文件。这里笔者采取的方法为,制作好VHD文件存放到FTP服务器。通过批处理文件自动下载。

7.1.1 FTP服务器环境

由于VHD文件较大,下载VHD文件时要考虑到一个问题。即员工客户端计算机那个分区拥有足够的空间。这一步可以让员工自己选择。

笔者公司的FTP服务器选用的是FileZillaServer。IP地址为192.168.1.2。ftp用户名为win8。密码为123456。该FTP服务器不面向公网。权限配置如下:
 

由于vhd文件较大。笔者计算机通过wifi连接公司网络带宽较小。故测试期间,笔者以较小的VHDtools.rar作为下载文件。


可以看到使用构成的URL连接下载无问题

7.1.2 FTP服务器内文件下载批处理文件

首先。来看用户输入选择批处理内容:

1. @echo off
2. :ftp
3. cls
4. echo 请打开计算机,确认要下载Win8的分区可用空间大于16G。
5. set vhdstore=
6. set /p vhdstore=请输入要下载到那个盘(如C盘请输入C。):
7. echo 您输入的字符串是:%vhdstore%,
8. set /p chkvhdstore=如果输入错误请按N,确认输入没错请按y,:
9. if "%chkvhdstore%"=="n" goto ftp
10. if "%chkvhdstore%"=="N" goto ftp
11. 
12. echo 恭喜你输入正确!后续内容一会在补充
13. pause

 

以上批处理获取用户输入盘符,并将其设置为变量vhdstore。考虑到处理文件的易用性。在批处理中增加了输入错误修正的判断及跳转。结果如下:

 
1.     为了显示效果,去掉了cls


获取用户下载盘符后,就可以下载VHD文件了。笔者假设下载VHD文件(以下VHDtools.rar文件为例)到分区J新建立的“Windows 8 VHD”目录。来看下批处理内容:

1. @echo off
2. mkdir "j:\Windows 8 VHD"
3. cd "j:\Windows 8 VHD"
4. echo open 192.168.1.2> ftptemp.txt
5. echo win8>> ftptemp.txt
6. echo 123456>> ftptemp.txt
7. echo lcd "j:\Windows 8 VHD">> ftptemp.txt
8. echo get VHDtools.rar>> ftptemp.txt
9. echo bye>> ftptemp.txt
10. echo 下载Win8时间较长,大概需要30分的时间。
11. ftp -s:ftptemp.txt 1>nul
12. echo 下载完毕。现在可以关机进入Win8
13. del ftptemp.txt
14. pause
15. exit


笔者不想让员工看到下载过程,故将下载过程中正确运行的回显去掉

 
1.     批处理运行前的J盘、批处理内容

 
2.     批处理运行后,可以看到在分区J多出笔者批处理创建的目录及下载文件


最后,笔者将以上2段批处理结合。演示下选择盘符及下载效果(下边的批处理将按照这个结合方式处理)。需要注意的是,修改下载文件批处理的盘符为第一段获取的盘符。

 
1.     继续以分区J为例,首先删掉测试时生成的目录。修改下载批处理内容

 
2.     批处理开始运行

 
3.     运行结果。至此。FTP下载文件完毕

7.2 确认启动分区并升级写入VHD启动信息

要能启动基于VHD文件启动的Windows 8。需要满足下列要求:

1.        配置升级启动文件,确保启动文件有驱动支持VHD
2.        正确配置BCD文件,确保bootmgr可以正确引导VHD内的系统启动

写批处理文件时,还要考虑到员工客户端的操作系统。不同的操作系统,引导不一致。这点可以参考笔者“浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(2)”。本文不再叙述。

制作批处理文件处理引导信息,需注意引导类型。现中小企业内员工操作系统以Windows XP居多,公司计算机分区有一般3到4个。笔者以此为例,谈下引导的修改。

首先,笔者简单总结下NT5.2启动的过程

1.     开机MBR引导启动分区NTLDR
2.     Ntldr读取boot.Ini
3.     OS启动

基于VHD文件启动的windows8的启动过程

1.     开机MBR引导启动分区bootmgr(必须使用NT6.0引导信息)
2.     Bootmgr读取BCD信息获取启动项(bootmgr要支持Windows 8)
3.     OS启动

Windows 7的启动与基于VHD文件启动的windows8的启动过程一致。不过Windows7的bootmgr不支持Windows 8。故做Windows 7下员工自主安装基于VHD文件启动windows8。重要的步骤是升级bootmgr。还有部分计算机启动文件存放于隐藏分区的处理。

通过对比,不难发现。使用Windows XP的员工要实现DIY安装基于VHD文件启动的windows8,必须使用批处理完成下列3项内容:

1.     升级启动盘的引导信息到NT60
2.     复制bootmgr等启动文件
3.     配置BCD启动项,添加Windows XP与基于VHD文件启动的windows8的启动项

7.2.1 NT5.2环境内获取启动分区盘符、使用批处理配置启动项

批量启动文件存放于启动分区,故需获取启动分区盘符。笔者的方法较笨。是利用启动盘内必有的启动文件作为条件来获取盘符。内容如下:

1. @echo off
2. set _pf=_pf
3. dir /a a:\ntldr 1>nul 2>nul && set _pf=a
4. dir /a b:\ntldr 1>nul 2>nul && set _pf=b
5. dir /a c:\ntldr 1>nul 2>nul && set _pf=c
6. dir /a d:\ntldr 1>nul 2>nul && set _pf=d
7. dir /a e:\ntldr 1>nul 2>nul && set _pf=e
8. dir /a f:\ntldr 1>nul 2>nul && set _pf=f
9. dir /a g:\ntldr 1>nul 2>nul && set _pf=g
10. dir /a h:\ntldr 1>nul 2>nul && set _pf=h
11. dir /a i:\ntldr 1>nul 2>nul && set _pf=i
12. dir /a j:\ntldr 1>nul 2>nul && set _pf=i
13. dir /a k:\ntldr 1>nul 2>nul && set _pf=i
14. dir /a l:\ntldr 1>nul 2>nul && set _pf=i
15. dir /a m:\ntldr 1>nul 2>nul && set _pf=i
16. dir /a n:\ntldr 1>nul 2>nul && set _pf=i
17. 
18. If %_pf%==_pf goto assign
19. If not %_pf%==_pf goto updatent60
20. 
21. :assign
22. echo 获取失败。演示完毕
23. pause
24. goto exit
25. 
26. :updatent60
27. echo 成功获取盘符%_pf%,演示完毕
28. pause
29. 
30. :exit
31. exit

演示效果

 
1.     笔者的计算机装有XP。分配盘符为A。

 
2.     可以看到成功获取启动文件所在分区盘符A

 
3.     修改获取启动文件名字,模拟失败情况

 
4.     获取失败

笔者所在公司的计算机通常有3到4个盘符。如必要,可将分区A到Z全部查询一次

7.2.2 NT5.2环境内使用批处理配置启动项

获取启动分区盘符后,就可以针对启动分区内的启动文件进行升级与配置了。详细步骤有3:

1.     下载拷贝NT60启动文件
2.     升级MBR引导信息为NT60
3.     编辑BCD启动项

对于以上问题,解决相对容易:

1.     NT60启动文件较多。可压缩为一个压缩包,然后解压到7.2.1中获取的启动盘
2.     使用bootsect.exe。直接改写MBR引导信息
3.     调用7.1获取到VHD的存放盘与7.2.1获取的NT5启动盘盘符,写入VHD启动项与ntldr启动信息。

VHD用到工具及Bootmgr等启动文件Windows XP无自带。用户需提前准备。可存放于ftp并批处理下载。FTP批处理下载参考7.1。

首先,笔者将Vhd工具存放到vhdtoolsx86目录中,使用7z将BCD等启动文件及vhdtoolsx86目录进行打包。包名为bcd.7z。然后下载7z程序与bcd.7z。将其解压到临时文件夹。

批处理文件内容如下(假设启动盘是J,实际使用配合7.2.1变量):

1. @echo off
2. echo open 192.168.1.2> ftptemp1.txt
3. echo win8>> ftptemp1.txt
4. echo 123456>> ftptemp1.txt
5. echo lcd %temp%>> ftptemp1.txt
6. echo get 7za.exe>> ftptemp1.txt
7. echo get bcd.7z>> ftptemp1.txt
8. echo bye>> ftptemp1.txt
9. echo 下载工具中。
10. ftp -s:ftptemp1.txt 1>nul
11. echo 下载完毕。开始准备释放文件到启动盘
12. del ftptemp1.txt
13. %temp%\7za.exe x %temp%\bcd.7z -y -oj:\ 1>nul 2>nul
14. del /q %temp%\7za.exe 1>nul 2>nul
15. del /q %temp%\bcd.7z 1>nul 2>nul
16. echo 释放完成
17. pause
18. exit

 

演示效果:

 
1.     模拟释放到分区J

 
2.     可以看到笔者以成功将内容释放到分区J

接着,笔者在批处理内写入升级NT60引导信息及写入VHD启动信息。这次笔者使用虚拟机,虚拟机网卡桥接接入公司网络进行演示。

环境:
OS:Windows XP
IP:192.168.100.44
Boot letter:C
VHD store:D:\win8ent.Vhd

批处理文件内容如下:

1. @echo off
2. c:\vhdtoolsx86\bootsect.exe /nt60 all /mbr
3. 
4. FOR /F "tokens=3 delims= " %%i in ('c:\vhdtoolsx86\bcdedit.exe /create /d "Windows 8" /application osloader') do set _win8id=%%i
5. echo %_win8id%
6. 
7. c:\vhdtoolsx86\bcdedit.exe /set %_win8id% device vhd=[D:]\win8ent.vhd
8. c:\vhdtoolsx86\bcdedit.exe /set %_win8id% osdevice vhd=[D:]\win8ent.vhd
9. c:\vhdtoolsx86\bcdedit.exe /set %_win8id% path \Windows\system32\winload.exe
10. c:\vhdtoolsx86\bcdedit.exe /set %_win8id% systemroot \windows
11. c:\vhdtoolsx86\bcdedit.exe /set %_win8id% locale zh-cn
12. c:\vhdtoolsx86\bcdedit.exe /displayorder %_win8id% /addlast
13. 
14. c:\vhdtoolsx86\bcdedit.exe /create {ntldr} /d "Windows XP pro"
15. c:\vhdtoolsx86\bcdedit.exe /set {ntldr} device partition=C:
16. c:\vhdtoolsx86\bcdedit.exe /set {ntldr} path \ntldr
17. c:\vhdtoolsx86\bcdedit.exe /displayorder {ntldr} /addlast
18. 
19. c:\vhdtoolsx86\bcdedit.exe /set {bootmgr} default %_win8id%
20. c:\vhdtoolsx86\bcdedit.exe /timeout 30
21. echo 成功完成
22. pause

 

以上内容从上到下依次为:升级引导、获取创建启动项GUID、写入基于VHD文件启动的Windows 8的引导信息、写入引导ntldr启动器启动信息、设置Windows 8为默认启动系统、显示操作系统列表时间30秒

执行效果

 
1.     运行前的检查。可看到新添加的BCD信息为笔者在思路2中制作的BCD文件信息

 
2.     这次没有设置回显隐藏,可以看到命令成功执行

 
3.     使用bcdedit工具打开BCD文件。可以看到已成功添加笔者要求添加的启动信息

7.3 卸载基于VHD文件启动Windows 8的方法

通过以上介绍,员工DIY部署基于VHD文件启动的Windows 8,主要改动有以下3点:

1.     升级引导信息
2.     修改BCD信息加入基于VHD文件启动Windows 8与Windows XP的启动信息
3.     下载VHD文件到本机

要实现自动卸载功能,需对以上3点进行逆向处理。其中,第一点是不需要处理的。原因在于NT6.0引导信息可以启动Windows XP。考虑到员工可能再次安装Windows 8。建议还是修改引导信息为NT5.2,并删除所有下载的启动文件。

在删除启动文件时,会有权限问题。可以先夺权,然后删除。Windows XP中没有笔者熟悉的takeown与icacls命令。故笔者从Windows server 2003中提取这2个工具。并将其上传到FTP。在卸载系统时通过批处理下载到员工计算机夺权删除引导文件。最后,在删除启动文件前,不可以修改BCD。修改会致BCD等文件被系统使用不能删除。

总结下,卸载基于VHD文件启动的Windwos 8,需要完成以下3点:

1.     降级引导信息到NT5.2
2.     夺取NT6.0启动文件权限
3.     删除NT6.0启动文件与VHD启动文件

要点1里,需要用到bootsect.exe,要点2中需用到takeown与icacls。如有可能,可要求系统卸载前重启,然后运行卸载批处理文件。

7.3.1 批处理效果演示

笔者假设VHD文件存放于分区E,名字为win8.vhd。批处理内容:

1. @echo off
2. echo open 192.168.1.2> %temp%\delvhdwin8.txt
3. echo win8>> %temp%\delvhdwin8.txt
4. echo 123456>> %temp%\delvhdwin8.txt
5. echo lcd %temp%>> %temp%\delvhdwin8.txt
6. echo get icacls.exe>> %temp%\delvhdwin8.txt
7. echo get takeown.exe>> %temp%\delvhdwin8.txt
8. echo get bootsect.exe>> %temp%\delvhdwin8.txt
9. echo bye>> %temp%\delvhdwin8.txt
10. echo 下载工具中。
11. ftp -s:%temp%\delvhdwin8.txt 1>nul
12. del /q %temp%\delvhdwin8.txt
13. echo 工具下载完毕。开始删除Windows 8作业
14. 
15. %temp%\bootsect.exe /nt52 all /mbr && echo 降级引导信息成功
16. 
17. dir /a a:\bootmgr && set _pf=a
18. dir /a b:\bootmgr && set _pf=b
19. dir /a c:\bootmgr && set _pf=c
20. dir /a d:\bootmgr && set _pf=d
21. dir /a e:\bootmgr && set _pf=e
22. dir /a f:\bootmgr && set _pf=f
23. dir /a g:\bootmgr && set _pf=g
24. dir /a h:\bootmgr && set _pf=h
25. dir /a i:\bootmgr && set _pf=i
26. %temp%\takeown.exe /F %_pf%:\bootmgr /A
27. %temp%\takeown.exe /F %_pf%:\boot /R /A
28. %temp%\takeown.exe /F %_pf%:\BOOTNXT /A
29. %temp%\takeown.exe /F %_pf%:\BOOTSECT.BAK /A
30. %temp%\icacls.exe %_pf%:\bootmgr /grant Administrators:F
31. %temp%\icacls.exe %_pf%:\boot /grant Administrators:F /T
32. %temp%\icacls.exe %_pf%:\BOOTNXT /grant Administrators:F
33. %temp%\icacls.exe %_pf%:\BOOTSECT.BAK /grant Administrators:F
34. echo 权限获取成功
35. 
36. del %_pf%:\bootmgr /a /f /q
37. del %_pf%:\BOOTNXT /a /f /q
38. del %_pf%:\BOOTSECT.BAK /a /f /q
39. rd %_pf%:\boot /s /q
40. echo 启动文件删除成功
41. 
42. del e:\win8.vhd /a /q /f && Windows8文件删除
43. 
44. del /q %temp%\icacls.exe
45. del /q %temp%\takeown.exe
46. del /q %temp%\bootsect.exe
47. 
48. echo 零时工具删除完毕,演示结束
49. 

 

环境如下:
OS:Windows XP
OS:Windows 7(模拟Windows 8)
NIC:桥接入公司网络

 
1.     可以看到,虚机启动时有2个OS。一个Windows XP,一个Windows 7。其中Windows 7用来模拟基于VHD文件启动的Windows 8的启动项

 
2.     进入Windows XP后的环境。

 
3.     批处理文件运行后。可以看到分区C的NT6.0启动文件与分区E的VHD文件被删除

 
4.     系统重新启动,可以看到正常进入NT5.2的引导。至此。卸载演示完毕

7.4批处理的组合&效果演示

7.4.1 批处理的组合

考虑到批处理的合理性、员工的少操作性,笔者对批处理文件组合采取了以下顺序:

1.     员工选择系统,来确认启动文件的部署方式与卸载方式
2.     员工选择安装或卸载操作
3.     员工选择分区,用于存放VHD。并记录VHD存放分区信息
4.     批处理自动下载工具,升级引导与启动文件。并进行BCD文件修改
5.     批处理自动下载VHD文件。

考虑到文件的复杂性,以及将要介绍的基于Windows 7的批处理安装与卸载。笔者将批处理文件分为多个部分。使用call来调用。这次截图由于笔者疏忽,将会补配录制视频进行演示。

首先,笔者用到的批处理文件如下:

1.      index.bat           员工DIY安装文件。提供员工选择及调用相关批处理
2.      xpchangiu.bat       被调用的批处理,提供选择安装或卸载基于VHD文件启动的windows 8功能
3.      XPinstll.bat         被调用的批处理,提供自动安装NT5.2环境下、基于VHD文件启动的windows 8
4.      XPuninstall.bat      被调用的批处理,提供卸载NT5.2环境下、基于VHD文件启动的windows 8

其中,2、3、4这3个批处理文件笔者放于公司FTP服务器

笔者演示的环境:
服务器
OS:Windows Server 2003
Role:FTP Server
IP:192.168.1.2
Ftpuser:win8
ftp password :123456

客户机
OS:Windows XP
IP:192.168.100.128

批处理内容:

1.     index.bat

 

1. @echo off
2. echo 本软件用来安装Windows8,退出请关闭本窗口
3. pause
4. :changeos
5. cls
6. echo 请选择您的操作系统
7. echo #####################################################
8. echo Windows XP请按1
9. echo Windows 7请按2
10. echo Windows XP与Windows 7双系统请按3
11. echo Windows XP与Windows XP请按1
12. echo Windows 7与Windows 7请按2
13. echo #####################################################
14. 
15. set cos=
16. set /p cos=请输入对应数字选择您的操作系统:
17. echo 您的输入的是:%cos%,
18. set /p chkcos=如果输入错误请按N,确认输入没错请按y,:
19. if "%chkcos%"=="n" goto changeos
20. if "%chkcos%"=="N" goto changeos
21. if "%chkcos%"=="y" goto next1
22. if "%chkcos%"=="Y" goto next1
23. echo 您输入有误,将返回重新输入
24. pause
25. goto changeos
26. 
27. :next1
28. if "%cos%"=="1" goto xp
29. if "%cos%"=="2" goto win7
30. if "%cos%"=="3" goto xp7
31. echo 您输入有误,将返回重新输入
32. pause
33. goto changeos
34. 
35. :xp
36. echo open 192.168.1.2> %temp%\vhdwin8xp.txt
37. echo win8>> %temp%\vhdwin8xp.txt
38. echo 123456>> %temp%\vhdwin8xp.txt
39. echo lcd %temp%>> %temp%\vhdwin8xp.txt
40. echo get xpchangiu.bat>> %temp%\vhdwin8xp.txt
41. echo bye>> %temp%\vhdwin8xp.txt
42. ftp -s:%temp%\vhdwin8xp.txt 1>nul
43. del /q %temp%\vhdwin8xp.txt
44. call %temp%\xpchangiu.bat
45. del /q %temp%\xpchangiu.bat
46. exit
47. 
48. :win7
49. echo open 192.168.1.2> %temp%\vhdwin8win7.txt
50. echo win8>> %temp%\vhdwin8win7.txt
51. echo 123456>> %temp%\vhdwin8win7.txt
52. echo lcd %temp%>> %temp%\vhdwin8win7.txt
53. echo get win7changiu.bat>> %temp%\vhdwin8win7.txt
54. echo bye>> %temp%\vhdwin8win7.txt
55. ftp -s:%temp%\vhdwin8win7.txt 1>nul
56. del /q %temp%\vhdwin8win7.txt
57. call %temp%\win7changiu.bat
58. del /q %temp%\win7changiu.bat
59. exit
60. 
61. :xp7
62. echo open 192.168.1.2> %temp%\vhdwin8xp7.txt
63. echo win8>> %temp%\vhdwin8xp7.txt
64. echo 123456>> %temp%\vhdwin8xp7.txt
65. echo lcd %temp%>> %temp%\vhdwin8xp7.txt
66. echo get xp7changiu.bat>> %temp%\vhdwin8xp7.txt
67. echo bye>> %temp%\vhdwin8xp7.txt
68. ftp -s:%temp%\vhdwin8xp7.txt 1>nul
69. del /q %temp%\vhdwin8xp7.txt
70. call %temp%\xp7changiu.bat
71. del /q %temp%\xp7changiu.bat
72. exit
73.