Вот пример сценария, который пытается создать удаленный сеанс на сервере, а затем использует 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, я действительно получаю список пулов приложений на удаленном сервере:
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. Кто-нибудь может помочь объяснить такое поведение?