Сеансы PowerShell Remote и вопрос о области действия: По-видимому, команды запускаются локально - PullRequest
3 голосов
/ 04 февраля 2010

Вот пример сценария, который пытается создать удаленный сеанс на сервере, затем с помощью WMI получить список пулов приложений IIS сервера и перечислить их имена:

    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
        }    
    }

Эта функция содержитсяв файле с именем «Test-Remoting.ps1.»Я открываю PowerShell, компакт-диск в каталог, в котором находится этот файл, помещаю точечный источник файла и вызываю функцию:

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

Но результатом этого сценария является список пулов приложений на моем компьютере. локальный компьютер, а не TestServer.

В качестве альтернативы, если я запускаю следующие строки (идентичные функциям) вручную в командной строке PowerShell, я do получить список пулов приложений на удаленном сервере:

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:\>

Я думаю, что есть концепция, к которой я не обращаю внимания в отношении удаленного взаимодействия и области действия PowerShell.Может кто-нибудь помочь объяснить это поведение?

1 Ответ

5 голосов
/ 04 февраля 2010

Я полагаю, что Enter / Exit-PSSession предназначена для более интерактивного использования. Из справки Enter-PSSession:

SYNOPSIS
    Starts an interactive session with a remote computer.

В скрипте используйте New-PSSession и Invoke-Command следующим образом:

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

Обновление: Для удаленного выполнения полного сценария используйте параметр FilePath в Invoke-Command:

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

Это скопирует скрипт на удаленный компьютер server01 и выполнит его там с предоставленными параметрами.

...