Exchange Server: Bericht über Postfachgröße an Benutzer senden

Viele Admins kennen das Problem, es wurden Größenbeschränkungen für Postfächer konfiguriert und immer mal wieder gibt es Meldungen über volle Postfächer von Benutzern. Als Admin hat man hier eigentlich nur zwei Möglichkeiten, entweder man erweitertet die Postfachgröße für den Benutzer, oder man sagt dem Benutzer dass er aufräumen und alte Mails löschen soll.

Die erste Möglichkeit behebt das Problem meist nur temporär, denn nach gewisser Zeit meldet sich der Benutzer wieder und möchte mehr Speicherplatz. Bei der zweiten Möglichkeit ist es oft schon zu spät, denn das Postfach ist ja meist schon voll, daher gibt man den Benutzer meist ein wenig mehr Speicherplatz und bittet ihn dann aufzuräumen. Wie erfolgreich die beiden Möglichkeiten sind, hängt dann eher vom Benutzer ab.

In jedem Fall wartet man allerdings auf die Meldung des Benutzers, welcher sich über ein volles Postfach beschwert. Outlook selbst hilft hier leider auch nur bedingt weiter, denn es beschwert sich erst, wenn das Limit für die Warnung erreicht ist. Da könnte man ja etwas proaktiver auf dien Benutzer zugehen und Ihnen ein bisschen Hilfestellung beim Aufräumen anbieten, denn nicht nur die Postfachgröße spielt eine Rolle (meist nur für uns Admins), sondern auch die Anzahl der Elemente pro Ordner.

Ordner mit mehr als 100.000 Elementen verlangsamen Outlook spürbar. Bei Benutzern mit großen Postfächern bekommt man möglicherweise nicht nur Beschwerden über mangelnden Speicherplatz, sondern auch noch über mangelnde Geschwindigkeit.

Ich habe daher ein kleines PowerShell Script erstellt, welches die Postfachgröße, die größten Ordner und die Ordner mit den meisten Elementen des Postfachs anzeigt und dem Benutzer als E-Mail Bericht zustellt. Zusammen mit dem Bericht können dem Benutzer dann noch weitere Infos zugestellt werden, beispielsweise Infos zum eingesetzten Archivsystem oder eine Anleitung zur Benutzung seines Postfachs.

Hier mal ein Beispielbericht für einen Benutzer:

Exchange Server: Bericht über Postfachgröße an Benutzer senden
Im Script selbst müssen nur wenige Zeilen angepasst werden, damit ein ein Bericht wie oben an die Benutzer verschickt wird:
$Group = "Domain Users"
$CountTopFolder = 10
$ReportMailboxSizeInMB = 5000

$SMTPServer = "smtp.domain.tld"
$From = "postfachbericht@domain.tld"
$Subject = "Postfach Übersicht"

Ich denke die meisten Einstellungen sind selbsterklärend. Bei der Variable „$Group“ kann eine Active Directory Gruppe angegeben werden. Der Bericht wird dann nur für Mitglieder dieser Gruppe versendet. Auf diese Weise lassen sich unterschiedlich formatierte Berichte an unterschiedliche Gruppen schicken. Wenn der gleiche Bericht an alle Benutzer verschickt werden soll, kann die Gruppe „Domain Users“ angegeben werden.

Das Script habe ich auf GitHub zur Verfügung gestellt, gerne kann sich an der Weiterentwicklung beteiligt werden:

Vielleicht hilft es ja dem ein oder anderen Benutzer etwas mehr Ordnung im Postfach zu halten.

Update 10.12.2022: Ich habe gerade das Script auf GitHub aktualisiert und ein Problem behoben, bei dem kein Report versendet wurde. Zusätzlich gibt es jetzt die Möglichkeit den Bericht erst bei Postfächern ab einer bestimmten Größe zu versenden.

29 thoughts on “Exchange Server: Bericht über Postfachgröße an Benutzer senden”

  1. 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

    Reply
  2. Was interessant wäre, weil es damit immer wieder zu Problemen beim Cache Mode kommt wäre die Gesamtzahl der Ordner im Postfach.

    Reply
  3. 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

    Reply
  4. 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

    Reply
  5. 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

    Reply
    • 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

      Reply
      • 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

        Reply
  6. 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.

    Reply
  7. 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 :-(

    Reply
  8. Hallo Franky,

    Gute Idee mit dem Script. Danke!
    Habe scheinbar dasselbe Problem, wie Kai unter WinServer2019.

    Gruß
    Christian

    Reply
  9. 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!

    Reply
      • 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?

        Reply
        • 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 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

      Reply
      • 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

        Reply
  10. 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.

    Reply

Leave a Comment