In Exchange gibt es die Möglichkeit, eine „Senden als“-Berechtigung für Konten zu vergeben. Dies bedeutet, dass ein Konto vorgeben kann, es würde eine E-Mail von einem anderen Konto senden. Der Empfänger merkt dabei keinen Unterschied, dass die E-Mail ursprünglich von einem anderen Konto gesendet wurde.
Index
„Senden als“-Berechtigung im Exchange Admin Center
Direkt im Exchange (hier am Beispiel von Exchange 2016) kann das im Exchange Admin Center unter dem Punkt „Postfachstellvertretung“ eines Kontos eingestellt werden.
Remote-Session mit Powershell
Das funktioniert natürlich auch über Powershell, entweder direkt im Exchange oder mit einer Remote-Session. Da dieses Skript sich zur Automatisierung eignet, möchte ich in diesem Artikel kurz aufzeigen, wie man von einem Remote-PC die „Senden als“-Berechtigung eines Kontos setzt und ausliest. Das entstehende Skript ist kompatibel mit den Exchange-Versionen 2010, 2013 und 2016.
Um über einen Remote-PC Exchange-CmdLets ausführen zu können, benötigen wir eine Powershell-Session auf dem Exchange. Dazu muss entweder die Powershell mit den entsprechenden Berechtigungen gestartet werden oder man übergibt dem CmdLet zum Erstellen der Session ein entsprechendes Credential. Dies kann interaktiv wie folgt abgefragt werden:
1 |
$credential = Get-Credential |
Für die Automatisierung ist das natürlich nicht geeignet. Wie man Credentials auch sicher abspeichern und auslesen kann, zeige ich in dem Beitrag Sessions von domänenfremden PCs importieren.
Nun müssen wir die Session vom Exchange importieren. Dies machen wir via Kerberos-Authentifizierung, indem wir das Credential übergeben. Dazu brauchen wir die URL des Powershell-Webservices des Exchange-Servers. Diese ist immer: https://<DNS Name des Exchange>/Powershell
Damit erstellen wir eine neue Session und importieren diese anschließend:
1 2 |
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://SEXC01/PowerShell/ -Authentication Kerberos -Credential $credential Import-PSSession $session -CommandName Add-ADPermission |
Beim Import-Session werden standardmäßig alle CmdLets der Session importiert. Das ist in unserem Fall unnötig, da wir nur das Add-ADPermission-CmdLet benötigen. Wegen der besseren Performance importieren wir auch nur dieses.
Setzen der „Senden als“-Berechtigung
Zum Setzen der Berechtigung brauchen wir zwei Informationen: Die Identität des Nutzers (samAccountName, objectGUID etc.), für den die Berechtigung gesetzt werden soll, sowie die E-Mail-Adresse, für die er die „Senden als“ Berechtigung erhalten soll. Die Berechtigung wird dann mit folgendem Befehl gesetzt:
1 |
Add-ADPermission -Identity “test.user” -User “other.user@demofa.net” -AccessRights ExtendedRight -ExtendedRights "Send As" |
Das war es auch eigentlich schon. Am Ende sollten wir allerdings nicht vergessen, die Session wieder zu entfernen, da diese sonst offen bleibt:
1 |
Remove-PSSession $session |
Auslesen der „Senden als“-Berechtigung
Nun zum zweiten Teil, der eigentlich einfacher als das Setzen der Berechtigung sein sollte, aber ein wenig trickreicher ist: Das Auslesen der Berechtigung. Auch hier machen wir mit dem New-PSSession-Command wieder eine neue Session auf und importieren diese dann. Beim Import selbst allerdings brauchen wir andere CmdLets:
1 |
Import-PSSession -Session $session -CommandName Get-Mailbox, Get-ADPermission |
Zuerst holen wir uns die Mailbox des Nutzers heran, von dem wir die Berechtigung auslesen wollen:
1 |
$mb = Get-Mailbox „test.user@demofa.net“ |
Für diese Mailbox brauchen wir jetzt die AD-Permissions. Die „Senden als“-Berechtigungen verstecken sich dabei in den „Extended Rights“ und müssen dort herausgesucht werden. Zusätzlich wollen wir (normalerweise) keine vererbten Berechtigungen sehen und auch nicht die Berechtigung auf sich selbst, die auch in den Extended Rights als „Send As“-Berechtigungen hinterlegt sind.
Zusammengefasst in einem Befehl sieht das so aus:
1 |
$users = $mb | Get-ADPermission | where {($_.ExtendedRights -like "*Send-As*") -and ($_.IsInherited -eq $false) -and -not ($_.User -like "NT AUTHORITY\SELF")} |
1 |
E-Mail-Adressen extrahieren
In $users finden wir alle Nutzer, für die test.user@demofa.net die “Senden Als”-Berechtigung hat. Leider allerdings sind dort nicht die E-Mail-Adressen enthalten, sondern nur der Anmeldename in Form von <Domäne>\<Anmeldename>. Mit einem kleinen Trick aber können wir die Mailadresse einfach finden. Diese steht schließlich auch im angebundenen Active Directory. Wir suchen einfach nach dem Nutzer mit dem Anmeldenamen in der Domäne, lesen seine E-Mail-Adresse aus und fügen uns diese eine Liste hinzu. In Skript sieht das folgendermaßen aus:
1 2 3 4 5 |
$sendAsMailAddresses = New-Object System.Collections.ArrayList($null) foreach($user in $users) { $adUser = Get-ADUser $user.User.Split("\")[1] -Properties mail $sendAsMailAddresses.Add($adUser.mail) } |
Wir gehen über unsere $users-Liste – bei jedem $user steht in $user.User der Name in oben genannter Form. Deswegen splitten wir ihn am „\“ auf, sodass wir nur den Anmeldenamen zum Suchen im AD verwenden. Wir wollen natürlich die Eigenschaft mail auslesen und diese anschließend unserer finalen Liste hinzufügen.
Jetzt können wir $sendAsMailAddresses durchgehen und schauen, welche Adressen darin enthalten sind. Damit sind wir auch hier fertig. Aber auch hier dürfen wir am Ende nicht vergessen, die PS-Session wieder zu entfernen:
1 |
Remove-PSSession $session |
Komplette Skripte als Funktionen
Zum Abschluss noch einmal die zwei Skripte komplett als Funktionen, denen man die entsprechenden Werte als Parameter übergeben kann:
Setzen der „Senden als“-Berechtigung
1 2 3 4 5 6 7 8 9 10 11 |
function add-sendas-permissions { param($identity, $mailToAdd) $credential = Get-Credential $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://SEXC01/PowerShell/ -Authentication Kerberos -Credential $credential Import-PSSession $session -CommandName Add-ADPermission Add-ADPermission -Identity $identity -User $mailToAdd -AccessRights ExtendedRight -ExtendedRights "Send As" Remove-PSSession $session } |
Auslesen der „Senden als“-Berechtigung
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function get-mailbox-info { param($mail, $identity) $credential = Get-Credential $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://SEXC01/PowerShell/ -Authentication Kerberos -Credential $credential Import-PSSession -Session $session -CommandName Get-Mailbox, Get-CASMailbox, Get-ADPermission $mb = Get-Mailbox $mail $users = $mb | Get-ADPermission | where {($_.ExtendedRights -like "*Send-As*") -and ($_.IsInherited -eq $false) -and -not ($_.User -like "NT AUTHORITY\SELF")} $sendAsMailAddresses = New-Object System.Collections.ArrayList($null) foreach($user in $users) { $adUser = Get-ADUser $user.User.Split("\")[1] -Properties mail $sendAsMailAddresses.Add($adUser.mail) } Write-Host $sendAsMailAddresses Remove-PSSession $session } |
Leave a Reply
<p>Danke für Ihre Anregungen, Fragen und Hinweise.<br/>Infos zum <a href="https://www.active-directory-faq.dekontakt/">Datenschutz</a></p>