La meilleure méthode est alors d'utiliser WMI piloté par PowerShell. Il faut procéder enplusieurs étapes :
- Rechercher le switch virtuel sur lequel va se connecter la future carte
- Instancier le provider WMI de management des switch virtuel et créer un nouveau port réseau virtuel sur ce nouveau switch
- Copier le modèle de périphérique virtuel par défaut pour la carte réseau virtuelle non synthétique (installé par défaut quand Hyper-V est installé)
- Modifier les paramètres de la copie
- Rechercher la machine virtuelle cible
- Instancier le porvider WMI de management des systèmes virtuels
- Ajouter la carte réseau copiée, sur le nouveau port à la machine virtuelle
Le nombre d'étapes est assez important et démontre la complexité de l'interface WMI d'Hyper-V :-(
La function suivante PowerShell effectue toutes ces opération d'un seul coup :
#=================================================
# Functions
#=================================================
# Function AddLegacyNIC
# Add a Legacy Adapter Card to an existing VM
#-------------------------------------------------
function AddLegacyNIC {
param ([string]$VirtualMachine, [string]$VirtualNetworkName, [string]$Description = "NEW Legacy Network Adapter")
#Récupération de la VM
$VM = Get-WmiObject -NameSpace root/Virtualization -Query "select * from Msvm_ComputerSystem where ElementName = '$VirtualMachine'"
#Creation d'un port sur le switch virtuel avec un nom sous forme de GUID
$VS = Get-WmiObject -NameSpace root/Virtualization -Query "select * from Msvm_VirtualSwitch where ElementName = '$VirtualNetworkName'"
$VSMS = Get-WmiObject -NameSpace root/Virtualization -Class Msvm_VirtualSwitchManagementService
$NewPortName = [GUID]::NewGuid().ToString()
$NewVSPort = $VSMS.CreateSwitchPort($VS, $NewPortName , $NewPortName , "")
#Copie de la carte Legacy Ethernet Adapter par defaut Hyper-V
$LegacyNIC = Get-WmiObject -NameSpace root/Virtualization -class Msvm_EmulatedEthernetPortSettingData Where-Object {$_.InstanceID -like "*Default*"}
$NewLegacyNIC = $LegacyNIC.psbase.Clone()
$NewLegacyNIC.Connection = $NewVSPort.CreatedSwitchPort
$NewLegacyNIC.ElementName = $Description
#Ajout de la Carte à la VM
$VMMS = Get-WmiObject -NameSpace root/Virtualization -Class Msvm_VirtualSystemManagementService
$VMMS.AddVirtualSystemResources($VM.__PATH, $NewLegacyNIC.psbase.gettext(1))
}
#=================================================
# Script body
#=================================================
AddLegacyNIC "NomDeLaVM" "VLAN Principal"
Voila :-)