2010-02-03 13 views
3

Voici un exemple de script qui tente de créer une session à distance sur un serveur, puis utilise WMI pour obtenir une liste des pools d'applications IIS du serveur et répertorie leurs noms:Sessions PowerShell Remote et question d'étendue: Les commandes semblent s'exécuter localement

function Test-Remoting 
    { 
     [CmdletBinding()] 
     param 
     ( 
     ) 
     begin 
     { 
      Enter-PSSession TestServer 
      $appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6 
      $appPools | ForEach-Object { 
       $appPool = $_; 
       $appPool.Name 
      } 
      Exit-PSSession 
     }  
    } 

Cette fonction est contenue dans un fichier appelé "Test-Remoting.ps1". J'ouvre PowerShell, CD dans le répertoire contenant ce fichier, point source du fichier et appeler la fonction:

PS C:\Users\moskie> . .\Test-Remoting.ps1 
PS C:\Users\moskie> Test-Remoting 

Mais le résultat de ce script est une liste des pools d'applications sur mon locale machine, et pas TestServer.

Sinon, si je lance les lignes suivantes (identiques à ceux de la fonction) manuellement à l'invite PowerShell, je faire obtenir la liste des pools d'applications sur le serveur distant:

PS C:\Users\moskie> Enter-PSSession TestServer 
[TestServer]: PS C:\> $appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6 
[TestServer]: PS C:\> $appPools | ForEach-Object { $appPool = $_; $appPools.Name } 
<a list of the names of the application pools on TestServer> 
[TestServer]: PS C:\> 

I pense qu'il y a un concept que je suis inconscient, en ce qui concerne PowerShell remoting et la portée. Quelqu'un peut-il aider à expliquer ce comportement?

Répondre

5

Je crois que Enter/Exit-PSSession signifie une utilisation plus interactive. De l'aide Enter-PSSession:

SYNOPSIS 
    Starts an interactive session with a remote computer. 

Dans un script, utilisez New-PSSession et Invoke-Command comme ceci:

$session = New-PSSession server01 
Invoke-Command -Session $session {hostname} 
Remove-PSSession -Session $session 

Mise à jour: Pour exécuter un script complet utiliser à distance le paramètre FilePath sur Invoke-Command:

icm server01 -FilePath C:\users\keith\myscript.ps1 -arg 1,2 

Cela va copier le script à l'server01 de l'ordinateur distant et l'exécuter là avec le paramètre fourni s.

+0

Je vais tenter le coup, mais j'aimerais éviter une telle solution, car le script que je cherche à exécuter est très impliqué. Ce serait une douleur d'avoir à exécuter chaque commande à travers Invoke-Command. Utiliser Entrée/Sortie-PSSession serait le plus pratique, parce que je devrais juste entourer mon script avec ces commandes. – Moskie

+0

S'il s'agit d'un script, vous pouvez le faire 'Invoke-Command -FilePath myscript.ps1' et PowerShell va déplacer le fichier vers la machine distante et l'exécuter ici. –

+0

Merci, j'ai fini par suivre cette route, donc je vais marquer le vôtre comme la réponse. Mais cette notion de session "interactive" est un peu nébuleuse ... il me semblerait logique que quand j'ai un script exécuter une commande pour entrer une nouvelle session, que les commandes qui la suivent soient exécutées dans cette nouvelle session . Devinez pas ... merci encore! – Moskie