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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4221303405
Url: https://administrator.de/contentid/4221303405
Ausgedruckt am: 12.11.2024 um 19:11 Uhr
7 Kommentare
Neuester Kommentar
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.
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.
Servus.
https://learn.microsoft.com/en-us/exchange/policy-and-compliance/mrm/ret ...
Grüße Uwe
Ü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
}
}