16/12/2024

Windows Server

PowerShell remoting avec WinRM

I. Présentation

Pour les habitués des systèmes Linux, vous utilisez certainement le couple "Shell - SSH" pour administrer votre machine à distance. Sous Windows, on trouve l'équivalent "PowerShell - WinRM", nous verrons ci-après ce qu'est WinRM.

L'administration à distance via PowerShell, appelée également PowerShell remoting, s'effectue par une connexion via WinRM sur l'hôte distant, il faut donc que WinRM soit activé sur l'hôte distant. Par défaut, WinRM est actif sur Windows Server 2012 et Windows Server 2012 R2, faisant référence à la "Gestion à distance".

A l'inverse, sur les versions plus anciennes de Windows Server et sur les versions clientes (Windows 7, Windows 8 et Windows 8.1), la gestion à distance est désactivée par défaut. Cela n'est pas déconnant puisque l'utilité d'administrer un poste client à distance via WinRM n'est pas toujours utile.

Dans ce tutoriel, nous verrons l'activation et la configuration de WinRM sur une machine (Windows 8.1 dans mon cas) afin de se connecter dessus via PowerShell en fin de procédure. Je précise également que j'utilise un domaine it-connect.fr ce qui facilitera l'authentification sur la machine cliente.

II. WinRM, c'est quoi ?

WinRM, Windows Remote Management, repose sur du HTTP et il est l'implémentation chez Microsoft du standard WS-Management, basé sur SOAP. Ceci implique qu'il n'est plus un protocole RPC et peut donc passer plus facilement les firewalls.

Au niveau des ports utilisés, on en trouve deux :

  • HTTP : 5985
  • HTTPS : 5986

Il est préférable d'utiliser le port 5986 basé sur une connexion HTTPS, qui sera plus sécurisée.

III. WinRM est-il installé sur ma machine ?

Certaines versions de Windows comme Windows XP, Windows Vista et Windows Server 2008 ne disposent pas de WinRM par défaut, il faudra donc l'installer. Pour vérifier si le service WinRM existe ou non sur votre machine, saisissez la commande PowerShell suivante :

Get-Service WinRM

Si vous n'obtenez pas de retour positif (comme sur la copie d'écran ci-dessous), cela signifie qu'il n'est pas installé.

winrm0

Pour installer WinRM, je vous propose d'installer directement le package d'outils Windows Management Framework 4.0 directement.

IV. Tentative de connexion avant configuration

Si vous tentez dès maintenant de vous connecter à un hôte distant où WinRM n'est pas configuré, la demande sera légitimement refusée.

Pour se connecter, on utilisera le commandlet PowerShell nommé "Enter-PSSession".

Enter-PSSession -ComputerName CLI01.it-connect.fr

winrm1

Passons désormais à la configuration afin d'obtenir un résultat plus satisfait lors d'une connexion.

V. Configuration de WinRM

Pour commencer la configuration, nous allons activer le PSRemoting via WinRM, autrement dit nous allons activer la "Gestion à distance".

Pour cela, ouvrez une console PowerShell en tant qu'Administrateur puis saisissez la commande suivante :

Enable-PSRemoting

winrm2

Comme vous pouvez le voir sur la copie d'écran ci-dessus, une fois la commande saisie plusieurs confirmations vous sont demandées. Indiquez un "T" et appuyez sur "Entrée" pour tout valider (sinon valider un par un). Par exemple, cela va notamment :

- Démarrer le service WinRM et activer le démarrage automatique

- Mise en place d'un socket d'écoute

- Créer une exception dans le pare-feu puisqu'il s'agit de connexion entrante

- Effectuer une configuration rapide

Ensuite, passons à la configuration du paramètre TrustedHosts. Ce dernier permet de définir des hôtes de confiance c'est à dire des hôtes depuis lesquelles on autorise la connexion, on peut très bien autoriser une ou plusieurs machines mais aussi toutes les machines (*).

Pour cela, on ajoute directement un objet dans la configuration de WinRM. Par exemple pour ajouter l'hôte "SRV-AD01.it-connect.fr" :

Set-Item WSMan:\localhost\Client\TrustedHosts SRV-AD01.it-connect.fr

Ou pour autoriser tous les hôtes :

Set-Item WSMan:\localhost\Client\TrustedHosts *

Lors de l'ajout, confirmez en indiquant "O" signifiant Oui.

winrm3

Redémarrer le service WinRM pour la prise en compte des modifications :

Restart-Service winrm

Ensuite, on peut consulter la configuration de WinRM pour vérifier que l'entrée est bien prise en compte. Pour cela on utilisera la commande suivante :

winrm get winrm/config/client

winrm4

L'hôte distant est désormais configuré et prêt à recevoir une connexion à distance.

VI. Connexion à l'hôte distant

Pour vous connecter, il vous suffit de rééditer la commande saisit en début de tutoriel afin de se connecter sur l'hôte fraîchement configuré :

Enter-PSSession -ComputerName CLI01.it-connect.fr

 Note : Pour la connexion à la machine distante, saisissez son nom complet (FQDN) ou son adresse IP.

Si vous obtenez un accès refusé, précisé éventuellement un identifiant avec des droits élevés :

Enter-PSSession -ComputerName CLI01.it-connect.fr -Credential IT-Connect\Administrateur

Lorsque la  connexion sera établie, vous obtiendrez un shell PowerShell sur la machine distante :

winrm5Ensuite, pour quitter la session PowerShell distante, il suffira d'entrer la commande suivante :

Exit-PSSession

Vous reviendrez alors sur la console PowerShell de votre machine locale.

En cas de problème de configuration et/ou de connexion, je vous invite à utiliser notre forum.

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

14 commentaires sur “PowerShell remoting avec WinRM

  • Une explication simple et efficace. Merci Florian

    Répondre
  • Bonjour,
    Tout d’abord merci pour votre travail.
    Voilà ma config :
    – client sous Seven pro
    – serveur Web sous Seven pro
    Je souhaite depuis le client pouvoir relancer un processus sur le serveur (easyphp en l’occurrence).

    Sur le client avec « Enter-PSSession -ComputerName 10.130.76.12 » j’obtiens :

    Connecting to remote server failed with the following error message : Le client WinRM ne peut pas traiter la demande. L’authentification par défaut peut être utilisée avec une adresse IP dans
    les conditions suivantes : le transport est HTTPS ou la destination se trouve dans la liste TrustedHosts, et des informations d’identification explicites sont fournies. Utilisez winrm.cmd pour configurer TrustedHosts. Notez que les ordinateurs dans la liste TrustedHosts ne sont peut-être pas authentifiés. Pour plus d’informations sur la configuration de TrustedHosts, exécutez la commande suivante : winrm help config. For more information, see the about_Remote_Troubleshooting Help topic.
    At line:1 char:16
    + Enter-PSSession <<<> IP du client

    Pourriez-vous m’aider svp ?
    Cordialement,
    Thierry

    Répondre
    • Visiblement la taille du message est limité, je le poste donc en plusieurs fois, la suite à partir de « + Enter-PSSession » :

      + Enter-PSSession <<<> IP du client

      Pourriez-vous m’aider svp ?
      Cordialement,
      Thierry

      Répondre
  • Article bien construit.
    Il serait intéressant d’en faire une version un peu plus avancée lorsque l’on veut faire de même sur un serveur distant (client par exemple ou chez OVH et donc pas connecté forcément à l’AD).

    Répondre
  • Bonjour,

    De windows 10 à Windows 2016 Server fraîchement installé en version CORE, je n’arrive pas à appliquer cette procédure. Mes machines ne sont pas sur le même domaine. D’ailleurs le serveur n’est pas encore sur un domaine.
    Je peux me connecter en ajoutant ma machine en TrustedHosts de cette manière :
    – winrm s winrm/config/client ‘@{TrustedHosts= »ipdelaMachineDistante »}’

    Je me connecte ainsi :
    – Enter-PSSession -ComputerName ipdelaMachineDistante -Credential loginUtilisateur

    Répondre
  • Bonjour, je recoit un message d’ereur avec la comande de configuration WinRM.
    Que puis je faire pour débloquer cette commande ?

    Répondre
  • Bonjour,
    Je n’arrive pas sur mon serveur à exécuter la commande Enable-PSRemoting, la commande ne retourne rien.

    Merci d’avance,

    Répondre
    • Ok c’est normal, maintenant je n’arrive pas effectuer une PSSESSION, cela me dit :

      Enter-PSSession : La connexion au serveur distant TSTIKO.intnet.local a échoué avec le message
      d’erreur suivant: Le client WinRM ne peut pas traiter la demande. Le trafic non chiffré est
      actuellement désactivé dans la configuration du client. Modifiez la configuration du client et
      renouvelez la demande. Pour plus d’informations, voir la rubrique d’aide
      about_Remote_Troubleshooting.
      Au caractère Ligne:1 : 1
      + Enter-PSSession -ComputerName TSTIKO.intnet.local -Credential intnet\ …
      + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      + CategoryInfo : InvalidArgument : (TSTIKO.intnet.local:String) [Enter-PSSession], P
      SRemotingTransportException
      + FullyQualifiedErrorId : CreateRemoteRunspaceFailed

      Répondre
  • Bonjour Florian ou Jerome je sais pas encore lequel de vous est qui je voudrais savoir svp si powershell peut accéder à une autre machine Windows sans quel celle-ci ne soit sur le domaine AD ? Si ou quel version de powershell le peux powershell core ou powershell desktop ? Et quel sont les différentes qui permettent d’ouvrir une session sur un hôte distant qui n’est pas forcément du domaine ?

    Répondre
  • Bonsoir,
    J’utilise powershell remoting depuis plusieurs années, aujourd’hui je voudrais renforcer la sécurité et n’accorder le droit de faire du remote powershell qu’à quelques personnes. Est ce que je peux interdire cette possibilité à certains comptes ?

    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.