Gestion et automatisation de machines virtuelles avec PowerShell

PowerShell Direct vous permet d’exécuter du code PowerShell arbitraire dans une machine virtuelle Windows 10 ou Windows Server 2016 à partir de votre hôte Hyper-V, indépendamment de la configuration réseau ou des paramètres de gestion à distance.

Voici quelques méthodes permettant d’exécuter PowerShell Direct :

Spécifications

Configuration requise pour le système d’exploitation :

  • Hôte : Windows 10, Windows Server 2016 ou version ultérieure exécutant Hyper-V.
  • Invité/Machine virtuelle : Windows 10, Windows Server 2016 ou version ultérieure.

Si vous gérez des machines virtuelles plus anciennes, utilisez Connexion à une machine virtuelle (VMConnect) ou configurez un réseau virtuel pour la machine virtuelle.

Configuration requise :

  • La machine virtuelle doit être en cours d’exécution localement sur l’hôte.
  • La machine virtuelle doit être allumée et s’exécuter avec au moins un profil utilisateur configuré.
  • vous devez être connecté à l’ordinateur hôte en tant qu’administrateur Hyper-V ;
  • vous devez fournir des informations d’identification utilisateur valides pour la machine virtuelle.

Créer et quitter une session PowerShell interactive

Pour exécuter des commandes PowerShell dans une machine virtuelle, le plus simple consiste à démarrer une session interactive.

Quand la session démarre, les commandes que vous tapez s’exécutent sur la machine virtuelle, comme si vous les aviez tapées directement dans une session PowerShell sur la machine virtuelle elle-même.

Pour démarrer une session interactive :

  1. Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.

  2. Exécutez l’une des commandes suivantes pour créer une session interactive en utilisant le nom ou le GUID de la machine virtuelle :

Enter-PSSession -VMName <VMName>
Enter-PSSession -VMId <VMId>

Quand vous y êtes invité, fournissez les informations d’identification de la machine virtuelle.

  1. Exécutez les commandes sur votre machine virtuelle.

La valeur VMName doit s’afficher comme préfixe de votre invite de commandes PowerShell, comme indiqué ici :

[VMName]: PS C:\>

Toute exécution de commande s’effectue sur votre machine virtuelle. Pour effectuer un test, vous pouvez exécuter ipconfig ou hostname pour vérifier que ces commandes sont exécutées dans la machine virtuelle.

  1. Une fois terminé, exécutez la commande suivante pour fermer la session :

    Exit-PSSession 
    

Remarque : si votre session ne se connecte pas, consultez la section de résolution des problèmes pour déterminer les causes possibles.

Pour en savoir plus sur ces applets de commande, consultez Enter-PSSession et Exit-PSSession.


Exécuter un script ou une commande avec Invoke-Command

PowerShell Direct avec Invoke-Command est parfait pour les situations où vous devez exécuter une commande ou un script sur une machine virtuelle, mais où vous n’avez pas besoin de continuer d’interagir avec la machine virtuelle au-delà de ce point.

Pour exécuter une commande unique :

  1. Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.

  2. Exécutez l’une des commandes suivantes pour créer une session en utilisant le nom ou le GUID de la machine virtuelle :

    Invoke-Command -VMName <VMName> -ScriptBlock { command } 
    Invoke-Command -VMId <VMId> -ScriptBlock { command }
    

    Quand vous y êtes invité, fournissez les informations d’identification de la machine virtuelle.

    La commande s’exécute sur la machine virtuelle. S’il y a une sortie sur la console, elle est imprimée sur votre console. La connexion est automatiquement fermée dès que la commande s’exécute.

Pour exécuter un script :

  1. Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.

  2. Exécutez l’une des commandes suivantes pour créer une session en utilisant le nom ou le GUID de la machine virtuelle :

    Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 
    Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1 
    

    Quand vous y êtes invité, fournissez les informations d’identification de la machine virtuelle.

    Le script s’exécute sur la machine virtuelle. La connexion est automatiquement fermée dès que la commande s’exécute.

Pour en savoir plus sur cette applet de commande, voir Invoke-Command.


Copier des fichiers avec New-PSSession et Copy-Item

Remarque : PowerShell Direct ne prend en charge les sessions persistantes que dans Windows build 14280 et ultérieures.

Les sessions persistantes PowerShell sont extrêmement utiles lors de l’écriture de scripts qui coordonnent des actions sur un ou plusieurs ordinateurs distants. Une fois créées, les sessions persistantes existent en arrière-plan jusqu’à ce que vous décidiez de les supprimer. Cela signifie que vous pouvez référencer la même session indéfiniment avec Invoke-Command ou Enter-PSSession sans passer d’informations d’identification.

De la même manière, les sessions conservent l’état. Étant donné que les sessions persistantes sont maintenues, toutes les variables créées dans une session ou passées à une session sont conservées entre plusieurs appels. Un certain nombre d’outils sont disponibles pour travailler avec les sessions persistantes. Pour cet exemple, nous allons utiliser New-PSSession et Copy-Item pour déplacer des données de l’hôte vers une machine virtuelle ou d’une machine virtuelle vers l’hôte.

Pour créer une session, copiez des fichiers :

  1. Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.

  2. Exécutez l’une des commandes suivantes pour créer une session PowerShell persistante sur la machine virtuelle à l’aide de New-PSSession.

$s = New-PSSession -VMName <VMName> -Credential (Get-Credential)
$s = New-PSSession -VMId <VMId> -Credential (Get-Credential)

Quand vous y êtes invité, fournissez les informations d’identification de la machine virtuelle.

Avertissement :
Il y a un bogue dans les builds antérieures à 14500. Si les informations d’identification ne sont pas explicitement spécifiées avec l’indicateur -Credential, le service dans l’invité se bloque et doit être redémarré. Si vous rencontrez ce problème, des instructions de contournement sont disponibles ici.

  1. Copiez un fichier sur la machine virtuelle.

Pour copier C:\host_path\data.txt sur la machine virtuelle à partir de l’ordinateur hôte, exécutez :

Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
  1. Copiez un fichier à partir de la machine virtuelle (sur l’hôte).

Pour copier C:\guest_path\data.txt sur l’hôte à partir de la machine virtuelle, exécutez :

Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
  1. Arrêtez la session persistante à l’aide de Remove-PSSession.
Remove-PSSession $s

Dépannage

Les messages d’erreur liés à l’utilisation de PowerShell Direct sont peu nombreux. Voici les plus courants, les causes possibles et les outils à utiliser pour diagnostiquer les problèmes.

Les paramètres -VMName ou -VMID n’existent pas

Problème :
Enter-PSSession, Invoke-Command ou New-PSSession n’ont pas de paramètre -VMName ou -VMId.

Causes potentielles :
Le problème le plus probable est que PowerShell Direct n’est pas pris en charge par votre système d’exploitation hôte.

Vous pouvez vérifier votre build Windows en exécutant la commande suivante :

[System.Environment]::OSVersion.Version

Si vous exécutez une build prise en charge, il est également possible que votre version de PowerShell n’exécute pas PowerShell Direct. Pour PowerShell Direct et JEA, la version majeure doit être la version 5 ou ultérieures.

Vous pouvez vérifier votre numéro de build PowerShell en exécutant la commande suivante :

$PSVersionTable.PSVersion

Erreur : une session à distance a peut-être pris fin.

Remarque :
Pour Enter-PSSession entre les builds d’hôte 10240 et 12400, toutes les erreurs ci-dessous sont signalées sous la forme « Une session à distance a peut-être pris fin ».

Message d’erreur :

Enter-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

Causes potentielles :

  • La machine virtuelle existe mais n’est pas en cours d’exécution.
  • Le système d’exploitation invité ne prend pas en charge PowerShell Direct (voir la configuration requise).
  • PowerShell n’est pas encore disponible dans l’invité.
    • Le système d’exploitation n’est pas entièrement démarré.
    • Le système d’exploitation ne peut pas démarrer correctement.
    • Un événement de démarrage exige une entrée de l’utilisateur.

Vous pouvez utiliser l’applet de commande Get-VM pour vérifier quelles machines virtuelles sont en cours d’exécution sur l’hôte.

Message d’erreur :

New-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

Causes potentielles :

  • Une des raisons répertoriées ci-dessus : elles sont également applicables à New-PSSession
  • Un bogue dans les builds actuelles dans lesquelles des informations d’identification doivent être passées explicitement avec -Credential. Quand cela se produit, l’ensemble du service se bloque dans le système d’exploitation invité et doit être redémarré. Vous pouvez vérifier si la session est toujours disponible avec Enter-PSSession.

Pour contourner le problème des informations d’identification, connectez-vous à la machine virtuelle avec VMConnect, ouvrez PowerShell, puis redémarrez le service vmicvmsession à l’aide de la commande PowerShell suivante :

Restart-Service -Name vmicvmsession

Erreur : le jeu de paramètres ne peut pas être résolu

Message d’erreur :

Enter-PSSession : Parameter set cannot be resolved using the specified named parameters.

Causes potentielles :

  • -RunAsAdministrator n’est pas pris en charge lors de la connexion à des machines virtuelles.

    Lors de la connexion à un conteneur Windows, l’indicateur -RunAsAdministrator autorise les connexions administrateur sans informations d’identification explicites. Étant donné que les machines virtuelles ne donnent pas à l’hôte un accès administrateur implicite, vous devez entrer explicitement les informations d’identification.

Les informations d’identification d’administrateur peuvent être passées à la machine virtuelle avec le paramètre -Credential ou en les entrant manuellement quand vous y êtes invité.

Erreur : Les informations d’identification ne sont pas valides.

Message d’erreur :

Enter-PSSession : The credential is invalid.

Causes potentielles :

  • Impossible de valider les informations d’identification de l’invité.
    • Les informations d’identification fournies sont incorrectes.
    • Aucun compte d’utilisateur n’existe dans l’invité (le système d’exploitation n’a pas encore démarré)
    • Si vous vous connectez en tant qu’administrateur : l’administrateur n’a pas été défini comme un utilisateur actif. En savoir plus ici.

Erreur : Impossible de résoudre le paramètre d’entrée VMName en une machine virtuelle quelconque.

Message d’erreur :

Enter-PSSession : The input VMName parameter does not resolve to any virtual machine.

Causes potentielles :

  • Vous n’êtes pas administrateur Hyper-V.
  • La machine virtuelle n’existe pas.

Vous pouvez utiliser l’applet de commande Get-VM pour vérifier que les informations d’identification que vous utilisez ont le rôle d’administrateur Hyper-V et pour identifier les machines virtuelles démarrées et exécutées localement sur l’hôte.


Exemples et guides de l’utilisateur

PowerShell Direct prend en charge JEA (Just Enough Administration). Consultez ce guide de l’utilisateur pour l’essayer.

Pour obtenir des exemples, consultez GitHub.