Hyper-V How To: Reset VM MAC address range using a script

A friend has shared a script for resetting MAC address ranges on the NIC in your VMs if you are getting conflicts:

Option Explicit

Dim strComputer, objWMIService, IPConfig, IPConfigSet, i, currentIP, arrayIP, lastOcet, lastOcetHex
Dim colItems, objItem, new_MaximumMacAddress, new_MinimumMacAddress
Dim WshShell

strComputer = "."
'new_MaximumMacAddress = "00155DE0"
'new_MinimumMacAddress = "00155DE0"

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set IPConfigSet = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
For Each IPConfig in IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
'WScript.Echo IPConfig.IPAddress(i)
If Left (IPConfig.IPAddress(i), 3) <> "169" And InStr (1, IPConfig.IPAddress(i), ".", 1) > 0 Then
currentIP = IPConfig.IPAddress(i)
Exit For
End If
Next
End If
Next

arrayIP = Split (currentIP, ".")
lastOcet = arrayIP (UBound (arrayIP))
lastOcetHex = Hex (CInt(lastOcet))

new_MaximumMacAddress = "00155DE0" & CStr (lastOcetHex) & "FF"
new_MinimumMacAddress = "00155DE0" & CStr (lastOcetHex) & "00"

WScript.StdOut.Write vbCrLf & vbCrLf
WScript.StdOut.Write "IP Address = [" & currentIP & "]" & vbCrLf
WScript.StdOut.Write "Last Ocet = [" & lastOcet & "]" & vbCrLf
WScript.StdOut.Write "Last Ocet (Hex) = [" & lastOcetHex & "]" & vbCrLf
WScript.StdOut.Write vbCrLf & vbCrLf

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\virtualization")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemManagementServiceSettingData",,48)
For Each objItem in colItems
'Wscript.Echo "-----------------------------------"
'Wscript.Echo "Msvm_VirtualSystemManagementServiceSettingData instance"
'Wscript.Echo "-----------------------------------"
WScript.StdOut.Write "Current Hyper-V Global MAC Address Range to:" & vbCrLf
WScript.StdOut.Write "MaximumMacAddress: " & objItem.MaximumMacAddress & vbCrLf
WScript.StdOut.Write "MinimumMacAddress: " & objItem.MinimumMacAddress & vbCrLf
Next

WScript.StdOut.Write vbCrLf & vbCrLf
WScript.StdOut.Write "Changing Hyper-V Global MAC Address Range to:" & vbCrLf
WScript.StdOut.Write "MaximumMacAddress: " & new_MaximumMacAddress & vbCrLf
WScript.StdOut.Write "MinimumMacAddress: " & new_MinimumMacAddress & vbCrLf
WScript.StdOut.Write vbCrLf & vbCrLf

Set WshShell = Wscript.CreateObject("Wscript.Shell")
'shell.ShellExecute "%SYSTEMROOT%\System32\reg.exe query ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization"""

WshShell.Run "reg add ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization"" /v MaximumMacAddress /d " & new_MaximumMacAddress & " /t REG_BINARY /f"
WshShell.Run "reg add ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization"" /v MinimumMacAddress /d " & new_MinimumMacAddress & " /t REG_BINARY /f"

WScript.StdOut.WriteLine "To apply changes machine needs to be rebooted. Do you want to reboot now? [Y/N] "
If UCase (CStr (WScript.StdIn.Read (1))) = "Y" Then
WshShell.Run "shutdown /r /t 0"
Else
WScript.StdOut.Write vbCrLf & "Do not forget to reboot your machine!!!" & vbCrLf
End If

For more info on how to use PS cmdlets see: https://www.microsoft.com/technet/scriptcenter/topics/msh/cmdlets/index.mspx

See also James O’Neil’s New and improved PowerShell Library for Hyper-V. Now with more functions and... documentation!

For all 35 sample Hyper-V PS1 scripts in a zipfile, go to: Hyper-V PowerShell Example Scripts.zip-download