
- -| 这种奇怪的需求……。
我们要解决两个问题:
在宿主上控制VM虚拟机
在虚拟机上运行修改MAC地址的应用
问题1你需要使用VM的命令行,也就是VMRun。这里列举你需要用到的命令。
【以下资料来自网络】
vmrun -T ws -gu USERNAME -gp PASSWORD copyFileFromHostToGuest "C:\VMs\VM1\VM1.vmx" "C:\sourcebatch.bat" "C:\destbatch.bat"
将宿主的c:\sourcebatch.bat拷贝到虚拟机并放置于虚拟机的c:\位置,改名为destbatch.bat
vmrun -T ws -gu USERNAME -gp PASSWORD runProgramInGuest "C:\VMs\VM1\VM1.vmx" cmd.exe "/c C:\destbatch.bat"
在虚拟机中运行c:\destbatch.bat
vmrun -T ws -gu USERNAME -gp PASSWORD deleteFileInGuest "C:\VMs\VM1\VM1.vmx" "C:\destbatch.bat"
删除虚拟机的c:\destbatch.bat
其中,USERNAME代表你的虚拟机的登陆账号;PASSWORD是虚拟机的登录账号对应的密码;“C:\\VMs\\VM1\VM1.vmx表示你的虚拟机在宿主机上的镜像文件;”C:\sourcebatch.bat"是宿主机上要传送至虚拟机的文件;"c:\destbatch.bat“是文件传送(宿主到虚拟机)的目标文件;cmd.exe "/c c:\destbatch.bat"是一整句,表示要求虚拟机运行的指令。
关于vmrun,请参考vmware的说明文档。
问题2,我们没有必要自己用c#写一个修改网卡mac的应用,因为有现成的命令行工具MacShift(请自行下载)。
【以下资料来自网络】
命令行:macshift.exe 00112233445566 -i "无线网卡名字"
上面的 macshift.exe 就是主程序,00112233445566 是您想改到的 MAC 地址,-i 是开关选项。
"无线网卡名字" 可以是系统自己默认的,也可以是您自己改/选的, 比如您把某个无线网卡在控制面板里面的名字改成 "Ulgsm4UWifi", 那么就键入 "Ulgsm4UWifi" (要保留引号)。
结果就是这样:
macshift.exe 00112233445566 -i "Ulgsm4UWifi"
OK,结合上述两项,我们开始做你需要的东西。
确保宿主机有一个与虚拟机之间的共享目录(假设是c:\vmshare;确保虚拟机有.NET环境;确保你有虚拟机的管理员账户和密码(假设是USERNAME和PASSWORD)。
下载macshift.exe小工具,放在宿主的c:\vmshare下
写你的C#应用。在代码中使用System.Diagnostics.Process类执行vmrun指令(复制c:\vmshare\macshift.exe文件到虚拟机、命令虚拟机执行其本地的c:\macshift.exe -......(参数)。
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = @"C:\Program Files\VMware\VMware Workstation\vmrun.exe";
process.StartInfo.Arguments = " -T ws -gu USERNAME -gp PASSWORD copyFileFromHostToGuest \"c:\\VMs\\VM1\\VM1.vmx\" \"C:\\vmshare\\macshift.exe\" \"C:\\macshift.exe\"";
process.Start();
依法炮制,再命令虚拟机带参执行拷贝过去的macshift.exe。
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = @"C:\Program Files\VMware\VMware Workstation\vmrun.exe";
process.StartInfo.Arguments = " -T ws -gu USERNAME -gp PASSWORD runProgramInGuest \"C:\\VMs\\VM1\\VM1.vmx\" c:\\macshift.exe 00112233445566 -i \"本地网络\"";
process.Start();
结束!
厉害啊!非常感谢你的详细回答!
估计不会有比你更专业的回答了!
我先去实践一下,然后尽快反馈你。
谢谢~