本帖最后由 lblneva 于 2013-3-23 20:18 编辑
浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(4)-1
By lblneva
本篇接“浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(3)”(下面简称“思路3),主要对笔者一些想法进行探讨。
本系列以往文章地址:
浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(1):https://bbs.pcbeta.com/viewthread-1294200-1-1.html 浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(2):https://bbs.pcbeta.com/viewthread-1295081-1-1.html 浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(3)-1:https://bbs.pcbeta.com/viewthread-1296693-1-1.html 浅谈基于VHD方式在中小型企业内部署Windows8的一些思路与方法(3)-2:https://bbs.pcbeta.com/viewthread-1296699-1-1.html
企业部署操作系统。大体场景有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服务器内文件下载批处理文件
首先。来看用户输入选择批处理内容:
- @echo off
- :ftp
- cls
- echo 请打开计算机,确认要下载Win8的分区可用空间大于16G。
- set vhdstore=
- set /p vhdstore=请输入要下载到那个盘(如C盘请输入C。):
- echo 您输入的字符串是:%vhdstore%,
- set /p chkvhdstore=如果输入错误请按N,确认输入没错请按y,:
- if "%chkvhdstore%"=="n" goto ftp
- if "%chkvhdstore%"=="N" goto ftp
- echo 恭喜你输入正确!后续内容一会在补充
- pause
复制代码
以上批处理获取用户输入盘符,并将其设置为变量vhdstore。考虑到处理文件的易用性。在批处理中增加了输入错误修正的判断及跳转。结果如下:
1. 为了显示效果,去掉了cls
获取用户下载盘符后,就可以下载VHD文件了。笔者假设下载VHD文件(以下VHDtools.rar文件为例)到分区J新建立的“Windows 8 VHD”目录。来看下批处理内容:
- @echo off
- mkdir "j:\Windows 8 VHD"
- cd "j:\Windows 8 VHD"
- echo open 192.168.1.2> ftptemp.txt
- echo win8>> ftptemp.txt
- echo 123456>> ftptemp.txt
- echo lcd "j:\Windows 8 VHD">> ftptemp.txt
- echo get VHDtools.rar>> ftptemp.txt
- echo bye>> ftptemp.txt
- echo 下载Win8时间较长,大概需要30分的时间。
- ftp -s:ftptemp.txt 1>nul
- echo 下载完毕。现在可以关机进入Win8
- del ftptemp.txt
- pause
- 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环境内获取启动分区盘符、使用批处理配置启动项
批量启动文件存放于启动分区,故需获取启动分区盘符。笔者的方法较笨。是利用启动盘内必有的启动文件作为条件来获取盘符。内容如下:
- @echo off
- set _pf=_pf
- dir /a a:\ntldr 1>nul 2>nul && set _pf=a
- dir /a b:\ntldr 1>nul 2>nul && set _pf=b
- dir /a c:\ntldr 1>nul 2>nul && set _pf=c
- dir /a d:\ntldr 1>nul 2>nul && set _pf=d
- dir /a e:\ntldr 1>nul 2>nul && set _pf=e
- dir /a f:\ntldr 1>nul 2>nul && set _pf=f
- dir /a g:\ntldr 1>nul 2>nul && set _pf=g
- dir /a h:\ntldr 1>nul 2>nul && set _pf=h
- dir /a i:\ntldr 1>nul 2>nul && set _pf=i
- dir /a j:\ntldr 1>nul 2>nul && set _pf=i
- dir /a k:\ntldr 1>nul 2>nul && set _pf=i
- dir /a l:\ntldr 1>nul 2>nul && set _pf=i
- dir /a m:\ntldr 1>nul 2>nul && set _pf=i
- dir /a n:\ntldr 1>nul 2>nul && set _pf=i
- If %_pf%==_pf goto assign
- If not %_pf%==_pf goto updatent60
- :assign
- echo 获取失败。演示完毕
- pause
- goto exit
- :updatent60
- echo 成功获取盘符%_pf%,演示完毕
- pause
- :exit
- 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变量):
- @echo off
- echo open 192.168.1.2> ftptemp1.txt
- echo win8>> ftptemp1.txt
- echo 123456>> ftptemp1.txt
- echo lcd %temp%>> ftptemp1.txt
- echo get 7za.exe>> ftptemp1.txt
- echo get bcd.7z>> ftptemp1.txt
- echo bye>> ftptemp1.txt
- echo 下载工具中。
- ftp -s:ftptemp1.txt 1>nul
- echo 下载完毕。开始准备释放文件到启动盘
- del ftptemp1.txt
- %temp%\7za.exe x %temp%\bcd.7z -y -oj:\ 1>nul 2>nul
- del /q %temp%\7za.exe 1>nul 2>nul
- del /q %temp%\bcd.7z 1>nul 2>nul
- echo 释放完成
- pause
- exit
复制代码
演示效果:
1. 模拟释放到分区J
2. 可以看到笔者以成功将内容释放到分区J
接着,笔者在批处理内写入升级NT60引导信息及写入VHD启动信息。这次笔者使用虚拟机,虚拟机网卡桥接接入公司网络进行演示。
环境:
OS:Windows XP
IP:192.168.100.44
Boot letter:C
VHD store:D:\win8ent.Vhd
批处理文件内容如下:
- @echo off
- c:\vhdtoolsx86\bootsect.exe /nt60 all /mbr
- FOR /F "tokens=3 delims= " %%i in ('c:\vhdtoolsx86\bcdedit.exe /create /d "Windows 8" /application osloader') do set _win8id=%%i
- echo %_win8id%
- c:\vhdtoolsx86\bcdedit.exe /set %_win8id% device vhd=[D:]\win8ent.vhd
- c:\vhdtoolsx86\bcdedit.exe /set %_win8id% osdevice vhd=[D:]\win8ent.vhd
- c:\vhdtoolsx86\bcdedit.exe /set %_win8id% path \Windows\system32\winload.exe
- c:\vhdtoolsx86\bcdedit.exe /set %_win8id% systemroot \windows
- c:\vhdtoolsx86\bcdedit.exe /set %_win8id% locale zh-cn
- c:\vhdtoolsx86\bcdedit.exe /displayorder %_win8id% /addlast
- c:\vhdtoolsx86\bcdedit.exe /create {ntldr} /d "Windows XP pro"
- c:\vhdtoolsx86\bcdedit.exe /set {ntldr} device partition=C:
- c:\vhdtoolsx86\bcdedit.exe /set {ntldr} path \ntldr
- c:\vhdtoolsx86\bcdedit.exe /displayorder {ntldr} /addlast
- c:\vhdtoolsx86\bcdedit.exe /set {bootmgr} default %_win8id%
- c:\vhdtoolsx86\bcdedit.exe /timeout 30
- echo 成功完成
- 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。批处理内容:
- @echo off
- echo open 192.168.1.2> %temp%\delvhdwin8.txt
- echo win8>> %temp%\delvhdwin8.txt
- echo 123456>> %temp%\delvhdwin8.txt
- echo lcd %temp%>> %temp%\delvhdwin8.txt
- echo get icacls.exe>> %temp%\delvhdwin8.txt
- echo get takeown.exe>> %temp%\delvhdwin8.txt
- echo get bootsect.exe>> %temp%\delvhdwin8.txt
- echo bye>> %temp%\delvhdwin8.txt
- echo 下载工具中。
- ftp -s:%temp%\delvhdwin8.txt 1>nul
- del /q %temp%\delvhdwin8.txt
- echo 工具下载完毕。开始删除Windows 8作业
- %temp%\bootsect.exe /nt52 all /mbr && echo 降级引导信息成功
- dir /a a:\bootmgr && set _pf=a
- dir /a b:\bootmgr && set _pf=b
- dir /a c:\bootmgr && set _pf=c
- dir /a d:\bootmgr && set _pf=d
- dir /a e:\bootmgr && set _pf=e
- dir /a f:\bootmgr && set _pf=f
- dir /a g:\bootmgr && set _pf=g
- dir /a h:\bootmgr && set _pf=h
- dir /a i:\bootmgr && set _pf=i
- %temp%\takeown.exe /F %_pf%:\bootmgr /A
- %temp%\takeown.exe /F %_pf%:\boot /R /A
- %temp%\takeown.exe /F %_pf%:\BOOTNXT /A
- %temp%\takeown.exe /F %_pf%:\BOOTSECT.BAK /A
- %temp%\icacls.exe %_pf%:\bootmgr /grant Administrators:F
- %temp%\icacls.exe %_pf%:\boot /grant Administrators:F /T
- %temp%\icacls.exe %_pf%:\BOOTNXT /grant Administrators:F
- %temp%\icacls.exe %_pf%:\BOOTSECT.BAK /grant Administrators:F
- echo 权限获取成功
- del %_pf%:\bootmgr /a /f /q
- del %_pf%:\BOOTNXT /a /f /q
- del %_pf%:\BOOTSECT.BAK /a /f /q
- rd %_pf%:\boot /s /q
- echo 启动文件删除成功
- del e:\win8.vhd /a /q /f && Windows8文件删除
- del /q %temp%\icacls.exe
- del /q %temp%\takeown.exe
- del /q %temp%\bootsect.exe
- echo 零时工具删除完毕,演示结束
-
复制代码
环境如下:
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
- @echo off
- echo 本软件用来安装Windows8,退出请关闭本窗口
- pause
- :changeos
- cls
- echo 请选择您的操作系统
- echo #####################################################
- echo Windows XP请按1
- echo Windows 7请按2
- echo Windows XP与Windows 7双系统请按3
- echo Windows XP与Windows XP请按1
- echo Windows 7与Windows 7请按2
- echo #####################################################
- set cos=
- set /p cos=请输入对应数字选择您的操作系统:
- echo 您的输入的是:%cos%,
- set /p chkcos=如果输入错误请按N,确认输入没错请按y,:
- if "%chkcos%"=="n" goto changeos
- if "%chkcos%"=="N" goto changeos
- if "%chkcos%"=="y" goto next1
- if "%chkcos%"=="Y" goto next1
- echo 您输入有误,将返回重新输入
- pause
- goto changeos
- :next1
- if "%cos%"=="1" goto xp
- if "%cos%"=="2" goto win7
- if "%cos%"=="3" goto xp7
- echo 您输入有误,将返回重新输入
- pause
- goto changeos
- :xp
- echo open 192.168.1.2> %temp%\vhdwin8xp.txt
- echo win8>> %temp%\vhdwin8xp.txt
- echo 123456>> %temp%\vhdwin8xp.txt
- echo lcd %temp%>> %temp%\vhdwin8xp.txt
- echo get xpchangiu.bat>> %temp%\vhdwin8xp.txt
- echo bye>> %temp%\vhdwin8xp.txt
- ftp -s:%temp%\vhdwin8xp.txt 1>nul
- del /q %temp%\vhdwin8xp.txt
- call %temp%\xpchangiu.bat
- del /q %temp%\xpchangiu.bat
- exit
- :win7
- echo open 192.168.1.2> %temp%\vhdwin8win7.txt
- echo win8>> %temp%\vhdwin8win7.txt
- echo 123456>> %temp%\vhdwin8win7.txt
- echo lcd %temp%>> %temp%\vhdwin8win7.txt
- echo get win7changiu.bat>> %temp%\vhdwin8win7.txt
- echo bye>> %temp%\vhdwin8win7.txt
- ftp -s:%temp%\vhdwin8win7.txt 1>nul
- del /q %temp%\vhdwin8win7.txt
- call %temp%\win7changiu.bat
- del /q %temp%\win7changiu.bat
- exit
- :xp7
- echo open 192.168.1.2> %temp%\vhdwin8xp7.txt
- echo win8>> %temp%\vhdwin8xp7.txt
- echo 123456>> %temp%\vhdwin8xp7.txt
- echo lcd %temp%>> %temp%\vhdwin8xp7.txt
- echo get xp7changiu.bat>> %temp%\vhdwin8xp7.txt
- echo bye>> %temp%\vhdwin8xp7.txt
- ftp -s:%temp%\vhdwin8xp7.txt 1>nul
- del /q %temp%\vhdwin8xp7.txt
- call %temp%\xp7changiu.bat
- del /q %temp%\xp7changiu.bat
- exit
-
复制代码 字数限制,剩余内容请见4-2 |