Finding VMs with Duplicate MAC Addresses

At one of my customers' sites today, I saw an error message that I've not seen before: VM MAC Conflict.  "Well, that's certainly not good," I thought, as I poked around at the error message.  To my chagrin, I could only find that error message for a single VM in the environment, and that error message wouldn't tell me with which other VM it was conflicting.  So, I could only think of one way to figure out what was going on with this conflict: look at the MAC Address assigned to every NIC on every VM in the environment, and figure out what was causing the conflict.  Easy!

No, really, it was easy.  Had I done it by hand, I would certainly have driven myself crazy, but PowerCLI made it nice and easy.  I just used this command:

(get-vm | get-networkadapter | ? {$_.MacAddress -eq "<offending MAC Address>").parent

Lo-and-behold, it returned 2 VMs.  One was the known VM that had flagged the error and the other was a powered-off VM.  Maybe that's why it wasn't also flagging the error, but regardless, we easily identified the source of the problem and were able to resolve it.

P.S. if you ever need to find all duplicate MAC addresses in an environment, you can use these commands:

$allNICs = get-vm | get-networkAdapter
$dupeMACs = (compare-object $allNICs.macAddress ($allNICs.macAddress | select -unique)).inputObject

foreach ($thisMAC in $dupeMACs){
   "="*17 + "`n$thisMAC`n" + "="*17
   ($allNICs | ? {$_.macAddress -eq $thisMAC}).parent.name
}

Comments

  1. Thank you Jason. it is really helpful for me.

    ReplyDelete
  2. Jason,
    is there any powercli command to find duplicate IPs for vm's or edges in vcenter.

    thanks

    ReplyDelete
    Replies
    1. I would do something this:
      $allVMs = get-vm
      $conflicts = $allVMs.guest.ipaddress | group-object | ? {$_.count -gt 1}
      foreach ($ip in $conflicts.name){
      echo $ip
      $allVMs | ? {$_.guest.ipaddress -contains $ip}
      }

      If you want to get fancy, you could create an object with IP Address and VM properties, and then record the address and list of VMs into their respective properties, then return that object into an array and convert the array into a csv... or you can just scroll down your window and look at which systems are using which address.

      Delete

Post a Comment

Sorry guys, I've been getting a lot of spam recently, so I've had to turn on comment moderation. I'll do my best to moderate them swiftly after they're submitted,

Popular posts from this blog

Clone a Standard vSwitch from one ESXi Host to Another

PowerShell Sorting by Multiple Columns

Deleting Orphaned (AKA Zombie) VMDK Files