2016-04-24 6 views
1

誰かがこれで私を助けてくれることができますか?リモートサーバーの一覧からアプリケーションプールを取得できません。ルーピングは動作しません

以下は、リモートマシンからアプリケーションプールの詳細を取得するために取り組んでいるpsスクリプトです。

同じマシンで試してみるか、スクリプトを1行ずつ実行すると動作します。

スクリプトファイルとして実行すると動作しません。次に、スクリプトが出力されているサーバのアプリケーションプールの詳細を表示します。

エコーがホスト名とループを正しく示しています。しかし、なぜスクリプトがループしているのかわからない。

を見て、私はさらにこれをしようとする方法を教えてください...


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

読む-ホスト


答えて

1

Enter-PSSession "を押して入力し、" 作成にのみ使用されていますインタラクティブセッション。スクリプトで期待したとおりに動作しません。スクリプトは、起動したセッション(この場合はローカルマシン)でのみ実行されます。

リモートでコマンドを実行する方法は、Invoke-Commandです。あなたはNew-PSSessionEnter-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は1つのコマンドだけではなくスクリプトブロックを取ります。したがって、すべてのコマンドを1つのブロックに入れて、コンピュータごとに1度だけ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を実行します。

+0

ちょっと@ライアン、私はこれに少し追加しなければなりませんでした。 '$ノードは=のGet-コンテンツ "C:\ PowerShellの\て、Servers.txt"' 'foreachの($ノードで$ノード){' 'Invoke-Commandコマンド - コンピュータ$ノード{' 'セットExecutionPolicy Remotesigned '' インポートモジュールWebAdministration' '$ webappsに=のGet-WebApplication' ' $一覧= @() '' 等... ' '} ' '} ' これとは別に、それはのように働きましたチャーム! 2k8マシンからinvoke-commandが機能しないリストに2k12台のサーバがあります。それについてのアイデアは? Set-ExecutionPolicy RemoteSigned – Ashfaq

関連する問題