Gestion et automatisation de machines virtuelles avec PowerShell
Vous pouvez utiliser PowerShell Direct pour exécuter PowerShell arbitraire dans un Windows 10 ou version ultérieure, ou Windows Server 2016 ou version ultérieure, machine virtuelle à partir de votre hôte Hyper-V. Utilisez PowerShell Direct, quelle que soit la configuration réseau ou les paramètres de gestion à distance.
Voici quelques méthodes permettant d’exécuter PowerShell Direct :
- En tant que session interactive à l’aide de la cmdlet Enter-PSSession
- En tant que section à usage unique pour exécuter une commande ou un script unique à l’aide de la cmdlet Invoke-Command
- En tant que session persistante (Build 14280 et ultérieures) à l’aide des cmdlets New-PSSession, Copy-Item et Remove-PSSession
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 :
Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.
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.
Exécutez les commandes sur votre machine virtuelle. Vous devez voir VMName comme préfixe pour votre invite PowerShell comme suit :
[VMName]: PS C:\>
Toute exécution de commande s’effectue sur votre machine virtuelle. Pour effectuer un test, vous pouvez exécuter
ipconfig
ouhostname
pour vérifier que ces commandes sont exécutées dans la machine virtuelle.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 :
Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.
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 :
Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.
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 Copier-élément pour déplacer des données de l’hôte vers une machine virtuelle et d’une machine virtuelle vers l’hôte.
Pour créer une session, copiez des fichiers :
Sur l’hôte Hyper-V, ouvrez PowerShell en tant qu’administrateur.
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 existe un bogue dans les builds avant 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, les instructions de contournement sont disponibles dans la section Erreur : une session à distance peut avoir pris fin.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\
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\
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. Les sections suivantes décrivent les messages d’erreur les plus courants, certaines causes et outils 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 :
Entrée-PSSession : une erreur s’est produite sur laquelle Windows PowerShell ne peut pas gérer. Une session à distance peut avoir pris fin.
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. Consultez les exigences.
- 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 : une erreur s’est produite sur laquelle Windows PowerShell ne peut pas gérer. Une session à distance peut avoir pris fin.
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 : Le jeu de paramètres ne peut pas être résolu à l’aide des paramètres nommés spécifiés.
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 : les informations d’identification ne sont pas valides.
Causes potentielles :
- Les informations d’identification de l’invité n’ont pas pu être validées
- 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 dans Activer et désactiver le compte administrateur intégré.
Erreur : Impossible de résoudre le paramètre d’entrée VMName en une machine virtuelle quelconque.
Message d’erreur :
Enter-PSSession : le paramètre VMName d’entrée ne se résout pas sur une machine virtuelle.
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 Just Enough Administration (JEA).
Pour obtenir des exemples, consultez GitHub.