无法从远程服务器列表中获取应用程序池。循环不起作用

时间:2016-04-24 21:28:45

标签: powershell application-pool powershell-remoting

有人可以帮我这个。!?

以下是我正在使用的ps脚本,用于从远程计算机获取应用程序池详细信息。

在同一台机器上尝试或逐行执行脚本时,它可以正常工作。

当它作为脚本文件执行时不起作用。然后,它显示了脚本在其输出中运行的服务器的应用程序池详细信息。

echo正确显示主机名及其循环。但我不确定脚本为什么不循环。

请看一下,让我知道如何进一步尝试......

$nodes = Get-Content "C:\PowerShell\Servers.txt"
foreach($node in $nodes) {
echo $node
Enter-PSSession $node
Import-Module WebAdministration
$webapps = Get-WebApplication
$list = @()
foreach ($webapp in get-childitem IIS:\AppPools\)
{
$name = "IIS:\AppPools\" + $webapp.name
$item = @{}
$item.WebAppName = $webapp.name
$item.Version = (Get-ItemProperty $name managedRuntimeVersion).Value
$item.UserIdentityType = $webapp.processModel.identityType
$item.Username = $webapp.processModel.userName
$obj = New-Object PSObject -Property $item
$list += $obj
}
$list | Format-Table -a -Property "WebAppName", "Version", "State", "UserIdentityType", "Username", "Password"
Exit-PSSession
}

Read-Host“按Enter键”

1 个答案:

答案 0 :(得分:1)

Enter-PSSession仅用于创建交互式会话。它没有按照您期望的方式在脚本中工作。脚本仅在您启动它的会话中运行,在本例中是在本地计算机上。

远程运行命令的方法是使用Invoke-Command。您可以修改脚本以将Enter-PSSession更改为New-PSSession,并使用Invoke-Command

运行每个命令
foreach ($node in $nodes) {
  $session = New-PSSession $node
  Invoke-Command -Session $session { $webapps = Get-Webapplication }
  Invoke-Command -Session $session { $list = @() }
  etc...
}

但那效率低下。 Invoke-Command采用一个脚本块而不仅仅是一个命令,因此将所有命令放入一个块并且每台计算机只调用一次Invoke-Command是有意义的。一旦你做到了,就没有任何理由保持$session变量。相反,使用-ComputerName参数,Invoke-Command将自动创建临时PSSession。

foreach ($node in $nodes) {
  Invoke-Command -Computer $node { 
    Import-Module WebAdministration
    $webapps = Get-WebApplication
    $list = @()
    etc...
  }
}

这种方法效果很好,用途非常广泛,但如果你愿意,你甚至不需要手动迭代comptuers。而是将完整的$ nodes数组传递给-ComputerName参数。

$nodes = Get-Content "C:\PowerShell\Servers.txt"
Invoke-Command -Computer $nodes { 
  Import-Module WebAdministration
  $webapps = Get-WebApplication
  $list = @()
  etc...
}

Invoke-Command将在列表中的所有计算机上运行scriptblock。