17/11/2024

Hyper-VPowerShell

Hyper-V 2016 et PowerShell Direct

I. Présentation

La nouvelle version d'Hyper-V apparue en même temps que Windows Server 2016 est accompagnée d'une fonctionnalité appelée "PowerShell Direct", celle-ci permet d'exécuter une commande sur une machine virtuelle en faisant abstraction de la couche réseau et des paramètres de gestion à distance.

Pour PowerShell Direct, il y a deux modes de connexion :

  • Session interactive

Il est possible d'ouvrir une session PowerShell à distance sur une VM par l'intermédiaire d'une session interactive via "Enter-PSSession" (ou New-PSSession pour créer une session et l'utiliser ensuite). Ce mode de fonctionnement implique qu'ensuite on se retrouve avec une console connectée sur la VM, ce qui n'est pas utile si l'on souhaite seulement exécuter une commande.

C'est le mode déjà présent pour se connecter sur un serveur distant via PowerShell, sauf que dans le cadre de PowerShell Direct et de l'accès aux VMs, on utilisera des paramètres spécifiques.

  • Exécuter un script ou une commande directe

Si vous souhaitez seulement effectuer une action sans rentrer dans une session interactive, il faudra passer directement par le commandlet "Invoke-Command", avec là aussi des paramètres spécifiques. Ceci peut-être utile, par exemple, récupérer l'adresse IP de la machine virtuelle, récupérer la liste des fonctionnalités et rôles installés, ou exécuter une action précise... Le tout sans vouloir une console interactive sur la VM.

II. PowerShell Direct : Prérequis

L'utilisation de PowerShell Direct implique le respect de quelques prérequis, que je vous indique sans plus attendre.

  • Le compte utilisateur avec lequel vous êtes connecté sur l'Hyper-V doit avoir les autorisations du groupe "Administrateurs d'Hyper-V"
  • La machine virtuelle cible doit être démarrée et exécutée sur l'hôte Hyper-V sur lequel vous exécutez les commandes PowerShell Direct
  • Des identifiants de connexion (login/password) de la machine virtuelle cible seront nécessaire pour s'authentifier

Concernant l'OS de l'hôte physique et l'OS de l'hôte virtuel, il y a aussi des prérequis :

  • OS Hyper-V : Windows 10 ou Windows Server 2016
  • OS VM : Windows 10 ou Windows Server 2016

Autrement dit, pour le moment l'usage sera limité car c'est exclusif à Windows Server 2016 et Windows 10, alors espérons que ce soit inclus au moins dans Windows Server 2012/2012 R2 prochainement - Si c'est possible...

III. PowerShell Direct : Syntaxe et exemple

On va s'intéresser à la syntaxe des deux modes de PowerShell Direct, puis on prendra un exemple à chaque fois pour que vous voyez le fonctionnement.

  • PowerShell Direct : Mode interactif

Pour rentrer en mode interactif sur une VM, on utilise le commandlet "Enter-PSSession" avec le paramètre "VMName" correspondant au nom de la VM ou "VMId" correspondant à l'identifiant unique de la VM. Soit l'un, soit l'autre.

Ce qui donnera, pour le nom de la VM :

Enter-PSSession -VMName <Nom-VM>

Et pour l'ID de la VM :

Enter-PSSession -VMId <ID-VM>

Par exemple :

Enter-PSSession -VMId "bbc37868-a2f6-4d46-b1bb-5eb28ab90aaa"

Il suffira de rentrer les identifiants pour se connecter à la VM, et le tour est joué !

Lorsque la session interactive sera ouverte sur la VM, vous pouvez interagir en PowerShell avec la machine virtuelle, comme si la console était ouverte en locale sur la VM.

On pourrait par exemple, lister les fonctionnalités et rôles installés :

Get-WindowsFeature | ?{ $_.InstallState -eq "Installed" }

Note : Lorsque la session à la VM est établie, le prompt de la console PowerShell commence par le nom de la VM. Si la VM s'appelle "ADDS-01" ce sera indiqué : "[ADDS-01] : PS C:\Users\Administrateur\Documents>"

Passons à l'utilisation du mode script de PowerShell Direct, vous allez vite comprendre la différence de fonctionnement.

  • PowerShell Direct : Mode script

Les paramètres VMName et VMId sont également utilisés avec Invoke-Command pour l'utilisation en mode script de PowerShell Direct. A cette commande va s'ajouter le paramètre "ScriptBlock" qui va contenir une commande que l'on souhaite exécuter sur la VM.

Ainsi, la syntaxe avec le nom de la VM sera :

Invoke-Command -VMName <Nom-VM> -ScriptBlock { <Commandes> }

Et avec l'ID :

Invoke-Command -VMId <ID-VM> -ScriptBlock { <Commandes> }

Par exemple :

Invoke-Command -VMId "bbc37868-a2f6-4d46-b1bb-5eb28ab90aaa" -ScriptBlock { Get-WindowsFeature | ?{ $_.InstallState -eq "Installed" } }

Là encore, il suffit de rentrer les identifiants et le tour est joué. On pourrait d'ailleurs spécifier les identifiants dans la commande Invoke-Command (ou Enter-PSSession) avec le paramètre "Credential". Pour gagner déjà un peu de temps dans la saisie par exemple :

Invoke-Command -VMId "bbc37868-a2f6-4d46-b1bb-5eb28ab90aaa" -ScriptBlock { Get-WindowsFeature | ?{ $_.InstallState -eq "Installed" } } -Credential (Get-Credential -UserName "ADDS-01\Administrateur" -Message "Saisir mot de passe")

Si l'on veut exécuter un script complet sur la machine virtuelle, c'est tout simple il y a directement un paramètre pour préciser le chemin vers un script .ps1. On utilise le paramètre -FilePath, comme ceci :

Invoke-Command -VMId "bbc37868-a2f6-4d46-b1bb-5eb28ab90aaa" -FilePath C:\Scripts\MonScript.ps1

Vous remarquerez qu'en mode interactif, il faut deux commandes (voire trois si on compte la commande de déconnexion) alors qu'en mode script tout s'effectue dans la même commande.

Pour terminer (ou presque), voici une copie d'écran qui montre le rendu lorsque l'on veut lister les fonctionnalités et rôles installés sur une VM, avec chacune des deux méthodes :

powershell-direct-2

Pour ceux qui se demandent comment récupérer l'ID d'une machine virtuelle, il suffit de sélectionner la propriété "Id", voici par exemple comment lister les VMs dans un tableau avec le nom et l'ID associé :

Get-VM | ft Name, Id

Ce qui donnera par exemple :

powershell-direct-3

 

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “Hyper-V 2016 et PowerShell Direct

  • Bonjour All
    je suis debutante en powershell..’ai un soucis on me demande de faire un script powershell de sauvegarde de machine virtuelle via hyper v le probleme est que je ne sais pas comment m’y prendre jai longtemps cherche mais je ne trouve rien de concret ou peut etre que je ne comprends pas

    merci de m’assister urgemment svp

    Voici le résultat le resultat que mon responsable veut avoir
    – Sauvegarder les répertoires « C:\Hyper-V\conf » et « C:\Hyper-V\Virtual Hard Disk System » sur un disque dur externe ou une clef USB sur ton ordinateur, une fois par semaine (par exemple le vendredi : peut se faire grâce à une tache planifiée)
    – Conserver au moins 3 versions de sauvegardes (= 3 semaines différentes)
    – Petit plus un peu plus compliqué :
    o Créer un fichier texte dans le répertoire de sauvegarde qui renseigne sur la date et l’heure de la sauvegarde
    o Ou mieux encore, l’envoi d’un mail sur [email protected] quand la sauvegarde est terminée

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.