Exchange Online Cleanup: Skriptem smaž 10 GB mrtvých příloh za minutu
Exchange Online má (v Business Basic) 50 GB limit na schránku. Zní to hodně, dokud účetní nepošle 200 MB XLS přílohu 40 lidem. Ruční procházení pošty je nereálné, retention policy zabere dny a GUI je pomalé. Řešení? PowerShell V3 EXO modul a ComplianceSearch. Za pár řádků najdeme 100 MB+ přílohy, exportujeme CSV report, smažeme (respektive přesuneme do Recoverable Items) a pošleme manažerovi přehled, kolik peněz licence právě ušetřila.
1 · Proč řešit úklid příloh
- Licenční peníze. Přechod na E3/E5 kvůli velikosti mailboxů je drahý.
- Odezva Outlooku. Menší OST = rychlejší hledání.
- Compliance. Mazání starých Teams chatů s daty zákazníků.
- Backup okno. Menší data → rychlejší Veeam/3rd‑party backup.
2 · Instalace EXO V3 modulu & připojení
Install-Module -Name ExchangeOnlineManagement -Force
Connect-ExchangeOnline -UserPrincipalName admin@firma.cz -ShowBanner:$false
Potřebuješ roli Compliance Search + Mailbox Import Export (role group eDiscovery Manager).
3 · ComplianceSearch: jak funguje
New-ComplianceSearch → Start-ComplianceSearch → Get-ComplianceSearch. Výsledek se uloží do Compliance Center, cmdlet New-ComplianceSearchAction umí Export nebo Purge.
3.1 Omezení
- Max 10 000 mailboxů na hledání
- Purge natrvalo (
-PurgeType HardDelete) nebo do Deleted Items (SoftDelete) - Rate‑limit ~ 50 MB/min na Purge
4 · Vytvoření reportu velkých příloh
$q = 'size>50MB AND kind:email'
$name= "HugeAttachments_$(Get-Date -F yyyyMMdd_HHmm)"
New-ComplianceSearch -Name $name -ExchangeLocation all -ContentMatchQuery $q
Start-ComplianceSearch -Identity $name
while((Get-ComplianceSearch $name).Status -ne 'Completed'){ Start-Sleep 5 }
$size = (Get-ComplianceSearch $name).Size
Write-Host "Nalezeno $size" -F Yellow
# Export report
New-ComplianceSearchAction -SearchName $name -Export -Format FxStream
Stáhne ZIP s CSV (Export_results.csv).
5 · Skript Invoke-ExoCleanup.ps1
param(
[int]$ThresholdMB = 50,
[switch]$ReportOnly,
[string]$TeamsWebhook
)
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -CertificateThumbprint $thumb -AppId $appid -Organization firma.onmicrosoft.com
$q="size>$($ThresholdMB)MB AND kind:email"
$n="AutoCleanup_$(Get-Date -F yyyyMMdd_HHmm)"
New-ComplianceSearch -Name $n -ExchangeLocation all -ContentMatchQuery $q | Out-Null
Start-ComplianceSearch $n
do { $s=Get-ComplianceSearch $n; Start-Sleep 5 } until ($s.Status -eq 'Completed')
if ($ReportOnly) {
New-ComplianceSearchAction -SearchName $n -Export -Format FxStream
} else {
New-ComplianceSearchAction -SearchName $n -Purge -PurgeType SoftDelete
}
# Teams zpráva
if ($TeamsWebhook){
$txt="Cleanup `$ThresholdMB MB`+: $($s.Items) mailů, $($s.Size)"
Invoke-RestMethod -Method Post -Uri $TeamsWebhook -Body (@{text=$txt}|ConvertTo-Json) -ContentType 'application/json'
}
6 · Remove Teams meeting chaos
Teams meetingy starší 180 dní (HTML pozvánky 150 KB × tisíce):
$q='subject:"Microsoft Teams Meeting" AND received<2024-11-01'
New-ComplianceSearch -Name OldTeams -ExchangeLocation all -ContentMatchQuery $q
Start-ComplianceSearch OldTeams
New-ComplianceSearchAction -SearchName OldTeams -Purge -PurgeType SoftDelete
7 · Automatizace: měsíční úklid
# Task Scheduler
$act = New-ScheduledTaskAction -Execute 'pwsh' `
-Argument '-File C:\Scripts\Invoke-ExoCleanup.ps1 -ThresholdMB 80 -TeamsWebhook https://…'
$trg = New-ScheduledTaskTrigger -Monthly -DaysOfMonth 1 -At 02:00
Register-ScheduledTask -TaskName 'ExoCleanup' -Action $act -Trigger $trg -User SYSTEM
8 · Compliance & retention – nenech se vyhodit
- Purge přesouvá do Deletions (Recoverable Items) – drží se 14 dní default.
- Pokud je mailbox pod Litigation Hold, HardDelete neprojde.
- MFA: použij App‑Only cert auth (Azure AD app reg).
- Logy: Audit log v M365, plus export
Get-ComplianceSearchCSV.
9 · Case study: 120 GB pryč, licence ušetřena
| Metoda | Mailbox průměr | Licenční náklady |
|---|---|---|
| Před skriptem | 47 GB | E3 upgrade hrozí |
| Po cleanup | 31 GB | Zůstává Business Basic |
Čas skriptu: 15 min test + 45 min purge. Úspora: 4 €/uživatel × 100 uživatelů × 12 m = 48 000 Kč/rok.
10 · FAQ
- Můžu mazat i OneDrive přílohy?
- ComplianceSearch ContentMatchQuery podporuje
SharePointLocation– stejný princip. - Co s přílohami v Public Folders?
- Nastav
ExchangeLocation PublicFoldersv searchi. - HardDelete vs. SoftDelete?
SoftDelete→ Recoverable Items (uživatel obnoví);HardDelete→ nenávratně pryč (nutná rola Data Investigator).
11 · Závěr
PowerShell + EXO modul = rychlý skalpel na tlusté mailboxy. Místo dražších licencí a klikání v GUI zvládneš úklid za minutu a ještě pošleš report, který okouzlí CFO. Příště, až ti někdo řekne „Mailbox je plný“, odpověz: „Dej mi chvíli, spustím skript.“
Klíčová slova
exchange online powershell, mailbox cleanup, remove large attachments, compliance search, teams meeting cleanup, m365 storage cost, exo v3 module, purge mailbox items, retention policy




