20 octobre 2024
Gestion à distance des VM Windows Azure via PowerShell Remoting
Lorsqu'on parle d'accéder à une machine virtuelle Azure sous Windows, on pense immédiatement au protocole RDP. Pourtant, dans un contexte DevOps, CI/CD ou d'automatisation, une approche plus souple est souvent nécessaire. PowerShell Remoting propose une alternative efficace et sécurisée au RDP, permettant une gestion rapide et automatisée des VM. Cet article vous montre comment configurer et utiliser PowerShell Remote pour gérer vos VM Windows dans Azure.
L'automatisation de la gestion des machines virtuelles est l'un des aspects clés de l'efficacité des ressources dans Azure. Les sessions RDP conviennent à l'administration manuelle, mais ne sont pas toujours pratiques dans les scénarios d'automatisation où vous devez exécuter un grand nombre de tâches simultanément sur plusieurs machines virtuelles ou intégrer la gestion avec des outils CI/CD.

L'utilisation de PowerShell Remoting permet aux administrateurs et aux ingénieurs DevOps d'exécuter des commandes et des scripts automatisés sur des machines distantes sans établir de connexion graphique. Cela accélère considérablement et rend plus flexible et pratique le déploiement d'applications, la configuration de systèmes et l'exécution de diverses tâches administratives.

Cela est particulièrement important dans le contexte de DevOps, où l'automatisation et l'intégration des processus jouent un rôle crucial. PowerShell Remoting vous permet d'inclure des scripts de gestion de machines virtuelles à distance dans les pipelines Azure DevOps, ce qui permet une intégration transparente et minimise le temps de configuration manuelle.

Étapes théoriques.

Par défaut, l'accès de PowerShell Remoting aux machines virtuelles Azure Windows est désactivé pour des raisons de sécurité. Les étapes suivantes sont nécessaires pour l'activer et le configurer:

  1. Activer WinRM (Windows Remote Management) sur la machine virtuelle.
  2. Activer la connexion via PowerShell Remoting
  3. Configurer les règles de pare-feu nécessaires pour autoriser les connexions à distance.

Vous pouvez configurer WinRM avec différents types d'authentification et d'autres paramètres. Nous utiliserons l'authentification par login/mot de passe de l'administrateur et le protocole HTTPS pour crypter la connexion.

Script Azure PowerShell pour configurer PowerShell Remote.

Pour effectuer ces étapes à l'aide de PowerShell, vous devez utiliser les commandes suivantes.

Créer un certificat auto-signé pour configurer le cryptage de la connexion DNS:
$cert = New-SelfSignedCertificate -DnsName <VM DNS name> -CertStoreLocation cert:\LocalMachine\My
Activer le Remoting PowerShell
$cert = New-SelfSignedCertificate -DnsName <VM DNS name> -CertStoreLocation cert:\LocalMachine\My
Включить PowerShell Remoting
Enable-PSRemoting -force
Créer une liste d'écoute WinRM qui acceptera les connexions entrantes via HTTPS
winrm create winrm/config/Listener?Address=*+Transport=HTTPS "@{Hostname=""<VM DNS name>"";CertificateThumbprint=""$($cert.ThumbPrint)""}"


  • Address=*: Spécifie que l'écouteur est disponible sur toutes les interfaces réseau de la machine.
  • Transport=HTTPS: Spécifie que l'auditeur utilisera une connexion HTTPS sécurisée.
  • Hostname: Spécifie le nom DNS de la machine virtuelle.
  • CertificateThumbprint: Lie un certificat précédemment créé à cet auditeur.

Ajoutez une nouvelle règle au pare-feu Windows pour autoriser les connexions TCP entrantes sur le port 5986.
netsh advfirewall firewall add rule name=”WinRM-HTTPS” dir=in localport=5986 protocol=TCP action=allow
Configuration de PowerShell Remote dans les DevOps Pipelines Azure

Si nous revenons à la question de l'automatisation du processus de configuration de PowerShell Remote pour Azure Windows VM (qui est exactement ce dont nous avons besoin pour la gestion automatisée des machines virtuelles), nous nous demandons alors comment exécuter des commandes Powershell sur la machine distante si PowerShell Remote n'est pas encore activé sur celle-ci.

Pour cela, nous pouvons utiliser la cmdlet Azure PowerShell Invoke-AzVMRunCommand.

Je donnerai ensuite un exemple de tâche AzurePowerShell qui active PowerShell Remote sur la machine distante.

- task: AzurePowerShell@5
            displayName: Configure Azure VM
            inputs:
              azureSubscription: '${{ parameters.AzureSubscription }}'
              ScriptType: 'InlineScript'
              Inline: |
                $vmname = “<VM NAME IN AZURE>”
                $vmdnsname = "<VM DNS NAME>"
                $params=@{
                    "vmdnsname" = $vmdnsname
                }
                Invoke-AzVMRunCommand `
                    -ResourceGroupName '${{ parameters.ResourceGroupName }}' `
                    -VMName $vmname `
                    -CommandId 'RunPowerShellScript' `
                    -Parameter $params `
                    -ScriptString ' `
                        Param(
                            [string]$vmdnsname
                        )
                        $cert = New-SelfSignedCertificate -DnsName $vmdnsname -CertStoreLocation cert:\LocalMachine\My
                        Enable-PSRemoting -force
                        winrm create winrm/config/Listener?Address=*+Transport=HTTPS "@{Hostname=""$vmdnsname"";CertificateThumbprint=""$($cert.ThumbPrint)""}"
                        netsh advfirewall firewall add rule name=”WinRM-HTTPS” dir=in localport=5986 protocol=TCP action=allow'
Notez que $vmdnsname est transmis à la commande Invoke-AzVMRunCommand en tant que paramètre de script PowerShell avec la syntaxe appropriée.

Connexion à Azure Windows VM via PowerShell Remote

Après avoir suivi les étapes ci-dessus, vous pouvez vous connecter à la VM Azure Windows à l'aide de PowerShell Remote, par exemple de la manière suivante:
$vmdnsname = <VmDnsName>
$vmusername = <vmcred.VmUsername>
$vmpassword = <vmcred.VmPassword>
# Convert Password
$securePassword = ConvertTo-SecureString $vmpassword -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($vmusername, $securePassword)
# Connect to the machine
$soptions = New-PSSessionOption -SkipCACheck
$session =  New-PSSession -ComputerName $vmdnsname -Port 5986 -Credential $cred -SessionOption $soptions -UseSSL
Invoke-Command -Session $session -ScriptBlock {<Inline Powershell commands>}
Lors de la connexion, nous utilisons SSL et ne validons pas le certificat de la machine virtuelle, puisqu'il est auto-signé. La paire login/mot de passe est utilisée pour l'autorisation.

Nous pouvons maintenant automatiser la gestion et la configuration de la machine virtuelle Azure Windows. Par exemple, le script suivant peut être utilisé pour installer le SDK DotNet:
$vmdnsname = $vmcred.VmDnsName
$vmusername = $vmcred.VmUsername
$vmpassword = $vmcred.VmPassword
# Convert Password
$securePassword = ConvertTo-SecureString $vmpassword -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($vmusername, $securePassword)
# Connect to the machine
$soptions = New-PSSessionOption -SkipCACheck
$session =  New-PSSession -ComputerName $vmdnsname -Port 5986 -Credential $cred -SessionOption $soptions -UseSSL
Invoke-Command -Session $session -ScriptBlock {
             Invoke-WebRequest -Uri https://dot.net/v1/dotnet-install.ps1 -OutFile dotnet-install.ps1
              ./dotnet-install.ps1 -Channel LTS -InstallDir 'C:\Program Files\dotnet'
}