MailboxACL

Alle Skripte sind Muster ohne jede Gewährleistung oder Funktionsgarantie. für Schäden bin ich nicht verantwortlich. Achten Sie auf Zeilenumbrüche bei der Übernahme.

2h Exchange Cache Änderungen im Active Directory wie SendAs oder FullMailboxAddress müssen erst im AD repliziert werden und dann von Exchange neu eingelesen werden. Per Default puffert Exchange frühere Antworten aber für bis zu 2 Stunden. Dies kann durch den Wert von "Mailbox Cache Age Limit" (siehe KB 326252 Exchange 2000 mailbox size limits are not enforced in a reasonable period of time; fix requires Exchange 2000 SP2" verändert werden.

Das Skript hilft auch bei der Suche nach "vergessenen Berechtigungen", die eine Exchange Online - Migration behindern könnten

Dieses Skript ist als Muster zu verstehen und zeigt, wie seit Exchange 2000 SP2 auch per VBScript die Mailboxberechtigungen eines Benutzers auslesen. Bislang war dies immer nur in der MMC für Benutzer und Computer zu erreichen und nur sehr schwer programmatisch zu setzen. Seit Exchange 2000 SP2 hat Microsoft nun auch die DLLs installiert, die den Zugriff erlauben.

Zwar gibt es auch im Active Directory ein Feld "msExchMailboxSecurityDescriptor", in dem Berechtigungen gespeichert werden, aber diese sind nicht ausschlaggebend, sondern werden nur bei der Neuanlage einer Mailbox in den Store übernommen. Erst der Zugriff über die entsprechenden Methoden ändern die effektiven Rechte auf dem Postfach im Store selbst. Leider werden die beiden Speicherorte anscheinend nicht abgeglichen.

Aber auch wenn Sie sich die Postfachberechtigungen anzeigen lassen, dann sehen Sie auf den ersten Blick nur eine vereinfachte Zusammenfassung:

Erst die erweiterte Ansicht zeigt die einzelnen ACL-Einträge einzelne an.

Genau diese Liste wird über das VBScript ausgegeben. Es eignet sich daher für die Dokumentation und zum Vergleich von Einstellungen.

Aufruf und Durchlauf

Das hier vorliegende Skript erwartet als Eingabe einen Benutzer, der anhand des "distinguishedName", seiner primären Mailadresse (Mail) oder den Alias (MailNickName) angegeben werden kann. Wird kein Namen als Parameter angegeben, dann fragt das Skript interaktiv nach dieser Information.

Die Ausgabe erfolgt wieder auf der Konsole, so dass Sie diese auch in eine Datei umleiten können. Hier ein verkürzter Auszug.

Wenn Sie sich den Quelltext anschauen, dann werden Sie am Anfang eine lange Definition der verschiedenen Berechtigungen finden. Sie können die Detailausgabe einfach über die Konstante am Anfang abschalten. Mit etwas Verständnis können Sie anhand der Textausgabe die entsprechenden Einträge in der erweiterten Ansicht der MMC problemlos zuordnen.

mbacl.1.2.vbs.txt
Nach dem Download bitte die Endung TXT entfernen

Der Aufruf ist denkbar einfach. Starten Sie das Programm einfach unter Angabe der Mailadresse, des Alias oder des DN.

cscript.exe mbacl.vbs ou=test,dc=msxfaq,dc=local
cscript.exe mbacl.vbs alias
cscript.exe mbacl.vbs User@example.com

Wenn Sie das Skript einfach ohne einen Parameter aufrufen, dann erfragt eine Eingabebox den Parameter

Damit das Skript funktionieren kann, muss natürlich der Benutzer ein Exchange Postfach haben, auf dem Computer der Exchange System Manager mit installiert sein und Sie die Berechtigungen zum Lesen der Einträge haben.

Details zu den Rechten

Jedes Objekt hat eine Zugriffssteuerungsliste (Access Control List, ACL). Wie der Namen "Liste" schon sagt, können dort mehrere Einträge (Accress Control Entry, ACE) aufgeführt sein. Jeder der Einträge gliedert sich noch mal in vier Teile auf, die letztlich den Eintrag spezifizieren. Dies sind:

  • AccessMask
    Hierin stehen die Berechtigungen, die durch diesen Eintrag gegeben oder entzogen werden.
  • AceType
    Definiert die Art des Eintrags. Sie werden meist nur ein "ADS_ACETYPE_ACCESS_ALLOWED" oder "ADS_ACETYPE_ACCESS_DENIED" sehen. Diese Flag bestimmt, ob die Rechte erlaubt oder entzogen werden. Es gibt aber noch weitere Typen wie z.B. Audit-Einnträge etc
  • AceFlags
    Diese Eigenschaft steuert und beschreibt, ob das Recht direkt vergeben oder von oben herab vererbt wurde und ob es selbst weiter vererbt werden kann
  • Flags
    Bestimmt, ob der Objekttyp der ACL direkt definiert ist oder über Vererbung kommt.

Eine Auflistung aller möglichen Rechte finden Sie in der MSDN. für die Postfachrechte sind folgende Einträge der AccessMask interessant:

Recht

AccessMask

Postfachspeicher löschen

ADS_RIGHT_DELETE

Leseberechtigungen

ADS_RIGHT_READ_CONTROL

Änderungsberechtigungen

ADS_RIGHT_WRITE_DAC

In Besitz nehmen

ADS_RIGHT_WRITE_OWNER

Vollständiger Postfachzugriff

ADS_RIGHT_DS_CREATE_CHILD
ADS_RIGHT_DS_DELETE_CHILD (?)

Zugeordnetes externes Konto

ADS_RIGHT_ACTRL_DS_LIST

Ich hoffen anhand einer Analyse meiner eigenen Berechtigungen die Daten richtig wiedergegeben zu haben, denn offiziell habe ich noch keine Quelle zur Zuordnung von Exchange Mailboxrechten zu ACL-Konstanten gefunden.

PowerShell-Version

VBScript war damals mit Exchange 2000/2003 noch gesetzt. Mitterlweile können Sie viele Dinge einfach per PowerShell machen:

# get-mbacl.ps1
#
# Reporting der SendAs und FullAccess Berechtigungen

Begin {
    Write-host "Get-Mailboxacl: Start"
}

Process {
    $mailbox = $_
    write-host "Mailbox $($mailbox)"

    write-host "loading ADPermission"
    $sendasacl= Get-ADPermission -Identity $mailbox | Where-Object {$_.ExtendedRights -like 'Send*'  -and $_.IsInherited -eq $false}
    foreach ($sendas in $sendasacl) {
        $result = "" | Select-Object mailbox,user,permission
        $result.mailbox = $mailbox
        $result.user = $sendas.user
        $result.permission = "SendAs"
        $result
    }

    write-host "loading MBPermission"
    $mbrechte = Get-MailboxPermission $mailbox  `
                    | Where-Object {$_.AccessRights -like 'Full*' -and $_.IsInherited -eq $false}
    foreach ($mbrecht in $mbrechte) {
        $result = "" | Select-Object mailbox,user,permission
        $result.mailbox = $mailbox
        $result.user = $mbrecht.user
        $result.permission = "FullAccess"
        $result
    }
}

End {
    Write-host "Get-Mailboxacl: End"
}

Der Aufruf geht dann einfach per Pipeline, d.h. die Liste der Postfächer kommt per Pipeline und die Ausgabe können Sie auch weiter verarbeite

# einzelne Mailbox auf den Bildschirm ausgeben
"user1" | .\get-mbacl.ps1

# Liste von Postfaechern aus Datei lesen und Ergebnis in CSV-Datei schreiben
get-content <datei mit Alias> | .\get-mbacl.ps1 | export-csv <csvdatei>

# Echte Postfaecher lesen und ausgeben
(get-maibox).alias | .\get-mbacl.ps1 | export-csv <datei>

Die Ausgabe kann natürlich auch in HTML oder andere Dateien ersetzt werden.

Weitere Links