dennis93
Goto Top

Exchange 2016 - Alte Kalendereinträge in allen Postfächern löschen

Hallo zusammen,

besteht irgendwie die Möglichkeit über ein Script automatisch alle Kalendereinträge, die älter als 90 Tage sind, in allen Mailboxen zu löschen? Eingesetzt wird aktuell ein Exchange Server 2016 Standard.

Wichtig dabei wäre, dass er bspw. bei Serien-Terminen auch nur die alten Termine löscht, und nicht dann die ganze Serie für die Zukunft mit löscht.

Über die Aufbewahrungs-Richtlinien geht das ja nur mit einer Enterprise-Lizenz, richtig?

Ich hatte überlegt, dass man das als PowerShell-Script einfach automatisch täglich laufen lässt.

Danke im Voraus für Eure Tipps und Ideen!

LG Dennis

Content-ID: 4221303405

Url: https://administrator.de/contentid/4221303405

Ausgedruckt am: 12.11.2024 um 19:11 Uhr

goscho
goscho 10.10.2022 aktualisiert um 15:29:55 Uhr
Goto Top
Hallo Dennis,

kannst du kurz erklären, was das bringen soll?
Speicherplatz schaffst du damit nicht, denn Termine sind idR so klein, das stört nicht.

Ich persönlich empfände es sogar als Nachteil, wenn alle alten Termine weg wären.
Wer die Terminverwaltung wirklich nutzt, schaut sicher auch öfter mal nach älteren Terminen.
radiogugu
radiogugu 10.10.2022 um 16:07:06 Uhr
Goto Top
Mahlzeit.

Ist ja auch immer eine Frage der Organisation und kann für Nachweise unablässlich sein.

Um Platz zu sparen wäre eher ein Mail Store sinnvoll und anschließende Bereinigung des Exchange Postfachs.

Auch die Logfiles ab und an mal ins Visier der "Verschlankung" nehmen.

Gruß
Marc
colinardo
Lösung colinardo 10.10.2022 aktualisiert um 18:38:00 Uhr
Goto Top
Servus.
Über die Aufbewahrungs-Richtlinien geht das ja nur mit einer Enterprise-Lizenz, richtig?
Eine Enterprise CAL für die Mailboxen benötigst du nur wenn du Custom-Retention-Tags nutzen willst, also eigene Aufbewahrungsrichtlinien erstellen willst. Wenn du mit den Standard-Tags auskommst brauchst du diese nicht.
https://learn.microsoft.com/en-us/exchange/policy-and-compliance/mrm/ret ...
Personal tags are a premium feature. Mailboxes with policies that contain these tags (or as a result of users adding the tags to their mailbox) require an Exchange Enterprise client access license (CAL).
Nur als Alternative für die Retention Tags, hier trotzdem noch ein Powershell-Beispiel mit den EWS (s. Kommentare im Code).
<#
    Kalendereinträge älter als 90 Tage löschen (keine Master von Serienterminen)
    (Achtung, arbeitet mit Impersonation da fremde Mailboxen abgefragt werden! User der die Abfrage durchführt muss in diesem Fall über Impersonation Berechtigungen am Exchange verfügen 
    um fremde Mailboxen abfragen zu können)
#>

# == Variablen ============================
# Termine älter als x Tage löschen 
$maxDays = 90
# =========================================

ErrorActionPreference = 'Stop'  

# Suchzeitraum festlegen (max 2 Jahre)
$endDate = (get-date).AddDays(-$maxDays)
$startDate = $endDate.AddYears(-2)

# Funktion zum (Herunter-)Laden des EWS Assemblies
function Load-EWSLibrary {
    if($psscriptroot -ne ''){  
        $localpath = join-path $psscriptroot 'Microsoft.Exchange.WebServices.dll'  
    }else{
        $localpath = join-path $env:TEMP 'Microsoft.Exchange.WebServices.dll'  
    }
    $tmp = '';$zip = $null  
    try{
        if(!(Test-Path $localpath)){
            Add-Type -A System.IO.Compression.FileSystem
            $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"  
            write-host "Downloading and extracting required 'Microsoft.Exchange.WebServices.dll' ... " -F Green -NoNewline  
            (New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/Exchange.WebServices.Managed.Api', $tmp)  
            $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
            $zip.Entries | ?{$_.Fullname -eq 'lib/net35/Microsoft.Exchange.WebServices.dll'} | %{  
                [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
            }
            Unblock-File -Path $localpath
            write-host "OK" -F Green  
        }
        Add-Type -Path $localpath
    }catch{
        write-error "Error downloading required EWS Library / Error: $($_.Exception.Message)"  
    }finally{
        if ($zip){$zip.Dispose()}
        if($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}  
    }
}

# EWS DLL laden
Load-EWSLibrary

# Abfrage der Mailboxen mit den nativen Exchange CMDLets (Installierte Exchange Management Shell erforderlich)
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
$mailboxes = Get-Mailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited | select -Expand PrimarySmtpAddress

# Alternative zur Abfrage der E-Mailadressen von aktivierten Useraccounts mit Mailbox in der Domäne aus dem AD abfragen (keine Exchange Shell erforderlich)
#$mailboxes = (new-object adsisearcher("LDAP://$(([adsi]'LDAP://rootDSE').defaultNamingContext)","(&(objectClass=User)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(msExchRecipientTypeDetails=1))","mail",'Subtree')).FindAll() | %{$_.Properties.mail}  

# EWS Objekt erstellen
$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2)
# view mit Start und Enddatum erstellen
$view = New-Object Microsoft.Exchange.WebServices.Data.CalendarView $startDate,$endDate

foreach($user in $mailboxes){
    try{
        write-host "Verarbeite Kalender von Mailbox '$user' ... " -F Green  
        # User Impersonation 
        $service.AutoDiscoverUrl($user)
        $service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $user)
        # termine suchen (evt. SerienMaster ignorieren)
        $result = $service.FindAppointments([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$view).Items | ?{$_.AppointmentType -ne 'RecurringMaster'}  
        if ($result){
            write-host "Lösche $($result.Count) Termin(e):" -F Cyan  
            # Gefundene Items im Kalender löschen
            foreach($item in $result){
                $item | select Subject,Start,End
                $item.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete)
            }
        }else{
            write-host "Keine zutreffenden Termine gefunden." -F Gray  
        }
    }catch{
        write-host "ERROR : $($_.Exception.Message)" -F Red  
    }
}
Grüße Uwe
Dennis93
Dennis93 12.10.2022 um 15:47:38 Uhr
Goto Top
Zitat von @goscho:

Hallo Dennis,

kannst du kurz erklären, was das bringen soll?
Speicherplatz schaffst du damit nicht, denn Termine sind idR so klein, das stört nicht.
--> das schafft schon Speicherplatz, wenn in dem Termin bspw. PDF-Pläne als Anhang sind. Ob das sinnvoll ist oder nicht, darüber brauchen wir nicht reden. Der Kunde macht das aber "schon immer so", und wird das nicht ändern.

Ich persönlich empfände es sogar als Nachteil, wenn alle alten Termine weg wären.
Wer die Terminverwaltung wirklich nutzt, schaut sicher auch öfter mal nach älteren Terminen.
--> auch das ist "historisch gewachsen" schon immer so gemacht worden, soll auch weiterhin so geschehen.
Dennis93
Dennis93 12.10.2022 um 15:48:46 Uhr
Goto Top
Zitat von @radiogugu:

Mahlzeit.

Ist ja auch immer eine Frage der Organisation und kann für Nachweise unablässlich sein.
--> eMails werden ja archiviert, es geht explizit um die Kalender-Einträge.

Um Platz zu sparen wäre eher ein Mail Store sinnvoll und anschließende Bereinigung des Exchange Postfachs.

Auch die Logfiles ab und an mal ins Visier der "Verschlankung" nehmen.

Gruß
Marc
--> siehe hier meine Antwort oben schon, wenn dort größere PDF-Pläne an dem Termin als Anhang zur Info dabei sind o.Ä. schafft das schon Platz.
Dennis93
Dennis93 12.10.2022 um 15:49:39 Uhr
Goto Top
Nur als Alternative für die Retention Tags, hier trotzdem noch ein Powershell-Beispiel mit den EWS (s. Kommentare im Code).
Grüße Uwe

Das ist top! Genau das hab ich gesucht und funktioniert einwandfrei, vielen Dank Uwe! face-smile
colinardo
colinardo 12.10.2022 um 15:51:34 Uhr
Goto Top
👍 Freut mich wenn's hilft.