2016-04-24 16 views
1

Kann mir bitte jemand dabei helfen.!?Das Abrufen von Anwendungspools aus der Liste der Remote-Server ist nicht möglich. Looping funktioniert nicht

Im Folgenden ist das ps-Skript, mit dem ich arbeite, um Anwendungspooldetails von einem Remotecomputer abzurufen.

Es funktioniert, wenn es auf der gleichen Maschine versucht wird oder wenn das Skript zeilenweise ausgeführt wird.

Es funktioniert nicht, wenn es als Skriptdatei ausgeführt wird. Anschließend werden die Anwendungspooldetails des Servers angezeigt, von dem aus das Skript in seiner gesamten Ausgabe ausgeführt wird.

Das Echo zeigt Hostnamen und seine Schleifen korrekt an. Aber ich bin mir nicht sicher, warum das Skript nicht looping ist.

Bitte schauen Sie und lassen Sie mich wissen, wie dies weiter zu versuchen ...


$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 "Press Enter"


Antwort

1

Enter-PSSession nur dient zum Erstellen eine interaktive Sitzung. Es funktioniert nicht so, wie Sie es in einem Skript erwarten. Ein Skript wird nur in der Sitzung ausgeführt, in der Sie es gestartet haben, in diesem Fall auf dem lokalen Computer.

Die Art und Weise, Befehle remote auszuführen, ist mit Invoke-Command. Sie können Ihr Skript zu ändern Enter-PSSession zu New-PSSession, und führen Sie jeden Befehl mit Invoke-Command

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

Aber das ist ineffizient ändern. Invoke-Command nimmt einen Skriptblock, nicht nur einen Befehl, so macht es Sinn, alle Befehle in einen Block zu setzen und Invoke-Command nur einmal pro Computer aufzurufen. Sobald Sie das getan haben, gibt es nicht einmal einen Grund, die Variable $session herumzuhalten. Verwenden Sie stattdessen den Parameter -ComputerName, und Invoke-Command erstellt automatisch eine temporäre PSSession.

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

Diese Methode funktioniert gut und ist extrem vielseitig, aber Sie brauchen nicht einmal manuell über die comptuers laufen, wenn Sie wollen. Übergeben Sie stattdessen das vollständige $ nodes-Array an den Parameter -ComputerName.

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

Invoke-Command die Skript auf allen Computern in der Liste geführt.

+0

Hey @Ryan, ich musste ein paar kleine Ergänzungen zu diesem machen. '$ nodes = Get-Content "C: \ Powershell \ Servers.txt"' ' foreach ($ Knoten in $ Knoten) {' ' Invoke-Command -Computer $ node {' ' Set-ExecutionPolicy RemoteSigned '' Import-Module WebAdministration' '$ webapps = Get-WebApplication' ' $ list = @() '' etc ... '' } '' } ' abgesehen davon war es wie ein Charme! Ich habe einige 2k12 Server in der Liste, in denen Invoke-Befehl von 2k8 Maschinen nicht funktioniert. Irgendeine Idee dazu? Set-ExecutionPolicy RemoteSigned – Ashfaq