none
Try Catch in einer Foreach schleife läuft immer wieder in ERROR. RRS feed

  • Frage

  • Hallo Zusammen,

    Was ich mache, einfach zusammengefasst: Ich Frage Nutzer aus einem AD ab und möchte in einer Foreach Schleife die Postfächer jedes Benutzers und dann wiederum mit einem Foreach die Berechtigung der darin erhaltenen Ordner abfragen. 

    Plan: Einige Nutzer besitzen kein Postfach und ich möchte diese Nutzer per TryCatch abfangen und eine Meldung darüber in einem Log hinterlegen. 

    Problem: Das TryCatch wird einfach übergangen und der Script läuft trotzdem in einen Fehler. (Ich darf leider noch keine Bilder einfügen)

    Für das Postfach Username konnte keine Postfachordnerstatistik abgerufen werden. Fehler: 'Username' nicht als Empfänger gefunden.
        + CategoryInfo          : ReadError: (:) [Get-MailboxFolderStatistics], MailboxFolderStatisticsException
        + FullyQualifiedErrorId : [Server=Server,RequestId=XYZ,TimeStamp=03.06.2020 08:53:31] [FailureCategory=Cmdlet-MailboxFolderSt 
       atisticsException] 3F4A62CB,Microsoft.Exchange.Management.Tasks.GetMailboxFolderStatistics
        + PSComputerName        : Server

    Betroffener Codeabschnitt:

    $users = "Username" Foreach ($user in $users) { Try{$verfuegbareOrdner = (Get-MailboxFolderStatistics $user | select FolderPath)} catch{ Write-Host "Gibt es nicht, muss ins Log" continue }

    [.. Noch eine ganze Menge Code der damit denke ich nichts zu tun hat und reibungslos funktioniert ..] }

    Vielleicht hat von euch einer eine Idee warum das so ist. Sollten noch mehr Infos nötig sein, liefere ich diese gerne nach.

    Vielen Danks schon mal.

    Gruß Simon


    • Bearbeitet Simon.K Mittwoch, 3. Juni 2020 09:00
    Mittwoch, 3. Juni 2020 09:00

Antworten

  • Moin,

    verwende mal mit dem Get-MailboxFolderStatistics cmdlet den Parameter -ErrorAction Stop


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Mittwoch, 3. Juni 2020 09:08
  • Hallo Simon und Willkommen im Deutschen Powershell Forum.

    Damit ein try-catch-Block erwartungsgemäß funktioniert, muss im try-Block ein sogenannter terminating error auftreten. Sollten die cmdlets, die Du im try-Block verwendest nicht sowieso einen solchen Fehler auslösen, musst Du sie mit dem Parameter -ErrorAction Stop dazu überreden. ;-)

    Also so ungefähr:

    $users = "Username"
    Foreach ($user in $users) {
        Try {
            $verfuegbareOrdner = Get-MailboxFolderStatistics $user -ErrorAction Stop
        } 
        catch {
            Write-Host "Gibt es nicht, muss ins Log"
            continue
        }
        #.. Noch eine ganze Menge Code der damit denke ich nichts zu tun hat und reibungslos funktioniert ..]
    }
    Edit: ... gerade getestet - funktioniert wie erwartet. (Exchange Server 2019)

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 3. Juni 2020 09:16

Alle Antworten

  • Moin,

    verwende mal mit dem Get-MailboxFolderStatistics cmdlet den Parameter -ErrorAction Stop


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Mittwoch, 3. Juni 2020 09:08
  • Hallo Simon und Willkommen im Deutschen Powershell Forum.

    Damit ein try-catch-Block erwartungsgemäß funktioniert, muss im try-Block ein sogenannter terminating error auftreten. Sollten die cmdlets, die Du im try-Block verwendest nicht sowieso einen solchen Fehler auslösen, musst Du sie mit dem Parameter -ErrorAction Stop dazu überreden. ;-)

    Also so ungefähr:

    $users = "Username"
    Foreach ($user in $users) {
        Try {
            $verfuegbareOrdner = Get-MailboxFolderStatistics $user -ErrorAction Stop
        } 
        catch {
            Write-Host "Gibt es nicht, muss ins Log"
            continue
        }
        #.. Noch eine ganze Menge Code der damit denke ich nichts zu tun hat und reibungslos funktioniert ..]
    }
    Edit: ... gerade getestet - funktioniert wie erwartet. (Exchange Server 2019)

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 3. Juni 2020 09:16
  • Hallo Evgenij,

    der Script läuft leider immer noch in den selben Error..

    Foreach ($user in $users)
    {
        Try{$verfuegbareOrdner = (Get-MailboxFolderStatistics $user -ErrorAction Stop | select FolderPath)} 
        catch{
        Write-Host "War wohl nix"
        continue
        }


    Mittwoch, 3. Juni 2020 09:23
  • Hallo Simon und Willkommen im Deutschen Powershell Forum.

    Damit ein try-catch-Block erwartungsgemäß funktioniert, muss im try-Block ein sogenannter terminating error auftreten. Sollten die cmdlets, die Du im try-Block verwendest nicht sowieso einen solchen Fehler auslösen, musst Du sie mit dem Parameter -ErrorAction Stop dazu überreden. ;-)

    Also so ungefähr:

    $users = "Username"
    Foreach ($user in $users) {
        Try {
            $verfuegbareOrdner = Get-MailboxFolderStatistics $user -ErrorAction Stop
        } 
        catch {
            Write-Host "Gibt es nicht, muss ins Log"
            continue
        }
        #.. Noch eine ganze Menge Code der damit denke ich nichts zu tun hat und reibungslos funktioniert ..]
    }
    Edit: ... gerade getestet - funktioniert wie erwartet. (Exchange Server 2019)

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Leider laufe ich nach wie vor in den selben Fehler, auch mit der ErrorAction. Die PowerShell ISE schlägt mir die ErrorAction auch nicht vor (Das sehe ich meist eher als schlechtes Zeichen ^^)

    Edit: Kann es denn noch an dem Umgeben Script liegen? Wenn ja könnte ich den mal ganz reinstellen... 

    Edit 2: Wir nutzen aktuell noch einen Exchange 2013
    • Bearbeitet Simon.K Mittwoch, 3. Juni 2020 09:53
    Mittwoch, 3. Juni 2020 09:50
  • Edit: Kann es denn noch an dem Umgeben Script liegen?

    Davon würde ich im Moment erstmal ausgehen.

    Wenn ja könnte ich den mal ganz reinstellen...

    Das ist Deine Entscheidung. Vielleicht genügt es ja auch, den Code etwas weniger zu kürzen und den relevanten Teil nahezu unverändert zu posten. Ich empfehle aber, sensible Informationen zu entfernen/maskieren. Je nach dem wie groß Dein Script ist, wäre es eventuell sinnvoll, es in kleinere Einheiten aufzuteilen. Die sind dann vermutlich leichter zu debuggen/pflegen.

    Hast Du denn den kleinen Schnipsel mal so einzeln getestet?


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Bearbeitet BOfH-666 Mittwoch, 3. Juni 2020 10:36
    Mittwoch, 3. Juni 2020 10:36
  • Hast Du denn den kleinen Schnipsel mal so einzeln getestet?

    Habe ich über die Exchange Powershell.. ging auch im einzelnen nicht. Ich habe auch den "ungefähr" Code von dir oben getestet. Bei beiden ist das Ergebnis das selbe, der Error von meiner ersten nachricht. 

    Ich denke also nicht das es an meinem Script liegt.. (Für mich) Logisch bleibt nur noch das Exchange 2013 mit dieser Konstellation ein Problem hat oder etwas in die Richtung.

    Du hast das auch genau so wie oben geschrieben getestet oder? Auch mit der Variable $verfuegbareOrdner und der Pipe usw...

    Mittwoch, 3. Juni 2020 11:23
  •  (Für mich) Logisch bleibt nur noch das Exchange 2013 mit dieser Konstellation ein Problem hat oder etwas in die Richtung.

    Bestimmt nicht. Du musst mal schauen, was Du dem Cmdlet übergibst. Es erwartet einen Ordner im Format <mailbox>\<ordnername> und damit hast Du ein Parameter Binding-Problem, das Du erst mal lösen musst.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Mittwoch, 3. Juni 2020 12:09
  • Du musst mal schauen, was Du dem Cmdlet übergibst.

    Deshalb hatte ich in meinem Code-Schnipsel-Beispiel das Select weggelassen und gefragt, ob Du diesen Schnipsel so getestet hattest - der hat bei mir so funktioniert.

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 3. Juni 2020 13:16
  • Das Problem liegt wohl nicht an dem Script an sich sondern an der Tatsache das ich ihn über eine Remote Session ausgeführt habe. Führe ich den Code auf dem Exchange selber aus geht er. 

    Jetzt muss ich nur noch herausfinden wie ich die Remote Shell überlisten kann. 

    Vielen Dank euch beiden. Die -ErrorAction war eine große Hilfe,, sonst wäre ich auf dem Exchange auch gescheitert :) 

    Mittwoch, 3. Juni 2020 13:22
  • Es gibt keine lokale Ausführung von Exchange-Cmdlets. Auch innerhalb eines Servers ist es eine Remoting-Session.

    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert Simon.K Mittwoch, 3. Juni 2020 13:29
    • Tag als Antwort aufgehoben Simon.K Mittwoch, 3. Juni 2020 13:29
    Mittwoch, 3. Juni 2020 13:27
  • ... sondern an der Tatsache das ich ihn über eine Remote Session ausgeführt habe.  

    Das habe ich auch ... das ist nicht das Problem ... 

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 3. Juni 2020 13:30
  • Es gibt keine lokale Ausführung von Exchange-Cmdlets. Auch innerhalb eines Servers ist es eine Remoting-Session.

    Ok, wie kann es dann kommen, dass das selbe Stück Script auf dem Exchange Server ausgeführt funktioniert und auf meiner Maschine per Remote nicht?

    Mittwoch, 3. Juni 2020 13:31
  • So wird es nun auch von meiner Remotesession aus richtig ausgeführt: 

    Try{
        $Global:ErrorActionPreference = 'Stop'
        $verfuegbareOrdner = Get-MailboxFolderStatistics $user -ErrorAction Stop  | select FolderPath } 
        catch{
        Write-Host "War wohl nix"
        continue
        }


    Mittwoch, 3. Juni 2020 13:44