Export-Automapping

In Exchange können Benutzer nicht nur Stellvertreter- oder Vollzugriff auf ein Postfach haben, sondern auch das zusätzliche Postfach automatisch eingebunden bekommen. Dafür sorgt das "Automapping"-Feature. Gerade bei Migrationen mit Prepare-Moverequest.ps1 oder anderen Umorganisationen kann es schon mal passieren, dass ein Objekt in eine andere Domain oder Forst verschoben wird und damit das Automapping verloren geht.

Export

Daher habe ich mir zuerst ein Skript gebaut, welches die Automapping-Einträge in eine CSV-Datei exportieren kann.

Der einfache Demo-Code hat keinerlei Plausibilitätsprüfung oder Fehlerbehandlung und funktionierst nur in einer Domain.

# Export-Automapping
#
# Reads the local Exchange AD to generate a list of Users and Automapping entries
#
[CMDLetBinding()]
param()

Write-Verbose "Loading Module ActiveDirectory"
Import-Module ActiveDirectory

Write-Verbose "Search for Delegate using Get-ADUser" 
$sharedmailboxes = Get-ADUser `
                     -LDAPFilter "(msExchDelegateListLink=*)" `
                     -Properties name,mailnickname,mail,msExchDelegateListLink

Write-Verbose "Start Processing"
ForEach ($sharedmailbox in $sharedmailboxes) {
   Write-Verbose " Processing sharedmailbox $($sharedmailbox.mail)"
   foreach ($delegatedn in $sharedmailbox.msExchDelegateListLink) {
      Write-Verbose "   Parsing delegated User $($delegatedn)"
      $delegate = get-aduser $delegatedn -properties mail
      Write-Verbose "    Mailaddress $($delegate.mail)"
      $result = [pscustomobject][ordered]@{
                    shareddn     = $sharedmailbox.distinguishedname.tostring()
                    sharedmail   = $sharedmailbox.mail.tostring()
                    delegatedn   = $delegate.distinguishedname.tostring()
                    delegatemail = $delegate.mail.tostring()
      }
      $result
   }
}
Write-Verbose "Done Processing"

Die Ausgabe kann über die Pipeline in eine CSV-Datei geschrieben werden und hat vier Spalten, in denen die Felder "shareddn" und "sharedmail" die Informationen zum Postfach enthalten , auf die das Postfach in den Feldern "delegatedn" und "delegatedn" per Automapping berechtigt ist.

PS C:\>.\export-automapping.ps1 | Export-CSV automapping.csv -NoTypeInformation -Encoding utf8

Wenn ein Postfach gleich mehrere berechtigte Benutzer hat, dann sind dies auch mehrere eigenständige Zeilen.

Die Erstellung können Sie gerne auch automatisieren, um z.B. Berichte zu erstellen oder Veränderungen z.B. über GIT zu tracken.

Das Skript wertet nicht die Mailboxpermissions selbst aus. Es könnte also sein, dass jemand noch im Automapping enthalten ist aber keine Rechte hat. Das kann passieren, wenn jemand manuell vorbei an den Exchange Commandlets die Einträge verändert. Nach meiner Beobachtung ist "Automapping" auch immer mit "FullAccess" verbunden aber nicht umgekehrt.

Import

Die Export-Datei ist natürlich auch eine gute Basis, um fehlende Einstellungen wiederherzustellen. Solange man sich in der gleichen Umgebung bewegt, sollte ein Re-Import anhand der bestehenden Mailadresse problemlos möglich sein.

Import-CSV automapping.csv `
| foreach { `
   Add-MailboxPermission `
      -Identity $_.sharedmail `
      -User $_.delegatemail `
      -AccessRights FullAccess `
      -AutoMapping:$true
}

Wenn es um eine Migration geht und die Zielumgebung komplett andere Domaincontroller, OUs und distinguishedNames hat, dann können sie aber mit der Mailadresse immer noch weiter kommen oder in der CSV-Datei meist recht einfach die Mailadressen umschreiben. Die Exchange Commandlets sind hier ja flexibel genug, auch zusätzliche SMTP-Adressen in den ProxyAddresses zu verwenden.

Da ich hier mit "Add-MailboxPermission" arbeite, muss der Import natürlich durch einen Exchange Empfängeradministrator über die Exchange PowerShell erfolgen.

Zudem setzt das Beispiel nicht nur "Automapping" sondern auch die AccessRights auf "FullAccess", was aber in der Regel für Stellvertreterzugriffe sowieso sinnvoll ist.

Leider gibt es kein "Set-MailboxPermission", mit dem nur das Automapping eingestellt werden kann.

In dem Fall müssen Sie die vorherigen Berechtigungen erst entfernen und dann wieder neu setzen.

To disable auto-mapping for a mailbox where the user was already assigned Full Access permission, you need to remove the user's Full Access permission by using the Remove-MailboxPermission cmdlet, and then reassign the user Full Access permission on the mailbox using the AutoMapping parameter with the value $false.
Quelle: https://docs.microsoft.com/en-us/powershell/module/exchange/add-mailboxpermission?view=exchange-ps

Automapping für FullAccess

Den Hinweis aus der Microsoft Dokumentation können Sie natürlich auch als Hinweise sehen, wie Sie "halbfertige" Berechtigungen nachziehen können. Zuerst generiere ich eine Liste der Postfächer, auf dem andere Personen berechtigt sind:

Get-Mailbox `
| Get-MailboxPermission  `
| Where { `
             ($_.IsInherited -eq $False) `
   -and      ($_.AccessRights -like "*FullAccess*") `
   -and -not ($_.User -like "NT AUTHORITY\SELF") } `
| Select Identity, User, AccessRights

Diese List kann auch mal für andere Berichte interessant sein. Mein Ziel ist es aber nun, für alle Postfächer und mit "FullAccess" berechtigten Anwender das Automapping einzuschalten.

Get-Mailbox `
| Get-MailboxPermission  `
| Where { `
             ($_.IsInherited -eq $False) `
   -and      ($_.AccessRights -like "*FullAccess*") `
   -and -not ($_.User -like "NT AUTHORITY\SELF") } `
| foreach { `
   Add-MailboxPermission `
      -identity $_.Identity `
      -User $_.User `
      -AccessRights FullAccess `
      -Automapping:$true
}

Leider ist es nicht möglich, den Parameter "AccessRights" wegzulassen. Die PowerShell wird auch mit jeder Zeile eine gelbe Warnung auswerfen, dass der Benutzer bereits in den Berechtigungen drin steht. Die PowerShell setzt aber zusätzlich das Feld "msExchDelegateListLink" beim Postfach, was aber nicht explizit angezeigt wird.

Über den gleichen Weg können Sie das AutoMapping wieder deaktivieren.

Weitere Links