Windows PowerShell : plonger profond dans l'accès distant

Accès distant est un les plus puissantes de Windows PowerShell, il est également intéressant d'examiner dans un niveau plus profond.

Don Jones

Accès distant est une des fonctionnalités plus utiles et plus remarquables de Windows PowerShell. Ce mois-ci, étudions filon remoting et comment il fonctionne et prendre en compte de certains autres façons de rendre un outil de production efficace et précieux.

Atteindre l'accès distant

Tout d'abord, gardez à l'esprit que vous aurez besoin pour activer l'accès distant sur n'importe quel ordinateur que vous souhaitez à distance dans. Pour ce faire, exécutez Enable-PSRemoting sur l'ordinateur cible, soit configurer l'accès distant via la stratégie de groupe. Vous pouvez exécuter about_remote_troubleshooting de l'aide de n'importe quelle copie de Windows PowerShell version 2 pour obtenir des instructions.

Accès distant requiert que vous installiez Windows PowerShell version 2. Vous pouvez télécharger l'interpréteur de commandes à partir de la Site Web de Microsoft pour n'importe quelle version de Windows vers Windows XP. Utiliser l'accès distant s'ouvre également un port TCP sur les ordinateurs sur lesquels elle est activée. Si vous utilisez le pare-feu Windows, l'applet de commande Enable-PSRemoting va créer automatiquement la connexion de pare-feu nécessaires.

Un à un accès distant

Il est plus simple d'utiliser l'accès distant comme un shell interactif, beaucoup comme SSH (Secure Shell) sur les systèmes Unix ou Linux. Exécutez –computernameserver PSSession d'entrée, où serveur représente le nom de l'ordinateur distant.

Vous n'avez pas besoin d'utiliser le nom d'ordinateur réel, et non un alias ou une adresse IP. Cela sera « simplement fonctionner » dans un environnement de domaine une fois l'accès distant est activé, l'utilisation de Kerberos pour authentifier mutuellement vous et l'ordinateur distant. Dans un environnement sans domaine, le about_remote_troubleshooting rubrique d'aide de shell a des instructions de configuration des ordinateurs.

Notez que vos informations d'identification sont déléguées à l'ordinateur distant. Les commandes que vous exécutez sur il seront exécute sous vos informations d'identification, pas un compte système tout puissants. Vous ne peut pas déléguer vos informations d'identification sur les tronçons supplémentaires, toutefois, afin que vous ne pouvez pas généralement à distance à un autre ordinateur pendant que vous ouvrir l'invite du shell distant. Pour fermer la connexion et revenir à votre ordinateur, exécutez PSSession à la sortie.

Accès à distance un-à-plusieurs

La véritable puissance de l'accès distant est la possibilité d'envoyer une commande, en parallèle, pour un ou plusieurs ordinateurs distants. Chaque ordinateur distant exécute la commande, sérialise les objets obtenus en XML et transmet les résultats de votre ordinateur sur le réseau.

Votre ordinateur reçoit les données XML et il désérialise en objets statiques. Cela vous permet de travailler avec la sortie de commande de quasiment la même manière que toute autre sortie de commande.

Tout commence avec l'applet de commande Invoke-Command. Dans sa forme la plus simple, vous spécifiez simplement une commande à exécuter, dans la forme d'un scriptblock et un ou plusieurs ordinateurs sur lequel vous souhaitez exécuter cette commande. Par exemple, pour lire une liste de noms d'ordinateur à partir d'un fichier texte (un nom par ligne) et exécuter une commande sur chacun d'eux, utilisez :

–Scriptblock de commande Invoke {Get-EventLog sécurité –newest 200}

–ComputerName (get-Content computernames.txt)

Lorsque les résultats sont fournis votre ordinateur, ils devront supplémentaires reliée de propriété appelée PSComputerName. Cela vous permet de voir les résultats proviennent d'ordinateur sur lequel. Ceci est utile, car ils peut-être pas tous reçus dans le même ordre.

Vous pouvez utiliser cette propriété pour trier, grouper, filtrer ou manipuler la sortie une fois qu'il est reçu sur votre ordinateur. Essayez d'éviter le tri lorsque vous disposez d'une tonne de données reviennent, parce que l'applet de commande Sort-Object a mettre en cache toute la sortie en mémoire afin d'effectuer un tri.

Invoke-Command prend également en charge un paramètre –FilePath. Vous pouvez utiliser ce paramètre au lieu de –ScriptBlock pour spécifier un script à exécuter, plutôt que la simple exécution d'une commande ou les deux. Il existe également des paramètres qui permettent de spécifier des informations d'identification différentes, ou substituer les valeurs par défaut :

  • –Credential vous permet de vous spécifiez un nom d'utilisateur et le mot de passe vous serez invité. Cette information d'identification va se connecter aux ordinateurs distants et exécutez la commande ou le script. Vous pouvez également fournir un objet Credential créé avec la commande Get-Credential.
  • –Port vous permet de spécifier un port autre que celle par défaut. Utilisez cette option si vous avez configuré le service de gestion à distance de Windows (WinRM) sous-jacent à l'écoute sur un autre port.
  • UseSSL oblige la connexion est crypté et utilise un port TCP différent (similaire à la manière dont HTTPS utilise un autre port HTTP non crypté).
  • –ThrottleLimit vous permet de modifier le nombre d'ordinateurs contacté en parallèle à partir de la valeur par défaut de 32. Cette valeur par défaut a été testé avec succès dans des environnements très volumineux et déclencher sera consomment plus de processeur et de mémoire sur votre ordinateur, par conséquent, soyez prudent lorsque vous utilisez ce paramètre.

L'obtention d'entrée de commandes à distance

Il existe deux paramètres supplémentaires de Invoke-Command sont souvent négligés. Le premier est –ArgumentList, où vous ne pouvez utiliser conjointement avec –ScriptBlock (et non avec –FilePath). Le paramètre –ArgumentList est conçu pour transmettre des variables locales de votre ordinateur dans la ligne de commande envoyée aux ordinateurs distants.

Dans le bloc de script, vous définissez un bloc de paramètres qui déclare les variables à utiliser sur les ordinateurs distants. La liste d'arguments est ensuite passée à ces variables. Voici un exemple :

–Scriptblock de –computername de commande Invoke SERVER1 {Get-EventLog de param($one,$two) –logname un –newest $deux} –ArgumentList $log, quantité de $

Ici, le script transmet le contenu de la variable locale variable $ se connecter à la variable $ et utilisez-le pour définir le nom du journal récupéré. Il va passer de la quantité de $ de variable locale dans la variable deux $ et qui permet de définir le nombre d'entrées de journal des événements récupérés. Le passage à des arguments est fait purement par ordonnance : journal de $ va dans $un parce qu'ils sont tous deux répertoriés tout d'abord, et quantité de $ va dans $deux parce qu'ils sont tous deux répertoriés deuxième.

Le paramètre –InputObject est un autre moyen de fournir une entrée pour les ordinateurs distants et travaille avec –ScriptBlock et –FilePath. Selon les objets sont spécifiées pour le paramètre –InputObject sont passés à la commande à distance ou d'un script dans la variable d'entrée spécial de $.

L'obtention de la sortie à partir de commandes à distance

En supposant que vous exécutez une seule, commande simples telles que Get-EventLog, vous allez obtenir ce résultat de la commande à partir de Invoke-Command. Par exemple, si vous souhaitez dump tout le contenu dans un fichier XML pour une version ultérieure, utilisez :

–Computername commande invoquer un, deux, trois –scriptblock {Get-EventLog sécurité –newest 100} | Results.xml d'exportation CliXML

Si vous exécutez un script entier sur l'ordinateur distant, puis votre script doit générer des objets —, de préférence, un seul type d'objet — en conséquence. Par exemple, le script suivant est conçu pour être envoyés aux ordinateurs distants via le paramètre –FilePath de Invoke-Command. Notez comment il crée un nouvel objet et combine des informations à partir de deux objets locaux. L'objet personnalisé combinée est sortie dans le pipeline, qui est transmis à l'ordinateur qui s'exécutaient Invoke-Command :

système d'exploitation $ = –class Get-WmiObject Win32_OperatingSystem

bios de $ = –class Get-WmiObject Win32_BIOS

$obj = New-Object –TypeNamePSObject

$obj | Ajouter un membre NotePropertyOSVersion $os.caption

$obj | Ajouter un membre NotePropertyBIOSSerial $bios.serialnumber

Obj de $ Write-Output

La propriété PSComputerName sera automatiquement ajoutée, afin que vous serez toujours en mesure de savoir quels résultats fournie à partir de l'ordinateur sur lequel. Sortie d'un seul type d'objet de cette manière fournit la meilleure compatibilité avec le reste des fonctionnalités du noyau et est la solution « pratiques recommandées » de l'envoi de la sortie à partir d'un script appelé à distance.

Joshua Hoffman

Don Jones est un destinataire de la récompense MVP de Microsoft et auteur d'au "Découvrez Windows PowerShell dans un mois de déjeuner » (Manning Publications Co., 2010), un livre conçu pour aider à n'importe quel administrateur de devenir efficace avec Windows PowerShell. Jones propose également des formations de Windows PowerShell publics et sur site. Vous pouvez le contacter sur son site Web à ConcentratedTech.com.

Contenu associé