PowerShell Sessions à distance et la question de la portée: Les commandes semblent fonctionner localement
-
25-09-2019 - |
Question
Voici un exemple de script qui tente de créer une session à distance sur un serveur, puis utilisez WMI pour obtenir une liste des pools d'applications IIS du serveur, et la liste de leurs noms:
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 contenu 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.
Par ailleurs, si je lance les lignes suivantes (identiques à ceux de la fonction) manuellement à l'invite PowerShell, I 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:\>
Je pense qu'il ya un concept que je suis inconscient, en ce qui concerne PowerShell Remoting et la portée. Quelqu'un peut-il aider à expliquer ce comportement?
La solution
Je crois Entrée / Sortie-PSSession est destiné 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 à distance utilise le paramètre FilePath sur Invoke-Command:
icm server01 -FilePath C:\users\keith\myscript.ps1 -arg 1,2
Ceci copiera le script à l'server01 de l'ordinateur distant et l'exécuter là avec les paramètres fournis.