Virtualbox虚拟机自动初始化脚本
本帖最后由 bookaccount 于 2018-7-27 09:18 编辑缘起
在公司电脑上装了Virtualbox,安装win 7的虚拟机,因为公司电脑在bios里把Vt-x给禁用了,所以装不了64位,只能装32位,好的32位镜像文件找不到,也懒得找,就下载了微软官方提供的镜像,缺点是只能用90天(加上rearm总共能用约140天),要么第一次启动前给虚拟机做个快照,然后90天后恢复一下,要么90天后删掉重新安装。因为虚拟机里没装什么软件,主要是利用虚拟机里的文件,杀软不查毒这个特点,在虚拟机里上传一些文件,所以90天的限制也还能对付。不过,每次安装后,总要手工禁用某些不必要的windows服务等,虽然是90天才需要做一次,时间长了,也觉得有些麻烦,于是想写个自动初始化的脚本,自动完成恢复快照和某些windows设置等工作。需求并不复杂,但是竟花了不少时间才做出来,下面是程序和说明。
1.restoreVm.bat
这是个dos批处理文件,下面把里面的命令说明一下
"C:\Program Files\Oracle\VirtualBox\vboxmanage" snapshot "win7" restore "before1stBoot"vboxmanage.exe是virtualbox提供的工具,win7是我的虚拟机的名字, before1stBoot是我做的虚拟机快照的名字,这行命令的作用很简单,就是恢复快照
"C:\Program Files\Oracle\VirtualBox\vboxmanage" sharedfolder add "win7" --name "vmsetup" --hostpath "C:\vmsetup" --automount 在虚拟机中设定和主机共享的文件夹名字,以及主机中对应的文件夹名字,并设定启动时自动加载
"C:\Program Files\Oracle\VirtualBox\vboxmanage" modifyvm win7 --clipboard bidirectionalVirtualbox 5.X版本缺省设置不允许和主机共享剪贴板,改过来
"C:\Program Files\Oracle\VirtualBox\vboxmanage" modifyvm win7 --natsettings1 1500,1024,1024,1024,1024 因为我主要在虚拟机中上传文件,以前4.x版本时不改这个设置,上传超慢,5.x版本不知道改过来没有。不管他,改掉再说
"C:\Program Files\Oracle\VirtualBox\vboxmanage" startvm "win7" 启动虚拟机
pause这里要暂停一下,因为Virtualbox不会等到windows登陆进去才认为启动成功,桌面还没显示出来就认为启动成功了,如果这里不暂停,就会继续执行下面的语句,就会出错。当然,这里也可以用延时命令实现“全自动”操作,问题是到底要延时多长时间,难以确定,所以想了想,决定还是“半自动”操作算了,等到桌面完全出来之后,按任意键执行下面的语句
"C:\Program Files\Oracle\VirtualBox\vboxmanage" guestcontrol win7 --username IEUser --password Passw0rd! mkdir c:\temp在虚拟机上建个临时目录,IEUser 和 Passw0rd! 是虚拟机缺省的用户名和密码
"C:\Program Files\Oracle\VirtualBox\vboxmanage" guestcontrol win7 --username IEUser --password Passw0rd! start "c:\\windows\\system32\\cmd.exe" -- /c xcopy e:\vmInit.* c:\temp
"C:\Program Files\Oracle\VirtualBox\vboxmanage" guestcontrol win7 --username IEUser --password Passw0rd! start "c:\\windows\\system32\\cmd.exe" -- /c xcopy e:\chineseregion.xml c:\temp
"C:\Program Files\Oracle\VirtualBox\vboxmanage" guestcontrol win7 --username IEUser --password Passw0rd! start "c:\\windows\\system32\\cmd.exe" -- /c xcopy e:\sudo.cmd c:\temp
pause
这几行命令是将主机上的几个文件拷到虚拟机上,其中vmInit.bat和vmInit.ps1是两个初始化文件,内容后面介绍,chineseregion.xml是更改区域要用的文件,sudo.cmd是实现以管理员身份运行的程序,也在后面介绍。
"C:\Program Files\Oracle\VirtualBox\vboxmanage" guestcontrol win7 --username IEUser --password Passw0rd! start c:\windows\system32\cmd.exe -- /c c:\temp\sudo cmd /k c:\temp\vminit.bat
pause
执行批处理文件,实现各种windows设置
"C:\Program Files\Oracle\VirtualBox\vboxmanage" guestcontrol win7 --username IEUser --password Passw0rd! start "c:\\windows\\system32\\cmd.exe" -- /c xcopy e:\apps\*.* c:\temp
pause
将其他会用到的程序拷到虚拟机
"C:\Program Files\Oracle\VirtualBox\vboxmanage" guestcontrol win7 --username IEUser --password Passw0rd! start c:\windows\system32\cmd.exe -- /c c:\temp\sudo cmd /k powershell -command Restart-Computer 重新启动虚拟机
2.vmInit.bat
这个批处理文件由上面的restoreVm.bat拷贝到虚拟机后再执行,完成部分windows配置。
powershell -command Set-ExecutionPolicy Unrestricted; Stop-Service -Name "wuauserv"分号前的一句的作用是允许powershell执行ps1文件,后面一句是停止windows更新服务,不然这个服务一启动,就会开始下载windows更新,大大降低运行速度,但虚拟机不需要什么windows更新,所以先停掉,再做别的事
powershell -file c:\temp\vmInit.ps1 执行拷到虚拟机的ps1文件,完成另外一部份windows配置
control.exe intl.cpl,, /f:"c:\temp\chineseregion.xml" 下载的虚拟机镜像是英文版的,用这个命令切换到中文区域,注意,intl.cpl,,后面必须要有一个空格,开始没加空格,总是调不通。这句试图用powershell实现,怎么也调不通,只好放弃,放到批处理中执行。
rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:"C:\Windows\Resources\Ease of Access Themes\classic.theme"不喜欢缺省的aero风格,切换到传统风格,这句也不知道怎么用powershell实现
slmgr /ato 激活虚拟机上的windows的命令
3. chineseregion.xml
上面用到的chineseregion.xml文件内容如下:
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!--User List-->
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/>
</gs:UserList>
<!-- 设置为简体中文 -->
<gs:SystemLocale Name="zh-CN" />
</gs:GlobalizationServices>
4.vmInit.ps1
这个powershell脚本文件完成另外一部份windows配置
$tb = Get-Item -Path "HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system"
If($tb.GetValue("EnableLUA") -eq $null) {
New-ItemProperty -Path HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system -Name EnableLUA -PropertyType DWord -Value 0 -Force
} else {
Set-ItemProperty -Path "HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system" -Name "EnableLUA" -Value 0
}
这几句的目的是禁用UAC(用户帐户控制)这个恶心的功能
$key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced'
Set-ItemProperty $key Hidden 1
Set-ItemProperty $key HideFileExt 0
Set-ItemProperty $key ShowSuperHidden 1
Stop-Process -processname explorer
这几句的目的是修改文件管理器的显示设置:显示隐藏文件,不隐藏已知类型文件的扩展名,显示操作系统文件
$key1 = "HKLM:\System\CurrentControlSet\Services\WSearch"
Set-ItemProperty -Path $key1 -Name Start -Value 0x00000004
$key2 = "HKLM:\System\CurrentControlSet\Services\vmickvpexchange"
Set-ItemProperty -Path $key2 -Name Start -Value 0x00000004
$key3 = "HKLM:\System\CurrentControlSet\Services\vmicshutdown"
Set-ItemProperty -Path $key3 -Name Start -Value 0x00000004
$key4 = "HKLM:\System\CurrentControlSet\Services\vmicheartbeat"
Set-ItemProperty -Path $key4 -Name Start -Value 0x00000004
$key5 = "HKLM:\System\CurrentControlSet\Services\vmictimesync"
Set-ItemProperty -Path $key5 -Name Start -Value 0x00000004
$key6 = "HKLM:\System\CurrentControlSet\Services\vmicvss"
Set-ItemProperty -Path $key6 -Name Start -Value 0x00000004
$key7 = "HKLM:\System\CurrentControlSet\Services\WinDefend"
Set-ItemProperty -Path $key7 -Name Start -Value 0x00000004
$key8 = "HKLM:\System\CurrentControlSet\Services\wuauserv"
Set-ItemProperty -Path $key8 -Name Start -Value 0x00000004
$key9 = "HKLM:\System\CurrentControlSet\Services\MpsSvc"
Set-ItemProperty -Path $key9 -Name Start -Value 0x00000004
这几句禁用了一些不必要的windows服务,如windows防火墙等,以提高虚拟机的运行速度
5. sudo.cmd
这个文件是为了以管理员身份运行命令,上面的restoreVm.bat里要用到
@echo off
set str=%*
set str=%str:\"="%
set str=%str:"=""%
这几句是为了将命令行参数里的双引号替换为两个双引号,并将\"替换成"",否则下面生成vbscript脚本后,执行会出错
@echo Set objShell = CreateObject("Shell.Application") > %temp%\sudo.tmp.vbs
@echo args = Right("%str%", (Len("%str%") - Len("%1"))) >> %temp%\sudo.tmp.vbs
@echo objShell.ShellExecute "%1", args, "", "runas" >> %temp%\sudo.tmp.vbs
@cscript %temp%\sudo.tmp.vbs
利用vbscript,实现以管理员身份执行命令,具体使用可见上面的restoreVm.bat
使用时,在主机上开个cmd窗口,运行restoreVm.bat,将其他辅助脚本文件拷到虚拟机上依次执行,只需要按按回车键(或其他任意键),再用鼠标点几下(主要是确认“用户帐户控制”跳出来的提示)即可,基本实现“半自动”配置。
虽然功能很简单,这么几条语句也写了好几天,查了很多资料才调通,多少对powershell,dos批处理,以及vbscript增加了一点了解。虽然大家可能不一定会用到微软的windows镜像,但这些用命令行方式操作虚拟机的脚本,或许也有一点参考价值,故不揣浅陋,贴在这里。
讲解的的很详细,感谢您的分享,吾爱因你更精彩! 为什么不激活系统了?
感谢楼主,学习了 yu7084339 发表于 2018-7-27 09:21
为什么不激活系统了?
批处理里那句slmgr /ato就是激活windows系统的命令,激活后可用90天 膜拜大佬 楼主这个好资料,学习下,初步理解下,好像是回贴后才会有评分权。话说楼主,有人说virtualbox收集用户数据,你怎么看? dina-sam 发表于 2018-7-27 09:30
楼主这个好资料,学习下,初步理解下,好像是回贴后才会有评分权。话说楼主,有人说virtualbox收集用户数据 ...
virtualbox收集用户数据,不知道这回事。 感谢搂住,受教了 感谢搂住,受教了
页:
[1]
2