吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5166|回复: 10
收起左侧

[其他原创] Virtualbox虚拟机自动初始化脚本

  [复制链接]
bookaccount 发表于 2018-7-27 09:02
本帖最后由 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 bidirectional  Virtualbox 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镜像,但这些用命令行方式操作虚拟机的脚本,或许也有一点参考价值,故不揣浅陋,贴在这里。



免费评分

参与人数 4吾爱币 +6 热心值 +4 收起 理由
admh + 1 + 1 谢谢@Thanks!
/bq + 1 + 1 谢谢@Thanks!
dina-sam + 1 + 1 谢谢@Thanks!
wushaominkk + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wushaominkk 发表于 2018-7-27 09:15
讲解的的很详细,感谢您的分享,吾爱因你更精彩!
yu7084339 发表于 2018-7-27 09:21
wuyy 发表于 2018-7-27 09:23
 楼主| bookaccount 发表于 2018-7-27 09:23
yu7084339 发表于 2018-7-27 09:21
为什么不激活系统了?

批处理里那句slmgr /ato就是激活windows系统的命令,激活后可用90天
Jerry_bean 发表于 2018-7-27 09:26
膜拜大佬
dina-sam 发表于 2018-7-27 09:30
楼主这个好资料,学习下,初步理解下,好像是回贴后才会有评分权。话说楼主,有人说virtualbox收集用户数据,你怎么看?
 楼主| bookaccount 发表于 2018-7-27 09:42
dina-sam 发表于 2018-7-27 09:30
楼主这个好资料,学习下,初步理解下,好像是回贴后才会有评分权。话说楼主,有人说virtualbox收集用户数据 ...

virtualbox收集用户数据,不知道这回事。
甜煮淡 发表于 2018-7-27 09:55
感谢搂住,受教了
流星的孤单 发表于 2018-7-27 10:34
感谢搂住,受教了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 00:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表