Save to My DOJO
Table of contents
- Requirements for Device Naming for Network Adapters in Hyper-V 2016
- What is Device Naming for Hyper-V Virtual Network Adapters?
- Setting Hyper-V’s Network Device Name in PowerShell
- Setting Hyper-V’s Network Device Name in the GUI
- Viewing Hyper-V’s Network Device Name in the Guest GUI
- Viewing Hyper-V’s Network Device Name in the Guest with PowerShell
- Viewing Hyper-V’s Network Device Name in the Guest with Regedit
Not all of the features introduced with Hyper-V 2016 made a splash. One of the less-published improvements allows you to determine a virtual network adapter‘s name from within the guest operating system. I don’t even see it in any official documentation, so I don’t know what to officially call it. The related settings use the term “device naming”, so we’ll call it that. Let’s see how to put it to use.
Requirements for Device Naming for Network Adapters in Hyper-V 2016
For this feature to work, you need:
- 2016-level hypervisor: Hyper-V Server, Windows Server, Windows 10
- Generation 2 virtual machine
- Virtual machine with a configuration version of at least 6.2
- Windows Server 2016 or Windows 10 guest
What is Device Naming for Hyper-V Virtual Network Adapters?
You may already be familiar with a technology called “Consistent Device Naming”. If you were hoping to use that with your virtual machines, sorry! The device naming feature utilized by Hyper-V is not the same thing. Basically, if you were expecting to see something different in the Network and Sharing Center, it won’t happen:
In contrast, a physical system employing Consistent Device Naming would automatically name the network adapters in some fashion that reflects their physical installation. For example, “SLOT 4 Port 1” would be the name of the first port of a multi-port adapter installed in the fourth PCIe slot. It may not always be easy to determine how the manufacturers numbered their slots and ports, but it helps more than “Ethernet 5”.
Anyway, you don’t get that out of Hyper-V’s device naming feature. Instead, it shows up as an advanced feature. You can see that in several ways. First, I’ll show you how to set the value.
Setting Hyper-V’s Network Device Name in PowerShell
From the management operating system or a remote PowerShell session opened to the management operating system, use Set-VMNetworkAdapter:
Set-VMNetworkAdapter -VMName sv16g2 -DeviceNaming On
This enables device naming for all of the virtual adapters connected to the virtual machine named sv16g2.
If you try to enable it for a generation 1 virtual machine, you get a clear error (although sometimes it inexplicably complains about the DVD drive, but eventually it gets where it’s going):
PS C:> Set-VMNetworkAdapter -VMName sv16g1 -DeviceNaming On Set-VMNetworkAdapter : The device naming setting only applies to synthetic network adapters on Generation 2 virtual machines with configuration version 6.2 or above. At line:1 char:1 + Set-VMNetworkAdapter -VMName sv16g1 -DeviceNaming On + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Set-VMNetworkAdapter], VirtualizationException + FullyQualifiedErrorId : InvalidParameter,Microsoft.HyperV.PowerShell.Commands.SetVMNetworkAdapter Set-VMNetworkAdapter : Failed to modify device 'Synthetic Ethernet Port'. The device naming setting only applies to synthetic network adapters on Generation 2 virtual machines with configuration version 6.2 or above. (Virtual machine ID 354207DC-9419-4398-9F49-C1A12E86BEEA) 'sv16g1' failed to modify device 'Synthetic Ethernet Port'. (Virtual machine ID 354207DC-9419-4398-9F49-C1A12E86BEEA) The device naming setting only applies to synthetic network adapters on Generation 2 virtual machines with configuration version 6.2 or above. (Virtual machine ID 354207DC-9419-4398-9F49-C1A12E86BEEA) At line:1 char:1 + Set-VMNetworkAdapter -VMName sv16g1 -DeviceNaming On + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Set-VMNetworkAdapter], VirtualizationException + FullyQualifiedErrorId : OperationFailed,Microsoft.HyperV.PowerShell.Commands.SetVMNetworkAdapter
The cmdlet doesn’t know if the guest operating system supports this feature (or even if the virtual machine has an installed operating system).
If you don’t want the default “Virtual Network Adapter” name, then you can set the name at the same time that you enable the feature:
Set-VMNetworkAdapter -VMName sv16g2 -DeviceNaming On -Passthru | Rename-VMNetworkAdapter -NewName 'ThatAdapter'
These cmdlets all accept pipeline information as well as a number of other parameters. You can review the TechNet article that I linked in the beginning of this section. I also have some other usage examples on our omnibus networking article.
Reminder: PowerShell is the only way to set the name of a Hyper-V virtual network adapter.
Note: You must reboot the guest operating system for it to reflect the change.
Setting Hyper-V’s Network Device Name in the GUI
You can use Hyper-V Manager or Failover Cluster Manager to enable this feature. Just look at the bottom of the Advanced Features sub-tab of the network adapter’s tab. Check the Enable device naming box. If that box does not appear, you are viewing a generation 1 virtual machine.
Reminder: PowerShell is the only way to set the name of a Hyper-V virtual network adapter. See the preceding section for instructions.
Note: You must reboot the guest operating system for it to reflect the change.
Viewing Hyper-V’s Network Device Name in the Guest GUI
This will only work in Windows 10/Windows Server 2016 (GUI) guests. The screenshots in this section were taken from a system that still had the default name of Network Adapter.
- Start in the Network Connections window. Right-click on the adapter and choose Properties:
- When the Ethernet # Properties dialog appears, click Configure:
- On the Microsoft Hyper-V Network Adapter Properties dialog, switch to the Advanced tab. You’re looking for the Hyper-V Network Adapter Name property. The Value holds the name that Hyper-V holds for the adapter:
If the Value field is empty, then the feature is not enabled for that adapter or you have not rebooted since enabling it. If the Hyper-V Network Adapter Name property does not exist, then you are using a down-level guest operating system or a generation 1 VM.
Viewing Hyper-V’s Network Device Name in the Guest with PowerShell
As you saw in the preceding section, this field appears with the adapter’s advanced settings. Therefore, you can view it with the Get-NetAdapterAdvancedProperty cmdlet. To see all of the settings for all adapters, use that cmdlet by itself.
Tab completion doesn’t work for the names, so drilling down just to that item can be a bit of a chore. The long way:
Get-NetAdapterAdvancedProperty -Name 'Hyper-V Network Adapter Name'
Slightly shorter way:
Get-NetAdapterAdvancedProperty -RegistryKeyword 'HyperVNetworkAdapterName'
One of many not future-proofed-but-works-today way:
Get-NetAdapterAdvancedProperty -RegistryKeyword '*HyperV*'
For automation purposes, you need to query the DisplayValue or the RegistryValue property. I prefer the DisplayValue. It is represented as a standard System.String. The RegistryValue is represented as a System.Array of System.String (or, String[]). It will never contain more than one entry, so dealing with the array is just an extra annoyance.
To pull that field, you could use select (an alias for Select-Object), but I wouldn’t:
I don’t like select in automation because it creates a custom object. Once you have that object, you then need to take an extra step to extract the value of that custom object. The reason that you used select in the first place was to extract the value. select basically causes you to do double work.
So, instead, I recommend the more .Net way of using a dot selector:
(Get-NetAdapterAdvancedProperty -RegistryKeyword 'HyperVNetworkAdapterName').DisplayValue
You can store the output of that line directly into a variable that will be created as a System.String type that you can immediately use anywhere that will accept a String:
$HyperVAdapterDeviceName = (Get-NetAdapterAdvancedProperty -Name Ethernet -RegistryKeyword 'HyperVNetworkAdapterName').DisplayValue
Notice that I injected the Name property with a value of Ethernet. I didn’t need to do that. I did it to ensure that I only get a single response. Of course, it would fail if the VM didn’t have an adapter named Ethernet. I’m just trying to give you some ideas for your own automation tasks.
Viewing Hyper-V’s Network Device Name in the Guest with Regedit
All of the network adapters’ configurations live in the registry. It’s not exactly easy to find, though. Navigate to HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass{4d36e972-e325-11ce-bfc1-08002be10318}. Not sure if it’s a good thing or a bad thing, but I can identify that key on sight now. Expand that out, and you’ll find several subkeys with four-digit names. They’ll start at 0000 and count upward. One of them corresponds to the virtual network adapter. The one that you’re looking for will have a KVP named HyperVNetworkAdapterName. Its value will be what you came to see. If you want further confirmation, there will also be KVP named DriverDesc with a value of Microsoft Hyper-V Network Adapter (and possibly a number, if it’s not the first).
Not a DOJO Member yet?
Join thousands of other IT pros and receive a weekly roundup email with the latest content & updates!