mardi 28 juillet 2009

Ajouter une Legacy Adapter NIC sous Hyper-V avec Powershell WMI

Le but de ce post est d'ajouter une carte réseau virtuelle à une machine virtuelle existante sous Hyper-V sans utiliser de cmd-let supplémentaire ni la suite SCVMM.
La meilleure méthode est alors d'utiliser WMI piloté par PowerShell. Il faut procéder enplusieurs étapes :
  1. Rechercher le switch virtuel sur lequel va se connecter la future carte
  2. Instancier le provider WMI de management des switch virtuel et créer un nouveau port réseau virtuel sur ce nouveau switch
  3. 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é)
  4. Modifier les paramètres de la copie
  5. Rechercher la machine virtuelle cible
  6. Instancier le porvider WMI de management des systèmes virtuels
  7. 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 :-)