Windows PowerShell 2.0 a introduit une nouvelle technologie puissante, Remoting, qui a été affinée et développée pour PowerShell 3.0. Basé principalement sur des protocoles et des techniques standardisés, la mise à distance est peut-être l’un des aspects les plus importants de PowerShell: les futurs produits Microsoft s’en appuieront presque entièrement pour les communications administratives sur un réseau.,
malheureusement, Remoting est également un ensemble complexe de composants, et bien que Microsoft ait tenté de fournir des conseils solides pour l’utiliser dans une variété de scénarios, de nombreux administrateurs ont encore du mal avec elle. Ce « mini E-book » est conçu pour vous aider à mieux comprendre ce Qu’est la télécommande, comment cela fonctionne et-surtout-comment l’utiliser dans une variété de situations différentes.
Remarque Ce guide n’est pas destiné à remplacer la myriade de livres existants qui couvrent les bases de la mise à distance, tels que Don’s own Learn Windows PowerShell in a Month of Lunches ( http://MoreLunches.com) ou PowerShell en profondeur., Au lieu de cela, ce guide complète ceux-ci en fournissant des instructions étape par étape pour la plupart des cas « edge » dans Remoting, et en expliquant certains des comportements et exigences de Remoting les plus inhabituels.
essentiellement, la mise à distance vous permet d’accéder à des machines distantes sur un réseau et de récupérer des données ou d’exécuter du code sur un ou plusieurs ordinateurs distants. Ce n’est pas une idée nouvelle, et dans le passé, un certain nombre de différentes technologies à distance ont évolué. Certaines cmdlets ont traditionnellement fourni leurs propres capacités de mise à distance limitées tandis que la majorité des cmdlets ne prennent pas en charge la mise à distance par elles-mêmes.,
avec PowerShell remoting, il existe enfin un environnement de remoting générique qui permet l’exécution à distance pour littéralement toute commande pouvant s’exécuter dans un PowerShell local. Ainsi, au lieu d’ajouter des capacités de mise à distance à chaque applet de commande et application, vous laissez simplement à PowerShell le soin de transférer votre code PowerShell vers le ou les ordinateurs cibles, de l’exécuter là-bas, puis de vous renvoyer les résultats.
tout au long de cet eBook, nous nous concentrerons sur la mise à distance PowerShell et ne couvrirons pas les capacités de mise à distance privée non standard intégrées dans les applets de commande sélectionnées.,
examen de L’Architecture de mise à distance
comme le montre la figure 1.1, L’architecture de mise à distance générique de PowerShell se compose de nombreux composants et éléments différents et interdépendants.
la Figure 1.1: Les éléments et les composants de PowerShell Remoting
Voici la liste complète:
■ Au bas de la figure est votre ordinateur, ou plus correctement votre client., C’est là que vous vous asseyez physiquement, et c’est là que vous lancerez la plupart de vos activités à distance.
■ votre ordinateur communiquera via le protocole WS-MAN, ou Web Services for Management. Il s’agit d’un protocole basé sur HTTP(S) qui peut encapsuler une variété de communications différentes. Nous avons illustré cela en utilisant HTTP, qui est la configuration par défaut de Remoting, mais il pourrait tout aussi bien être HTTPS.
■ sur l’ordinateur distant, dans la terminologie appropriée du serveur (qui ne fait pas référence au système d’exploitation), le service Windows Remote Management (WinRM) s’exécute., Ce service est configuré pour avoir un ou plusieurs auditeurs. Chaque auditeur attend le trafic WS-MAN entrant sur un port spécifique, chacun lié à un protocole spécifique (HTTP ou HTTPS), et sur des adresses IP spécifiques (ou toutes les adresses locales).
■ quand un écouteur reçoit le trafic, le service WinRM regarde pour voir à quel point final le trafic est destiné. Pour nos besoins, un point de terminaison lancera généralement une instance de Windows PowerShell. En termes PowerShell, un point de terminaison est également appelé configuration de session., En effet, en plus de lancer PowerShell, il peut charger automatiquement des scripts et des modules, imposer des restrictions sur ce qui peut être fait par l’utilisateur connecté et appliquer des paramètres spécifiques à la session supplémentaires non mentionnés ici.
notez bien que nous montrons PowerShell.exe dans notre diagramme, c’est à des fins d’illustration. PowerShell.exe est L’application de console PowerShell, et il n’aurait pas de sens de l’exécuter en tant que processus d’arrière-plan sur un ordinateur distant. Le processus réel est appelé Wsmprovhost.exe, qui héberge PowerShell en arrière-plan pour les connexions à distance.,
comme vous pouvez le voir, un seul ordinateur distant peut facilement avoir des dizaines, voire des centaines de points de terminaison, chacun avec une configuration différente. PowerShell 3.0 configure trois de ces points de terminaison par défaut: un pour PowerShell 32 bits (sur les systèmes 64 bits), le point de terminaison PowerShell par défaut (qui est 64 bits sur les systèmes x64) et un pour le flux de travail PowerShell. À partir de Windows Server 2008 R2, il existe un quatrième point de terminaison par défaut pour les tâches de Workflow du Gestionnaire de serveur.,
activation de la mise à distance
La plupart des versions client de Windows, à commencer par Windows Vista, n’activent pas les connexions à distance entrantes par défaut. Les nouvelles versions de Windows Server le font, mais les anciennes versions peuvent ne pas le faire. Votre première étape avec l’accès distant sera généralement pour l’activer sur les ordinateurs sur lesquels vous souhaitez recevoir des connexions entrantes. Il existe trois façons d’activer la mise à distance, et le tableau 1.1 compare ce qui est réalisable avec chacune d’elles.
le Tableau 1.,1 Comparing the ways of enabling remoting
Enable-PSRemoting |
Group Policy |
Manually Step-by-Step |
|||
Set WinRM to auto-start and start the service |
Yes |
Yes |
Yes – use Set-Service and Start-Service., |
No |
Yes – use PSSessionConfiguration cmdlets |
Configure Windows Firewall exception |
Yes* |
Yes* |
Yes* – use Firewall cmdlets or Windows Firewall GUI |
Note Existing client versions of Windows, such as Windows Vista, do not permit firewall exceptions on any network identified as « Public »., Les réseaux doivent être « domicile » ou « Travail/domaine » pour permettre des exceptions. Dans PowerShell 3.0, vous pouvez exécuter Enable-PSRemoting avec le commutateur-SkipNetworkProfileCheck pour éviter ce problème.
Nous allons activer la mise à distance dans notre environnement de test en exécutant Enable-PSRemoting. C’est rapide, facile et complet; vous verrez également la plupart des tâches manuelles effectuées dans les sections à venir.
environnement de Test
Nous utiliserons un environnement de test cohérent dans les sections suivantes; cela a été créé sur six machines virtuelles chez CloudShare.,com, et est configuré comme indiqué dans la figure 1.2.
Figure 1.2: configuration de L’environnement de Test
quelques remarques importantes:
■. NET Framework v4 et PowerShell 3.0 sont installés sur tous les ordinateurs. La plupart de ce que nous couvrirons s’applique également à PowerShell 2.0.,
■ comme indiqué, la plupart des ordinateurs ont un nom d’ordinateur numérique (C2108222963, etc.); le contrôleur de domaine pour chaque domaine (qui est également un serveur DNS) a des enregistrements CNAME avec des noms plus faciles à mémoriser.
■ Chaque contrôleur de domaine a un redirecteur conditionnel mis en place pour l’autre domaine, afin que les machines du domaine peut résoudre les noms d’ordinateur dans l’autre domaine.
■ nous avons effectué toutes les tâches en tant que membre du groupe Administrateurs de domaine, sauf indication contraire.
■ nous avons créé un sixième serveur complètement autonome qui ne fait partie d’aucun domaine., Cela sera utile pour couvrir certaines des situations hors domaine dans lesquelles vous pouvez vous retrouver avec Remoting.
attention lorsque vous ouvrez PowerShell sur un ordinateur sur lequel le contrôle de Compte D’utilisateur (UAC) est activé, assurez-vous de cliquer avec le bouton droit sur L’icône PowerShell et sélectionnez Exécuter en tant qu’administrateur. Si la barre de titre de la fenêtre PowerShell résultante ne commence pas par Administrateur: alors vous n’avez pas de privilèges d’administration. Vous pouvez vérifier les autorisations par programme avec ceci (whoami /all | select-string S-1-16-12288) – ne null null de la console PowerShell., Dans un shell élevé, True est renvoyé, sinon False l’est.
activation de la mise à distance
Nous avons commencé par exécuter Enable-PSRemoting sur les six ordinateurs. Nous avons pris soin de nous assurer que la commande s’exécutait sans erreur; toute erreur à ce stade est un signal que vous devez arrêter et résoudre l’erreur avant de tenter de continuer. La Figure 1.3 montre les résultats attendus.
la Figure 1.,3: sortie attendue de Enable-PSRemoting
Remarque: vous remarquerez une utilisation excessive des captures d’écran tout au long de ce guide. Cela aide à m’assurer que je ne fais pas de fautes de frappe ou de copier/coller – vous voyez exactement ce que nous avons tapé et exécuté.
L’exécution de Get-PSSessionConfiguration doit révéler les trois ou quatre points de terminaison créés par Enable-PSRemoting. La Figure 1.4 montre la sortie attendue sur un serveur.
la Figure 1.,4: sortie attendue de Get-PSSessionConfiguration
Remarque: La Figure 1.4 illustre que vous pouvez vous attendre à ce que différents points de terminaison soient configurés sur différentes machines. Cet exemple provenait d’un ordinateur Windows Server 2008 R2, qui a moins de points de terminaison qu’une machine Windows 2012.
il vaut la peine de prendre un moment pour tester rapidement la configuration à distance. Pour les ordinateurs qui font tous partie du même domaine, lorsque vous êtes connecté en tant qu’administrateur de domaine à partir de ce domaine, la mise à distance devrait « simplement fonctionner. »Vérifiez-le rapidement en essayant de passer d’un ordinateur à un autre à l’aide D’Enter-PSSession.,
Remarque: Dans d’autres environnements, un compte administrateur de domaine peut ne pas être le seul compte pouvant utiliser la mise à distance. Si votre environnement personnel ou professionnel possède des comptes supplémentaires dans le groupe Administrateurs locaux en standard dans votre domaine, vous pourrez également utiliser ces comptes pour la mise à distance.
la Figure 1.5 montre la sortie attendue, dans laquelle nous avons également exécuté une commande dir rapide, puis quitté la session distante.
Figure 1.5: vérification de la connectivité à distance de la société.CLIENTA de loc au contrôleur de domaine DCA.
attention: si vous suivez votre propre environnement de test, ne continuez pas tant que vous n’avez pas confirmé la connectivité à distance entre deux ordinateurs du même domaine. Aucun autre scénario ne doit fonctionner en ce moment; nous y arriverons dans les sections à venir.
Core Remoting Tasks
PowerShell fournit deux principaux cas d’utilisation de Remoting., Le premier, 1-to-1 Remoting, est de nature similaire au SSH secure shell offert sur les systèmes Unix et Linux. Avec elle, vous obtenez une invite de ligne de commande sur un seul ordinateur distant. Le second, 1 pour de Nombreux accès à distance vous permet d’envoyer une commande (ou une liste de commandes) en parallèle à un ensemble d’ordinateurs distants. Il y a aussi quelques techniques secondaires utiles que nous allons examiner.
1-to-1 Remoting
la commande Enter-PSSession se connecte à un ordinateur distant et vous donne une invite de ligne de commande sur cet ordinateur., Vous pouvez exécuter toutes les commandes sur cet ordinateur, à condition que vous ayez l’autorisation d’effectuer cette tâche. Notez que vous ne créez pas de session d’ouverture de session interactive; votre connexion sera vérifiée en tant qu’ouverture de session réseau, tout comme si vous vous connectez au partage administratif C$ de l’ordinateur. PowerShell ne charge ni ne traite les scripts de profil sur l’ordinateur distant. Tous les scripts que vous choisissez d’exécuter (y compris l’importation de modules de script) ne fonctionneront que si la stratégie D’exécution de la machine distante le permet.,
Enter-PSSession -computerName DC01
Remarque: lorsqu’il est connecté à un ordinateur distant via Entrée-PSSession, votre invite de modifications et affiche le nom du système distant entre crochets. Si vous avez personnalisé votre invite, toutes les personnalisations seront perdues car l’invite est maintenant créée sur le système distant et transférée à vous. Toutes vos entrées interactives au clavier sont envoyées à la machine distante et tous les résultats vous sont transmis. Ceci est important à noter car vous ne pouvez pas utiliser Enter-PSSession dans un script., Si vous le faisiez, le script s’exécuterait toujours sur votre machine locale car aucun code n’a été entré de manière interactive.
1-to-Many Remoting
Avec cette technique, vous spécifiez un ou plusieurs noms d’ordinateur et une commande (ou une liste de commandes séparées par des points-virgules); PowerShell envoie les commandes, via Remoting, aux ordinateurs spécifiés. Ces ordinateurs exécutent les commandes, sérialisent les résultats en XML et vous transmettent les résultats. Votre ordinateur désérialise le XML en objets et les place dans le pipeline de votre session PowerShell., Ceci est accompli via L’applet de commande Invoke-Command.
Invoke-Command -computername DC01,CLIENT1 -scriptBlock { Get-Service }
Si vous avez un script de commandes à exécuter, vous pouvez avoir Invoke-Command le lire, transmettre le contenu à distance des ordinateurs, et de les exécuter ces commandes.
Invoke-Command -computername DC01,CLIENT1 -filePath c:\Scripts\Task.ps1
Notez que la Commande Invoke-command, par défaut, de communiquer avec seulement 32 ordinateurs à la fois. Si vous en spécifiez plus, les extras se mettront en file d’attente et Invoke-Command commencera à les traiter à la fin des 32 premiers., Le paramètre-ThrottleLimit peut augmenter cette limite; le seul coût est pour votre ordinateur, qui doit disposer de ressources suffisantes pour maintenir une session PowerShell unique pour chaque ordinateur que vous contactez simultanément. Si vous vous attendez à recevoir de grandes quantités de données des ordinateurs distants, la bande passante réseau disponible peut être un autre facteur limitant.,
Sessions
lorsque vous exécutez Enter-PSSession ou Invoke-Command et utilisez leur paramètre-ComputerName, Remoting crée une connexion (ou une session), fait tout ce que vous lui avez demandé, puis ferme la connexion (dans le cas d’une session interactive créée avec Enter-PSSession, PowerShell sait que vous avez terminé lorsque vous exécutez Exit-PSSession). Il y a des frais généraux impliqués dans cette configuration et cette suppression, et donc PowerShell offre également la possibilité de créer une connexion persistante-appelée PSSession. Vous exécutez New-PSSession pour créer une nouvelle session persistante., Ensuite, plutôt que d’utiliser-ComputerName avec Enter-PSSession ou Invoke-Command, vous utilisez leur paramètre-Session et passez un objet PSSession existant et ouvert. Cela permet aux commandes de réutiliser la connexion persistante que vous aviez précédemment créée.
lorsque vous utilisez le paramètre-ComputerName et que vous travaillez avec des sessions ad hoc, chaque fois que vous envoyez une commande à une machine distante, il y a un retard important causé par la surcharge nécessaire pour créer une nouvelle session. Étant donné que chaque appel à Enter-PSSession ou Invoke-Command Configure une nouvelle session, vous ne pouvez pas non plus conserver l’état., Dans l’exemple ci-dessous, la variable test test est perdue lors du deuxième appel:
lorsque vous utilisez des sessions persistantes, en revanche, les re-connexions sont beaucoup plus rapides, et puisque vous conservez et réutilisez des sessions, elles préserveront l’état., Donc ici, le deuxième appel à Invoke-Command pourra toujours accéder à la variable test test qui a été configurée lors du premier appel
diverses autres commandes existent pour vérifier l’état de la session et récupérer les sessions (Get-PSSession), les fermer (Remove-PSSession), les déconnecter et les reconnecter (Disconnect-PSSession et Reconnect-PSSession, qui sont nouveaux dans PowerShell v3), et ainsi de suite., Dans PowerShell v3, vous pouvez également passer une session ouverte à Get-Module et Import-Module, vous permettant de voir les modules répertoriés sur un ordinateur distant (via la PSSession ouverte), ou d’importer un module d’un ordinateur distant dans votre ordinateur pour une mise à distance implicite. Consultez l’aide sur ces commandes pour en savoir plus.
Remarque: Une fois que vous utilisez New-PSSession et créez vos propres sessions persistantes, il est de votre responsabilité de faire le ménage et de fermer et de disposer la session lorsque vous en avez terminé., Jusqu’à ce que vous fassiez cela, les sessions persistantes restent actives, consomment des ressources et peuvent empêcher d’autres personnes de se connecter. Par défaut, seules 10 connexions simultanées à une machine distante sont autorisées. Si vous gardez trop de sessions actives, vous rencontrerez facilement des limites de ressources. Cette ligne montre ce qui se passe si vous essayez de configurer trop de sessions simultanées:
PS> 1..10 | Foreach-Object { New-PSSession -ComputerName CLIENT1 }
Remoting renvoie des données désérialisées
les résultats que vous recevez d’un ordinateur distant ont été sérialisés en XML, puis désérialisés sur votre ordinateur., En substance, les objets placés dans le pipeline de votre shell sont des instantanés statiques et détachés de ce qui se trouvait sur l’ordinateur distant au moment de la fin de votre commande. Ces objets désérialisés n’ont pas les méthodes des objets originaux et n’offrent à la place que des propriétés statiques.
Si vous devez accéder à des méthodes ou modifier des propriétés, ou en d’autres termes si vous devez travailler avec les objets en direct, assurez-vous simplement de le faire du côté distant, avant que les objets ne soient sérialisés et ne reviennent à l’appelant., Cet exemple utilise des méthodes objet du côté distant pour déterminer les propriétaires de processus, ce qui fonctionne très bien:
Une fois que les résultats vous reviennent, vous ne pouvez plus invoquer de méthodes objet car vous travaillez maintenant avec des objets « réhydratés » qui sont détachés des objets vivants et ne contiennent plus de méthodes:
la sérialisation et la Vous pouvez optimiser la vitesse et les ressources en vous assurant que votre code distant n’émet que les données dont vous avez vraiment besoin., Vous pouvez par exemple utiliser Select-Object et choisir soigneusement les propriétés que vous souhaitez récupérer plutôt que de tout sérialiser et désérialiser.
Enter-PSSession vs. Invoke-Command
beaucoup de nouveaux arrivants seront un peu confus au sujet de la télécommande, en partie à cause de la façon dont PowerShell exécute les scripts. Considérez ce qui suit et supposons que SERVER2 contient un script nommé C:\RemoteTest.,ps1:
Enter-PSSession -ComputerName SERVER2C:\RemoteTest.ps1
Si vous deviez vous asseoir et taper ces commandes de manière interactive dans la fenêtre de la console de votre ordinateur client, cela fonctionnerait (en supposant que la mise à distance était configurée, que vous aviez des autorisations, et tout cela). Cependant, si vous les avez collés dans un script et que vous l’avez exécuté, cela ne fonctionnerait pas. Le script essaierait de s’exécuter C:\RemoteTest.ps1 sur votre ordinateur local.
le résultat pratique de ceci est que Enter-PSSession est vraiment destiné à une utilisation interactive par un être humain, pas à une utilisation par lots par un script., Si vous souhaitez envoyer une commande à un ordinateur distant, à partir d’un script, Invoke-Command est la bonne façon de le faire. Vous pouvez soit configurer une session à l’avance (utile si vous prévoyez d’envoyer plus d’une commande), ou vous pouvez utiliser un nom de l’ordinateur si vous souhaitez envoyer une commande unique. Par exemple:
$session = New-PSSession -ComputerName SERVER2Invoke-Command -session $session -ScriptBlock { C:\RemoteTest.ps1 }
Évidemment, vous aurez besoin d’utiliser une certaine prudence. Si ce sont les deux seules lignes du script, alors lorsque le script a terminé son exécution, session session cesserait d’exister., Cela pourrait vous déconnecter (dans un sens) de la session en cours d’exécution sur SERVER2. Ce que vous faites, et même si vous devez vous en soucier, dépend beaucoup de ce que vous faites et de la façon dont vous le faites. Dans cet exemple, tout irait probablement bien, car Invoke-Command « garderait » le script local en cours d’exécution jusqu’à ce que le script distant soit terminé et renvoie sa sortie (le cas échéant).