Bereinigung alter Termine via Powershell

  • Hallo Forum,


    ich bin gerade dabei, vor einer geplanten Migration von Exchange 2007 auf Exchange 2013 ein wenig aufzuräumen. Genauer möchte ich alte Kalendereinträge tilgen, deren Alter 300 Tage übersteigt. Die Retention-Regeln möchte ich bewusst nicht nutzen, da die noch nie aktiviert wurden und ich mir mögliche Sideeffects sparen möchte. Ich habe mir also folgendes zusammengetippt:


    Code
    Get-Mailbox | Where-Object{$_.OrganizationalUnit -like ‘*Mitarbeiter*’} | Export-Mailbox -PSTfolderPath "c:\pstfiles" -EndDate (Get-Date).AddDays(-300) -IncludeFolders “\Kalender” -DeleteContent

    Das funktioniert auch prächtig, alte Termine werden gelöscht und vorher in eine pst archiviert. Leider werden dabei aber auch Serientermine mit gekillt, die mitunter aber noch Gültigkeit haben. Wahrscheinlich deshalb, weil der ursprüngliche Termin eben vor 300 Tagen erstellt wurde. Hat einer von euch eine Idee, wie man Serientermine generell ausklammern kann?

  • Hallo schimmi,


    das geht mittels Powershell und EWS. Nach der Installation von Exchange Web Services kannst du die WebservicesAssembly laden und einen Haufen Unfug anstellen ;)


    Ich habe hier mal Beispielhaft ein Termin für dich gelöscht:


    Das Skript lädt aus den letzten 300 Tagen max 2000 Termine. -> $frCalendarResult
    $testmeeting ist das letzte welches keine Serie hat ($_.isRecurring -eq $false)


    Glan Scales hat ziemlich viel zu EWS und Powershell in seinem Blog -> hier zeigt er, wie man sich Termine anzeigen lassen kann. Auf msxfaq findest du aber auch alles Nötige.


    Viel Spaß ;)

  • Hi,


    ahaaa, na den Weg über die EWS kenne ich gar nicht :) Schaut aber auf jeden Fall verständlich aus und man kann offensichtlich viel feingranularer arbeiten als mit Export-Mailbox und Filterkrücken via Pipe.


    Vielen Dank für das Beispiel und das Lenken meines Fokus' auf die EWS, ich werde es morgen mal testen und berichten.


    Grüße,
    Stefan

  • Hi nochmal,


    das funktioniert wirklich gut, Serientermine werden ausgenommen und alles ist prächtig.


    Ich muss mir nur noch etwas ausdenken, um die Beschränkung der Funktion Data.CalendarView zu umgehen, denn da gibt es offensichtlich eine Beschränkung des auswertbaren Bereichs auf max. 2 Jahre:


    Ausnahme beim Aufrufen von "FindAppointments" mit 1 Argument(en): "Der angegebene Anzeigebereich überschreitet den maximal zulässigen Bereich von zwei Jahren."


    Aber als dirty fix kann man das ja mehrstufig ausführen :)


    Nochmal herzlichen Dank!

  • Hi Stefan,


    schön,dass es klappt...


    Ich habe hier kein 2007er zum Testen. Gegen den 2010 kann ich


    Code
    $cvCalendarview = new-object Microsoft.Exchange.WebServices.Data.CalendarView($StartDate,$EndDate,2000)

    bei $startdate = [System.DateTime]::Now.AddDays(-700) abfragen ohne Fehlermeldung.


    Aber ja, auch ich habe schon öfter gemerkt, dass Begrenzungen eingebaut sind. (bspw. in öffentlichen Ordnern kann man sich nur 1000 Elemente geben lassen)
    Wie du aber schon sagtest, kann man dann einfach mehrere Views bauen.


    Viel Spaß beim Putzen ;)

  • Ja, 700 ist der Maximalwert. Das sind dann auch in etwa 2 Jahre :)


    Falls das im Übrigen jemand mal nachbauen möchte, der Löschteil muss bei mehr als einem zu löschenden Element umgebaut werden, da der Ergebnissatz von einem Termin zu einem "Terminarray" mutiert.


    Code
    [...]
    
    
    $testmeeting = $frCalendarResult | Where-Object {$_.isRecurring -eq $false}
    
    
    foreach($Result in $testmeeting){
            $Result.Delete('HardDelete','SendToNone')
    }