6Sep

Geek School: Apprenez à utiliser Remoting dans PowerShell

L'une des meilleures fonctionnalités offertes par PowerShell est la possibilité de gérer à distance vos serveurs. Il vous permet même de gérer un tas d'entre eux à la fois.

Assurez-vous de lire les articles précédents de la série:

  • Apprendre à automatiser Windows avec PowerShell
  • Apprendre à utiliser des applets de commande dans PowerShell
  • Apprendre à utiliser des objets dans PowerShell
  • Apprentissage de la mise en forme, filtrage et comparaison dans PowerShell

Et restez à l'écoute pourreste de la série toute la semaine.

Qu'est-ce que Remoting?

La gestion en masse de vos serveurs peut être fastidieuse, et si vous avez déjà dû modifier une configuration IIS sur 50 serveurs Web, vous saurez ce que je veux dire. Ce sont les types de situations où PowerShell Remoting et les capacités de script de la langue peuvent venir à la rescousse. En utilisant le protocole HTTP ou le protocole HTTPS plus sécurisé, PowerShell Remoting vous permet d'envoyer des commandes à un ordinateur distant sur votre réseau. La machine exécute ensuite les commandes et vous renvoie la sortie, qui est à son tour affichée sur votre écran.

technique Au cœur de PowerShell Remoting se trouve un seul service Windows, le service de gestion à distance de Windows, ou WinRM, comme il a été connu. En utilisant WinRM, vous pouvez configurer une ou plusieurs configurations de session( également appelées points de terminaison), qui sont essentiellement des fichiers contenant des informations sur l'expérience que vous souhaitez fournir à la personne se connectant à votre instance PowerShell distante. Plus précisément, vous pouvez utiliser les fichiers de configuration de session pour définir qui peut et ne peut pas se connecter à l'instance, les cmdlets et les scripts qu'ils peuvent exécuter, ainsi que le contexte de sécurité dans lequel la session doit être exécutée. En utilisant le service WinRM, vous configurez également des "listeners", qui écoutent les requêtes PowerShell entrantes. Ces "écouteurs" peuvent être HTTP ou HTTPS et peuvent être liés à une seule adresse IP sur votre machine. Lorsque vous ouvrez une connexion PowerShell à une autre machine( techniquement, cela est fait en utilisant le protocole WS-MAN, qui est basé sur HTTP), la connexion se lie à l'un de ces "écouteurs".Les "auditeurs" sont alors chargés d'envoyer le trafic à l'application associée au fichier de configuration de session approprié;l'application( normalement PowerShell, mais vous pouvez avoir d'autres applications d'hébergement si vous voulez) puis exécute la commande et transmet les résultats à travers le "auditeur" à travers le réseau et de retour sur votre machine.

Montrez-moi comment

La première chose que vous devez faire est d'activer Remoting sur la machine à laquelle vous voulez vous connecter. Cela peut être fait en exécutant ce qui suit:

Enable-PSRemoting

Vous devrez alors répondre oui à toutes les invites. Lorsque vous exécutez Enable-PSRemoting, quelques modifications sont apportées à votre PC:

  • Le service WinRM démarre.
  • Le service WinRM passe du mode de démarrage manuel à Automatique.
  • Il crée un écouteur HTTP lié à toutes vos cartes réseau.
  • Il crée également une exception de pare-feu entrant pour le protocole WS-MAN.
  • Certaines configurations de session par défaut sont créées

Si vous utilisez Windows 7 et que l'emplacement de votre carte réseau est Public, l'activation de PowerShell Remoting échouera. Pour le réparer, passez simplement à l'emplacement réseau Domicile ou Travail. Vous pouvez également ignorer la vérification du réseau à l'aide de ce qui suit:

Enable-PSRemoting -SkipNetworkProfileCheck

Toutefois, nous vous recommandons de modifier votre emplacement réseau.

Il existe deux façons de se connecter à une autre machine en utilisant PowerShell. Il y a la méthode one to one, qui est très similaire à l'utilisation de SSH, et puis il y a la méthode one to many.

Utilisation d'une session PowerShell

La première façon de se connecter à une machine distante à l'aide de PowerShell consiste à utiliser une application appelée PowerShell Session. Il suffit de mettre une session vous permet d'exécuter des commandes sur la machine distante d'une manière interactive de la même manière que vous le feriez sur votre propre machine. Pour ouvrir une session, tapez simplement ce qui suit:

Enter-PSSession -ComputerName "Darlah"

L'invite obtiendra un préfixe qui indique la machine sur laquelle vous exécutez les cmdlets.

De là, vous pouvez vraiment traiter l'invite comme si vous étiez assis sur la machine distante. Par exemple, si vous voulez voir tous les fichiers sur le lecteur C: \ vous pouvez faire un simple:

Get-ChildItem -Path C: \

Si vous venez d'un environnement Linux, vous pouvez envisager d'utiliser cette méthode one-to-one d'accès distant comme alternative à PowerShell SSH.

Utilisation de la commande Invoke

La deuxième méthode d'utilisation de PowerShell sur une machine distante consiste à utiliser Invoke-Command. L'avantage d'utiliser Invoke-Command vient du fait que vous pouvez exécuter la même commande sur plusieurs machines simultanément. Comme vous pouvez l'imaginer, ceci est particulièrement utile lorsque vous voulez faire quelque chose comme collecter des journaux d'événements à partir de vos serveurs. Invoke-Command suit la syntaxe suivante:

Invoke-Command -Nom d'ordinateur Darlah, localhost -ScriptBlock{ Application Get-EventLog -Newest 2}

Comme la commande est exécutée en parallèle sur toutes les machines, vous aurez besoin d'un moyen de voir quel PC unrésultat donné est venu. Vous pouvez le faire en regardant la propriété PSComputerName.

Lorsque vous utilisez Invoke-Command, vous n'avez plus les objets auxquels vous pouvez vous attendre dans le Pipeline. Vous voyez, pour que PowerShell récupère les informations de la machine distante sur votre machine, elles ont besoin d'un moyen de représenter les objets que la commande que vous avez exécuté sur les sorties de la machine distante. De nos jours, il semble que la façon choisie de représenter une structure de données hiérarchique est d'utiliser XML, ce qui signifie que lorsque vous émettez une commande en utilisant Invoke-Command, les résultats sont d'abord sérialisés en XML avant d'être renvoyés à votre machine. Une fois qu'ils reviennent à votre machine, ils sont désérialisés dans un objet;le gotcha ici est que quand ils sont désérialisés, toutes les méthodes, à l'exception de la méthode ToString() , que l'objet a eu sont enlevées.

Note: Il y a quelques exceptions à cette règle, par exemple la plupart des types primitifs comme les entiers peuvent être désérialisés avec leurs méthodes incluses. Il existe également un processus appelé Réhydratation dans lequel certaines méthodes peuvent être rajoutées à des objets désérialisés. Alors soyez prudent et rappelez-vous Get-Member est votre ami.

Homework

  • Lire les secrets de PowerShell Remoting eBook par Don Jones.