Exchange Kalenderfreigaben per Powershell

Auf einem Exchange Server (hier 2010) sollen alle freigegebenen Kalender aller Postfächer angezeigt werden. Man verliert ja irgendwann die Übersicht. Die berechtigten anderen Benutzer sind dann inclusive ihrer Berechtigung auf die jeweilige Freigabe aufzulisten.

Vorhandene Powershell-Skripte für dieses Problem gibt es zuhauf. Sie iterieren über alle Postfächer und arbeiten dabei mit dem Suchparameter „folderscope“ (hier calendar). Das funktioniert aber nur, wenn der (freigegebene) Kalender auch innerhalb der angenommenen Struktur im MAPI-Namespace liegt. Muss er aber nicht.

Manche Experten „verschieben“ ihre Ordner auch auf die oberste Ebene, den IPM_SUBTREE. Oder speichern ihre Freigaben unterhalb des Papierkorbs. Alles schon gesehen. Dementsprechend erfordern auch die „Benutzerordner“ etwas mehr Aufmerksamkeit.

Das Skript muss deshalb m.E. alle Folder einer Mailbox auf den Typ „Calendar“ testen und kann die Berechtigungen dann erst abfragen. Und im Nebeneffekt die Berechtigungen längst gelöschter ActiveDirectory-Benutzer auch gleich entfernen.

# 1. Alle Mailboxen auf dem Server
$mailboxes = Get-MailBox
foreach ($mailbox in $mailboxes | Where { $_.Name -notlike "Administrator" -and $_.Name -notlike "Discovery*"}) {
 $mName = $mailbox.name
 $mAlias = $mailbox.alias
 "Suche in Mailbox $mAlias..." 
 
 # 2. Alle selbst erstellten Ordner und den (Haupt-)kalender suchen. Unabhängig vom Folderscope
 $folders = Get-MailboxFolderStatistics -Identity $mAlias | Where-Object { $_.FolderType -eq "Calendar" -or $_.FolderType -eq "Vom Benutzer erstellt" }
 foreach ($folder in $folders) {
  
 # 3. Pfad zusammenbauen und testen, ob es sich beim Userfolder um den Typ "Kalender handelt"
  $pfad = $mAlias + ":" + $folder.folderPath.Replace("/","\")
  $calname = Get-MailboxCalendarFolder -Identity "$pfad" -ErrorAction SilentlyContinue
  if($calname) {
  
  # 4. Falls 3.: Sofern freigegeben, Berechtigungen anderer Benutzer anzeigen
   $fp = Get-MailboxFolderPermission -identity "$pfad" | where { $_.User -notlike "Anonym" -and $_.User -notlike "Standard" }
   if ($fp.length -gt 0) {
    "$pfad"
    foreach ($mUser in $fp) {
     ""
     $mUserID = $mUser.Identity.ToString()
     $mUserValid = $mUser.IsValid
     $mUserAccessRights = $mUser.AccessRights
     ""
     if($mUserID -like "NT-Benutzer:*") {
      # Die Berechtigungen ungültige Benutzer (nicht mehr im Active Directoy) werden entfernt.
      # Keine Angst, das Skript fragt vor dem Entfernen aber jeweils nach
      Remove-MailboxFolderPermission -Identity "$pfad" -User "$mUserID"
     } else {
      # Ausgabe
      $mUserID
      $mUserValid
      $mUserAccessRights
     }
    }
    "----------------------"
    ""
   }
  }
 }
}

Obige Zeilen mögen nicht die Schnellsten sein, erfüllt aber die Bedingungen.
Letzter Nebeneffekt: Sie decken auch solch lustige Sachen auf, die sich wohl nur über ein mehrfaches Nutzen der „scanpst.exe“ auf dem Client bereinigen lassen.