2 Pluspunkte 0 Minuspunkte

Ich möchte auf allen AD Computern einen Powershell Befehl ausführen.

$computers = Get-ADComputer -Filter * | where-object { $_.Name -match "-SRV-" }

foreach($computer in $computers) {

    try {
        Invoke-Command -cn $computer.Name -scriptblock -ErrorAction Stop {
    
            winrm get winrm/config

        }
    } catch { Write-Output "$($computer.Name) nicht erreichbar" }

}

Es kommt aber bei allen Servern die Fehlermeldung obwohl die Server erreichbar sind, das habe ich separat getestet.

von  

1 Antwort

1 Pluspunkt 0 Minuspunkte

In Invoke-Command werden viele Fehler als "nicht-terminierend" behandelt. Das bedeutet, dass sie nicht automatisch von catch abgefangen werden. Setze innerhalb des try Blocks

$ErrorActionPreference = 'Stop'

um "nicht-terminierende" Fehler in "terminierende" Fehler umzuwandeln.

$computers = Get-ADComputer -Filter * | Where-Object { $_.Name -match "-SRV-" }

foreach ($computer in $computers) {

    try {

        $result = Invoke-Command -ComputerName $computer.Name -ScriptBlock {

            try {
                $ErrorActionPreference = 'Stop'
                hostname
            } catch {
                Write-Output "Fehler auf $env:COMPUTERNAME: $_"
            }

        } -ErrorAction Stop

        if ($result) {
            Write-Output "$($computer.Name) erfolgreich abgefragt: $result"
        } else {
            Write-Output "$($computer.Name) hat keine Antwort geliefert."
        }

    } catch {
        Write-Output "$($computer.Name) nicht erreichbar"
    }

}
von (1.1k Punkte)