Many admins are familiar with the problem that size limits have been configured for mailboxes and every now and then there are messages about full mailboxes from users. As an admin, you really only have two options here: either you increase the mailbox size for the user, or you tell the user to clean up and delete old mails.
The first option usually only solves the problem temporarily, because after a certain amount of time the user contacts you again and asks for more storage space. With the second option, it is often too late, because the mailbox is usually already full, so you usually give the user a little more storage space and then ask them to clean it up. How successful the two options are depends more on the user.
In any case, however, you wait for the message from the user complaining about a full mailbox. Unfortunately, Outlook itself is only of limited help here, as it only complains when the limit for the warning is reached. You could approach the user a little more proactively and offer them a little help with tidying up, because it's not just the size of the mailbox that matters (usually only for us admins), but also the number of items per folder.
Folders with more than 100,000 items slow down Outlook noticeably. Users with large mailboxes may not only complain about a lack of storage space, but also about a lack of speed.
I have therefore created a small PowerShell script that displays the mailbox size, the largest folders and the folders with the most items in the mailbox and sends them to the user as an e-mail report. Together with the report, further information can be sent to the user, for example information on the archive system used or instructions on how to use their mailbox.
Here is an example report for one user:

$Group = "Domain Users"
$CountTopFolder = 10
$ReportMailboxSizeInMB = 5000
$SMTPServer = "smtp.domain.tld"
$From = "postfachbericht@domain.tld"
$Subject = "Mailbox overview"
I think most of the settings are self-explanatory. An Active Directory group can be specified for the variable "$Group". The report is then only sent to members of this group. In this way, differently formatted reports can be sent to different groups. If the same report is to be sent to all users, the "Domain Users" group can be specified.
I have made the script available on GitHub, you are welcome to participate in the further development:
Perhaps it will help some users to keep their mailboxes a little more organized.
Update 10.12.2022: I have just updated the script on GitHub and fixed a problem where no report was sent. In addition, there is now the option to send the report only for mailboxes above a certain size.
Hallo Frank,
bin gerade über dein Script gestolpert, was aktuell super passt. Leider bekomme ich keine Mails.
Das Script startet fehlerfrei, aber es kommt keine Mail an. Was mache ich falsch?
Würde mich über einen Tipp freuen….
Danke und Gruß
Mike
Was interessant wäre, weil es damit immer wieder zu Problemen beim Cache Mode kommt wäre die Gesamtzahl der Ordner im Postfach.
Hallo Tobias,
gute Idee und schon umgesetzt. Siehe GitHub.
Beste Grüße,
Frank
Ja coole Sache, Dankeschön!
Das skript funktioniert soweit allerdings scheinen einige keine Mail zu bekommen bei uns obwohl Domain Users angegeben ist. Und selbst wenn ich diese user plus ein Test user der die Mailbekam in eine eigene Gruppe Packe bekommt nur dieser eine USwer eine Meldung obwohl eines der Postfächer deutlich mehr elementze und größer ist als das von dem der die mail bekommt. Das ganze unter Exchange 2019
Super! Wurde sofort getestet und erstmalig eingesetzt!
Das mit den Usergruppen muss ohnehin individuell angepasst werden. Der Text auch.
Mich persönlich interessieren immer die User, die schon Warnmeldungen von Exchange erhalten. Leider scheint dieses Flag „IssueWarning“ ja entfernt worden zu sein.
Get-Mailbox -Resultsize Unlimited | Get-MailboxStatistics | where {$_.StorageLimitStatus -eq “IssueWarning”} –> liefert schon lange keine Ergebnisse mehr auf meinem Exchange 2019
Hi,
sehr praktisch. Vielen Dank! Würde das Script auch auf einem ExchangeOnline nutzbar sein?
Hallo Joerg,
mit Exchange Online funktioniert dieses Script nicht.
Beste Grüße,
Frank
Hallo,
leider bekomme ich beim ausführen des Scripts:
PS C:\scripte> .\Report-MailboxStatistics.ps1
Get-ADGroup : Unter „DC=DOMAINNAME,DC=local“ kann kein Objekt mit der ID „Domain Users“ gefunden werden.
In C:\scripte\Report-MailboxStatistics.ps1:9 Zeichen:17
+ $GroupMembers = Get-ADGroup $Group | Get-ADGroupMember -Recursive | G …
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Domain Users:ADGroup) [Get-ADGroup], ADIdentityNotFoundException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADGroup
Liegt das evtl daran das es ein WindowsServer2016 in Deutsch ist?! Oder was müsste ich eintragen damit es geht?
Grüße,
Holger
Um sicher zu gehen, dass die Sprache nicht das Problem ist, kannst du die SID der Gruppe verwenden.
Dazu lösche Zeile 1 im Skript und ersetze sie dadurch:
$DomainSID = (Get-ADDomain).DomainSID
$DomainUsersSid = New-Object System.Security.Principal.SecurityIdentifier ([System.Security.Principal.WellKnownSidType]::AccountDomainUsersSid,$DomainSID)
$Group = Get-AdGroup -Filter {SID -eq $DomainUsersSID}
Danach entferne in Zeile 9 den Teil „Get-ADGroup“ so dass die Zeile so aussieht:
$GroupMembers = $Group | Get-ADGroupMember -Recursive | Get-ADUser -Properties msExchMailboxGuid | where {$_.msExchMailboxGuid -ne $Null}
Somit wird die Gruppe nicht mehr nach dem Namen sondern nach der Well Known SID gesucht, die überall (Bis auf den Domänenanteil) gleich ist.
Gruß
Thomas
Hallo Thomas,
ich habe nun die neuste Version des Scripts bei mir am testen/laufen.
Einmal war es, das ich das Script ja in der Exchange-Shell laufen lassen muss und ich habe nun eine neue Gruppe angelegt für die User die für diese Emailbenachrichtigung in Frage kommen.
Also alles super und funktioniert.
Danke und Grüße,
Holger
Danke für das Script!
Könnte man das Infomail – natürlich nur bei Bedarf – noch um eine Übersicht der zB 10 Benutzer mit den größten Postfachgrößen erweitern? Bei uns in der Firma waren einige über das Mail irritiert, da sie ihr Postfach stets „sauber“ halten und nur sehr wenig Speicherplatz benötigen.
Hallo Walther,
gute Idee, ich passe es ein bisschen an, damit nur Benutzer ab einer bestimmten Größe angeschrieben werden.
Beste Grüße,
Frank
Tolles Script. Danke.
Jetzt müsste man das noch kombinieren mit einem Script was die größten Postfächer ermittelt und diesen Usern die Übersicht schickt. *grübel*
Der SPAM Schutz ärgert mich wieder :-(
Das fände ich auch hilfreich!
Easy:
get-mailbox -ResultSize unlimited | Get-MailboxStatistics | sort TotalItemSize -Descending | select DisplayName, TotalItemsize -First 10
Das liefert die 10 größten Mailboxen…
Peter
Willst du die größten X Postfächer oder alle Postfächer ab einer bestimmten Größe?
Hallo Franky,
Gute Idee mit dem Script. Danke!
Habe scheinbar dasselbe Problem, wie Kai unter WinServer2019.
Gruß
Christian
Guten Morgen,
ich bekomme beim Ausführen leider diesen Fehler:
Get-ADGroup : Die Benennung „Get-ADGroup“ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die
Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In C:\Users\administrator.FEBA\Desktop\Report-MailboxStatistics.ps1:9 Zeichen:17
+ $GroupMembers = Get-ADGroup $Group | Get-ADGroupMember -Recursive | Get-ADUser – …
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-ADGroup:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Woran kann das liegen?
Ich habe die erste Zeile so angepasst:
$Group = „gruppenname“
Vielen Dank!
Hallo Kai,
du musst das RSAT-ActiveDirectory-Modul installiert haben.
Gruß Thomas
Hallo,
vielen Dank, jetzt hänge ich an der nächste Stelle:
Get-ADGroup : Unter „DC=Domain,DC=local“ kann kein Objekt mit der ID „gruppenname“ gefunden werden.
Muss der AD Gruppenname in einer bestimmten Form angegeben werden?
So, das Problem ist auch gelöst, ich hatte einen AD Ordner genommen, statt einer Gruppe.
Mit einer Gruppe klappt es jetzt, dafür kommen nun ganz viele neue Fehler..
get-mailbox : Die Benennung „get-mailbox“ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die
Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In C:\Users\administrator.FEBA\Desktop\Report-MailboxStatistics.ps1:11 Zeichen:13
+ $Mailbox = get-mailbox $GroupMember.SamAccountName
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (get-mailbox:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Get-MailboxStatistics : Die Benennung „Get-MailboxStatistics“ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.
Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In C:\Users\administrator.FEBA\Desktop\Report-MailboxStatistics.ps1:13 Zeichen:22
+ $Stats = $Mailbox | Get-MailboxStatistics | select displayname, @{label=“Size“; …
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-MailboxStatistics:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Ich kann auf deinen letzten Post nicht antworten, deswegen hier:
Du musst das Skript in einer Exchange Powershell ausführen. Also entweder auf dem Exchange Server die Exchange PS starten, oder auf deinem Adminrechner die Exchange Management Tools installieren (mithilfe der Exchange Server iso)
Gruß
Thomas
Hallo,
bei unserem Exchange Server 2016 CU23 mit Oktober22SU werden die MB Zahlen nicht ausgegeben.
Grüße
Jens
Hallo Jens,
hatte das selbe Problem mit meinem 2016.
ersetze Zeile 17 durch:
$TopFoldersBySize = $MailboxFolderStatistics | Select-Object FolderPath,@{Name=“Foldersize“;Expression={ „{0:N2}“ -f ((($_.FolderSize -replace „[0-9\.]+ [A-Z]* \(([0-9,]+) bytes\)“,“`$1″) -replace „,“,““) / 1MB)}} | sort foldersize -Descending | select -first $CountTopFolder
Hallo Thomas,
vielen Dank, habe es umgesetzt und nun klappt es auch.
Danke!
Hallo Thomas,
deine Zeile 17 dürfte die Sortierung der Ordner durch einander bringen. Könntest du (oder jemand mit deutschem Betriebssystem) mal die folgende Zeile 17 testen?
$TopFoldersBySize = $MailboxFolderStatistics | Select-Object FolderPath,@{Name=“Foldersize“;Expression={ [long]$a = „{0:N2}“ -f ((($_.FolderSize -replace „[0-9\.]+ [A-Z]* \(([0-9,]+) bytes\)“,“`$1″) -replace „,“,““)); [math]::Round($a/1048576,2) }} | sort foldersize -Descending | select -first $CountTopFolder
Dann müsste es wieder passen.
Beste Grüße,
Frank
Hallo Franky,
komischerweise wurde mein erster Kommentar vom Spamschutz blockert. Sorry falls dadurch jetzt ein doppelter erzeugt wird.
vielen Dank für das Skript! Ich habe leider das Problem, dass Foldersize leer angezeigt wird.
Habe ein Issue auf GitHub erstellt und dir auch einen Fix vorgeschlagen, der zumindest in meiner Umgebung funktioniert.
Hallo Franky,
vielen Dank, super Job! Kann man auch einzelne User anschreiben, anstatt eine Gruppe?