FolderPermissions

FolderPermission und ModifyFolderPermission
Dieses Skript berichtet nur die aktuellen Berechtigungen. Ich habe auch eine Variante, mit der ich Berechtigungen setzen und löschen kann, was für zentrale Stellvertreter o.ä. sehr interessant ist aber auch sehr sensibel ist und daher nicht "public" ist.

VBScript und 64Bit !
Viele 32bit COM-Objekte lassen sich auf einem 64bit System nur instanziieren, wenn die 32bit Version von CSCRIPT/WSCRIPT genutzt wird, welcher unter C:\Windows\SysWOW64\cscript.exe liegt.

Wenn der Anwender auf ein anderes Postfach nur Leseberechtigungen hat, kann er die Mails nicht ändern (gelesen Status) aber auch keine Lesebestätigungen für E-Mails im freigegebenen Postfach versenden. Dummerweise kann er die E-Mails, für die eine Lesebestätigung angefordert wurde, nicht öffnen. Der Fehler lautet lapidar: "Sie besitzen nicht die erforderlichen Berechtigungen.

Die Exchange 2010 PowerShell enthält entsprechende Befehle, um die gleiche Funktion per PowerShell auszuüben:
Add-MailboxFolderPermission, Get-MailboxFolderPermission, Remove-MailboxFolderPermission

Normalerweise hat ein Benutzer in einem Netzwerk genau ein Postfach. Daher ist das Design von Exchange auch derart ausgelegt, dass Ein Active Directory Konto auch immer genau ein Exchange Postfach haben kann und umgekehrt. Soll ein Anwender also mehrere Konten verwenden, dann müssen Sie auch entsprechende Benutzer im Active Directory anlegen. Mit Exchange 2007 kommen ihnen die Ressourcen entgegen, um solche zusätzliche Postfächer einzurichten. Exchange selbst kennt drei bekannte Optionen, einem Benutzer bestimmte Berechtigungen auf ein anderes Postfach zu gehen.

  • SendAs
    Über dieses Recht kann ein Administrator auf einem Postfach einem anderen Benutzer das "SENDAS"-Recht geben, so dass diese Anwender eine Mail "Im Auftrag" des Postfachs versenden kann. Ein Zugriff auf Inhalte des Postfachs ist aber nicht möglich. Das Postfach kann als auch nicht in Outlook als zusätzliches Postfach eingebunden werden.
  • Full Mailbox Access
    Über dieses sehr weitreichende Recht kann ein anderer Benutzer das Postfach so nutzen, als wenn es das eigene Postfach wäre inklusive dem Zugriff auf als Privat gekennzeichnete Objekte. Der berechtigte Benutzer kann das Postfach direkt in Outlook zusätzlich einbinden oder über ein eigenes Profil verwenden.
  • Stellvertreter über Ordnerrechte
    Die dritte einfache Konfiguration kann der Benutzer selbst über die Einrichtung von Stellvertretern vornehmen.. Über das Menü kann der Anwender selbst auf die Systemordner Berechtigungen vergeben, die der Stellvertreter dann über "Ordner eines anderen Benutzers öffnen" ausüben kann. Er kann aber das andere Postfach ebenfalls nicht komplett einbinden, da er über diesen Weg keinen Zugriff auf den Stamm des Postfachs hat.

Es fehlt also ein "Mittelweg", über den ein Anwender schon das andere Postfach "einbinden" kann ohne gleich mit "Vollzugriff" agieren zu müssen. Bislang muss der Benutzer ausgehend vom Postfach auf jedem gewünschten Ordner dem Anwender die Rechte vergeben. Ungeschickt ist dabei, dass Outlook keine Vererbung von Berechtigungen erlaubt, so dass der Anwender jeden Ordner selbst anfassen. Das  ist mühsam und nicht jedem Vorstand verständlich zu machen, der seinem Sekretariat einfach nur Zugriffe gestatten möchte.

Also besteht der Wunsch, auf dem Server direkt per Skript diese Berechtigungen zu pflegen. Das Skript "FolderPermissions" erlaubt die serverseitige Konfiguration von Berechtigungen.

Lösungsansatz

Zuerst hatte ich versucht, über Outlook und VBA eine Lösung zu schaffen, damit der Anwender selbst einfach die Berechtigungen setzen kann. Allerdings stellt Outlook keine entsprechenden Funktionen bereit, so dass Drittprogramme (z.B. Redemption) einzusetzen wären. Zudem ist die Verteilung von VBA-Makros auf Clients auch nicht unbedingt einfach.

Aber CDO erlaubt durchaus eine Anzeige und Änderung von Berechtigungen, wenn eine kleine ACL.DLL registriert wird, die von Microsoft als Sourcecode (Siehe 240911 How To use ACL Object and CDO (1.21) to List Folder Permissions für a MAPI Folder) bereit gestellt wird. Natürlich ist dies auch wieder kein Weg, den ein Anwender selbst begehen sollte, aber über CDO, ACL.DLL, einen passenden Skript und den notwendigen Berechtigungen kann ja ein Administrator diesen "Service" übernehmen.

Datenschutz !
Ehe Sie das Programm ausführen, sollten Sie sich mehrfach vergewissern, dass Sie in Übereinstimmung mit den gültigen Gesetzen und Betriebsvereinbarungen handeln und den Benutzer vorab informieren, wer wann welche Berechtigungen erhält. Eventuell sollten Sie sich bei einem Rechtsbestand, Betriebsrat o.ä. absichern bzw. den Auftrag nur vom betroffenen Anwender selbst annehmen.

Dann aber ist das Skript sehr hilfreich um z.B. einer Gruppe von Personen Zugriff auf ein Supportpostfach zu geben oder einem Sekretariat den Zugriff auf das Postfach des Geschäftsführers einzurichten, wenn dieser nicht selbst jeden Ordner anfassen möchte.

Voraussetzungen

Ehe Sie das Skript einsetzen können, müssen Sie Natürlich einige Voraussetzungen schaffen:

  • Berechtigungen
    Sie müssen das Skript mit einem privilegierten Benutzer aufrufen, der zumindest in den Postfächern vollen Zugriff hat, die das Skript bearbeiten soll
  • CDO und Exchange
    Damit das Skript auf die Ordner der Postfächer zugreifen kann, muss das Skript die Collaboration Data Objects (Siehe MAPI/CDO) verwenden können, die auf dem System installiert sein müssen.
  • ACL.DLL
    Um die Berechtigungen zu analysieren und auch zu ändern benötigen Sie diese DLL, welche Microsoft nur als Sourcecode bereit stellt.

Dann sollte dem Einsatz nichts mehr entgegen stehen.

Das Skript

Das VBScript starten Sie am besten über die Kommandozeile mit CScript, damit die Bildschirmausgaben nicht als Message-Box permanent weg geklickt werden müssen. Zur Sicherheit fängt das Skript diesen Fehler aber ab und beendet sich. über die Kommandozeile wird gesteuert, welcher Benutzer (GAL Displayname) welche Berechtigungen (Reviewer, Author) erhält oder entzogen bekommt. Die Liste der Mailboxen (Alias oder SMTP-Adresse) wird über STDIN eingelesen.

Eine Liste der Mailboxen kann z.B. per PowerShell sehr einfach generiert werden:

get-mailbox | %{write-host $_.alias} | cscript ...

Das Skript selbst erwartet folgende Parameter:

echo fcarius | cscript SetFolderPermissions.1.2.vbs
    /server:Servername                   Name des Exchange Servers fuer die CDO Verbindung
    /delegate:"Anzeigename des Delegate" welches die Berechtigungen erhalten soll
    /role:Reviewer                       Berechtigung die addiert oder entfernt werden soll
    /mode:DEL                            Betriebsart: ADD addiert, READ liest, DEL entfernt
    /foldercsv:perms.csv                 Ergebnis CSV-Datei mit effektiven Berechtigungen

Anhand der CSV-Datei wird genau protokolliert, welche Berechtigungen gefunden und geändert wurden. Hier ein Auszug:

"mailbox" "foldername" "trustee" "permission" "action"
"fcarius" "Top of Information Store" "Default" "None" "INFO"
"fcarius" "Top of Information Store" "Anonymous" "None" "INFO"
"fcarius" "Top of Information Store/Posteingang" "Default" "None" "INFO"
"fcarius" "Top of Information Store/Posteingang" "Anonymous" "None" "INFO"

Das Trennzeichen ist im VBScript Natürlich änderbar. Per Default nutze ich einen "Tabulator". Mit dieser Datei ist auch ein Audit möglich, indem eine alte Version mit einer aktuellen Version verglichen wird. Das Skript selbst liest aber aktuell noch keine alte Datei ein, um dann basierend darauf Änderungen zu erkennen und Alarme zu versenden. Hier muss auch etwas Sorgfalt walten, da Benutzer durchaus auch Ordner umbenennen, verschieben, löschen oder anlegen können, was zu "Änderungen " führt.

Denkbar ist Natürlich auch den Start des Skripte im Rahmen eines Provisioning-Lösung, welche nach der Anlage des Postfachs erst einmal weitere Konten (z.B. Blackberry oder Archiv-Dienstkonten) zu berechtigen.

Kein Download
Das Skript ist noch in einer sehr frühen Phase, d.h. wurde bislang nur bei wenigen Kunden eingesetzt und ist daher noch nicht ausreichend getestet. Daher möchte ich eine Zeit lang noch den Einsatz persönlich betreuen. Dieses Skript steht nicht von ungefähr im Bereich "Private Tools", da der Einsatz von mir als sensibel eingeschätzt wird und ich daher das Skript nicht anonym zum Download anbieten kann.

Einsatz

Ehe Sie mit dem Skript arbeiten können, müssen Sie die ACL-DLL von Microsoft registrieren. Diese DLL addiert ein "COM-Objekt", mit welchem das Skript die Berechtigungen "lesbar" machen kann. Wenn dieses Modul fehlt, dann erhalten Sie die hier sichtbare Fehlermeldung "ActiveX-Komponente kann kein Objekt erstellen: 'MSExchange.aclobject".

 

Der Aufruf von "REGSVR32 acl.dll" löst dieses Problem. Wird dann das Skript aufgerufen, werden in der Konsole die gerade bearbeiteten Postfächer und deren Ordner ausgegeben. Auch etwaige Fehler sind hier schon zu erkennen:

Die komplette Ausgabe wird aber auch zur Protokollierung in eine Logdatei mit geschrieben. Viel interessanter ist Natürlich die Ausgabe der ermittelten Berechtigungen ein die entsprechende CSV-Datei. Hier ein Muster:

Diese Format kann sehr einfach z.B. in Excel oder eine Datenbank importiert werden. Selbst ein einfacher "WINDIFF" kann zwei solche Dateien in der Regel direkt vergleichen und Änderungen anzeigen.

Weitere Links