Make a clone of VirtualBox Machine that doesn't cause Windows Re-Activation after installing Windows
Most guides for installing Windows on VirtualBox to act as a template for quick Windows jobs tell you to take a few steps to prepare the Virtual Machine before installing Windows (the best guide I found: grahamrhay.wordpress.com; another fairly good guide: www.windowstablettv.com). Unfortunately, I didn't read these guides before installing and activating Windows on the VM I wanted to use as a template.
I want to know how to clone my already-active VM in such a way that would not require re-activation from Windows.
Looking in the template VM Definition file (the VBOX or XML file for the VM), the /VirtualBox/Machine/Hardware
(XPath ID) node has no uuid
attribute. But, if I try to use VBoxManage modifyvm <uuid|name> --hardwareuuid <uuid>
to set a new UUID for the template VM, then the template VM loses its activation status! (Thankfully, I had made a backup of the template.) So, to accomplish my aim, I can't just follow those guides pretending that I haven't installed Windows yet.
Thankfully, I noticed something about all of my Virtual Machines that I hadn't prepared as those guides had outlined.
I ran VBoxManage showvminfo <uuid|name>
and noticed that the UUID
valued matched the Hardware UUID
value, leading me to surmise that if any VM Definition didn't have a uuid
attribute in the /VirtualBox/Machine/Hardware
node, then the VM would use the "Machine UUID" value as the "Hardware UUID" value. So, for my template VM, it did have a "Hardware UUID" that I could use; I just had to find how to transfer it to any clones I would make.
To ensure that the UUID transfers, you can take one of two approaches:
- You can edit the template VM Definition file directly. The "Hardware UUID" will only transfer to clones if the
/VirtualBox/Machine/Hardware
has theuuid
attribute. So, copy the/VirtualBox/Machine
uuid
attribute and add it to the/VirtualBox/Machine/Hardware
uuid
attribute. You probably want to re-initialize the VirtualBox machine database after this, by closing/killing any VirtualBox process you're running. (VBoxSVC sometimes lingers on Windows; you may have to kill it from the Task Manager.) - You can clone your template and make a new template VM, and then use
VBoxManage modifyvm <uuid|name> --hardwareuuid <uuid>
to set the new template's "Hardware UUID" to the original template's "Machine UUID"/"Hardware UUID". I say you have to clone the VM to create a new template VM because if you try to set the "Hardware UUID" with this command on the original template, it won't add theuuid
attribute to the/VirtualBox/Machine/Hardware
node, since it can still imply it from the "Machine UUID", and thus won't copy this value to any clone it makes.
This powershell script does the work:
- clone the machine that is already activated.
- close virtualbox precesses from task manager.
- run this script, modifing the variables to your values.
Remember that the virtual machines names are case sensitive.
$ORIGVirtualMachineName="BaseDevWin7"
$clonedVirtualMachineName="DevWin7a"
$vboxDir="c:\Program Files\Oracle\VirtualBox"
cd $vboxDir
$uid=$($($(.\VBoxManage.exe showvminfo $ORIGVirtualMachineName|select-string "Hardware UUID:").ToString()).Split())[4]
.\VBoxManage modifyvm $clonedVirtualMachineName --hardwareuuid $uid