Exchange Server lassen nach nahezu jedem Update alte Daten bzw. Versionen der OWA und ECP Verzeichnisse auf dem Dateisystem liegen. Insbesondere das Verzeichnis „C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\Owa\prem“ belegt nach längerer Laufzeit und entsprechend vielen Updates doch einigen Platz auf dem Dateisystem. Hier mal ein Beispiel von einem Exchange Server der schon etwas länger läuft:
Alte Dateiversionen / Daten im Verzeichnis „prem“ belegen hier immerhin 16 GB auf dem Dateisystem. Genutzt werden diese Daten nicht mehr. Frank C. (msXfaq) hat zu diesem Thema einen lesenswerten Artikel erstellt:
https://www.msxfaq.de/exchange/update/alte_owa_dateien_loeschen.htm
Zwar dürften die „paar“ GB die wenigstens Leute aus der Ruhe bringen, aber es könnte ja mal knapp werden mit dem Speicherplatz. Wenn ein Laufwerk droht vollzulaufen, macht es also Sinn, wenn man weiß wo man sich etwas Luft zum Atmen verschaffen kann. Neben den Exchange server log files you can also gain some storage space here.
Frank C. also has the following sentence in his article:
You could of course also automate the deletion of old versions using PowerShell or similar.
Source: https://www.msxfaq.de/exchange/update/alte_owa_dateien_loeschen.htm
I have taken the sentence and converted it into a PowerShell script. The following PowerShell script lists all old versions in the following directories:
- $exinstall\ClientAccess\ecp
- $exinstall\ClientAccess\Owa
- $exinstall\ClientAccess\Owa\prem
For security reasons, the script determines the oldest Exchange Server version (in environments with multiple Exchange Servers) and lists all versions of the directories that are older than the oldest Exchange Server. This ensures that the directory versions matching the build of the oldest Exchange Server remain available and are not deleted.
Das Script listet beim Ausführen nur die alten Verzeichnisversionen auf, löscht diese aber nicht. Erst wenn der Parameter „-$DeleteOldVersions:$true“ angegeben wird, werden die Daten auch gelöscht.
Here is the script, which can be copied into a .PS1 file:
<#
.SYNOPSIS
Identifies, reports and deletes old OWA / ECP folders
.DESCRIPTION
Run this Script to list old and unused OWA / ECP folder. Set Parameter -DeleteOldVersions to $true if you
want to delete old folders to free up disk space.
.PARAMETER DeleteOldVersions
Set DeleteOldVersions to $True to delete old OWA / ECP folder versions.
.EXAMPLE
.\Delete-OldFolderVersions.ps1
List old OWA / ECP folderversions:
.EXAMPLE
.\Delete-OldFolderVersions.ps1 -DeleteOldVersions $true
List and delete old OWA / ECP Directory versions:
.NOTES
Author: Frank Zoechling
Website: https://www.frankysweb.de
Twitter: @FrankysWeb
#>
Param(
[Parameter(Mandatory=$False)]
[bool]$DeleteOldVersions
)
# Test if evelated Shell
Function Confirm-Administrator {
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal( [Security.Principal.WindowsIdentity]::GetCurrent() )
if ($currentPrincipal.IsInRole( [Security.Principal.WindowsBuiltInRole]::Administrator )) {
return $true
} else {
return $false
}
}
if (-not (Confirm-Administrator)) {
Write-Output $msgNewLine
Write-Warning "This script needs to be executed in elevated mode. Start the Exchange Management Shell as an Administrator and try again."
$Error.Clear()
Start-Sleep -Seconds 2
exit
}
#Foldernames to search for old ECP / OWA folders
$ECPFolderPath = $exinstall + "ClientAccess\ecp"
$OWAFolderPath = $exinstall + "ClientAccess\Owa"
$OWAPremFolderPath = $exinstall + "ClientAccess\Owa\prem"
#Get Exchange Server Versions
try {
$ExchangeServerVersions = @()
$ExchangeServerDisplayVersions = (Get-ExchangeServer | Where-Object { $_.AdminDisplayVersion.Major -eq 15 }).AdminDisplayVersion
foreach ($ExchangeServerDisplayVersion in $ExchangeServerDisplayVersions) {
$ExchangeServerVersions += $ExchangeServerDisplayVersion.Major,$ExchangeServerDisplayVersion.Minor,$ExchangeServerDisplayVersion.Build,$ExchangeServerDisplayVersion.Revision -join "."
}
$ExchangeServerVersion = $ExchangeServerVersions | Sort-Object | Select-Object -first 1
write-host ""
write-host "Oldest installed Exchange Build is: $ExchangeServerVersion"
write-host ""
} catch {}
#Search all OWA / ECP folder versions
try {
$AllVersions = @()
$AllVersions += Get-ChildItem $ECPFolderPath -Directory | Where-Object { $_.Name.StartsWith("15.") } | Select-Object FullName,Name
$AllVersions += Get-ChildItem $OWAFolderPath -Directory | Where-Object { $_.Name.StartsWith("15.") } | Select-Object FullName,Name
$AllVersions += Get-ChildItem $OWAPremFolderPath -Directory | Where-Object { $_.Name.StartsWith("15.") } | Select-Object FullName,Name
} catch {}
#Search for old versions
write-host "Old OWA / ECP folders:"
write-host ""
$ExchangeBuild = [System.Version]::Parse($exchangeserverversion)
$OldVersions = @()
foreach ($Version in $AllVersions) {
$Folderversion = [System.Version]::Parse($Version.Name)
if ( $Folderversion -lt $ExchangeBuild ) {
write-host $Version.Fullname
$OldVersions += $Version.Fullname
}
}
write-host ""
#Delete old OWA / ECP folder versions
if ($DeleteOldVersions -eq $true) {
write-host "Deleting old OWA / ECP versions:"
write-host ""
foreach ($Oldversion in $OldVersions) {
write-host $Oldversion
Remove-Item $Oldversion -Recurse -Confirm:$true
}
}
If you want it a little easier, I have also published the script on GitHub:
Update 07.12.2021: The script has been updated to include more older versions, the changes can be tracked on GitHub. Thank you for the pull request.