Benutzer-Werkzeuge

Webseiten-Werkzeuge


powershell:system:copy-exchangepermissionstomailstore

Copy-ExchangePermissionsToMailstore.ps1

Mailstore-Archivierungsarten

Mailstore unterscheidet generell zwischen einer Journal-Archivierung und Archivierungsläufen über benannte Postfächer.

Für die Journal-Archiverung wird an einer Postfach-Datenbank das Journal-Postfach archiviert und eine Kopie aller ein- und ausgehenden Emails der in dieser Datenbank liegenden Postfächer an das Journalpostfach gesendet.

Bei den Archivierungsläufen werden Postfächer durchsucht und neue Emails werden aus dem Postfach in das Archiv kopiert. Dabei entscheidet der erste Fundort im Postfach über den Ablageort im Archiv. Wird eine Email an ein per Journal archiviertes Postfach gesendet oder diesem erhalten, so werden die Emails auch beim regulären Empfänger sofort in das Archiv kopiert. Sie tauchen dann unter „Journal Incoming“ oder „Journal Outgoing“ auf.

Mailstore-Archivberechtigungen

Generell ist es kein Problem, die Berechtigung auf ein Archiv anhand der Email-Adresse eines AD-Kontos mit eindeutiger Zuordnung abzuleiten. Problematisch ist die Berechtigung bei gemeinsam benutzten Postfächern (z.B. Abteilungs- oder Funktionspostfächer). Mailstore kennt keinen direkten Weg, solche zusätzlichen Berechtigungen Berechtigungen im AD auszulesen und auf das Archiv zu übertragen. Für diesen Einsatzzweck kann die Powershell-API verwendet werden.

Das Skript

Copy-ExchangePermissionsToMailstore.ps1
<# Mailstore Benutzerverwaltung
Version=2.0
Autor: Henning Löser
Datum: 17.07.2018
 
== Historie ===================================
Version 2.0: 17.07.2018
Umstellung der Benutzeridentifizierung von Alias auf Anmeldename
Löschen der Benutzerrechte und setzten als folgende Schritte pro Archiv
 
Version 1.2: 25.02.2016
Gruppenmitgliedschaft der Ressourcenpostfächer prüfen und ggf. korrigieren
 
Version 1.1: 08.12.2015
Groß- und Kleinschreibung der AD-Objkete wird von Mailstore nicht übernommen, 
alle Objekte in Kleinbuchstaben übergeben
 
Version 1.0: 30.09.2014
Produktive Nutzung
#> 
 
### 1. Definitionen und Import benötigter Funktionen
##  1.1 Logging
# Logdatei setzen und Logaufzeichnung starten
$timestamp=(Get-Date -Format yyy-MM-dd-HHmmss)
$LogFile="C:\_Skripte\Logs\email_archiv_berechtigungen\$timestamp`.log"
Start-Transcript -Path $LogFile
 
# Mailstore API importieren
Import-Module "C:\_Skripte\Modules\MailstoreApiWrapper\MS.PS.Lib.psm1"
 
# Exchange-SnapIn importieren
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
 
# Domäne festlegen
$AD_Domain="SECUNET"
 
# Archiv-DB festlegen und Postfachrechte in Variable speichern
# Es werden nur Rechte von Archiven verwaltet, deren Postfächer in der Exchange-Datenbank liegen
$Exchange_Archiv_DB="Journal Archiv 1"
 
 
# AD-Gruppe für die Anlage neuer Archive
# Es werden nur neue Archive angelegt für Postfächer in den Gruppen GLO_MA_INT, GLO_MA_EXT und RESSOURCENARCHIV
# GLO_MA_INT und GLO_MA_EXT werden automatisch befüllt
# RESSOURENARCHIV muss bei Anlage des Postfach manuell als Mitglied hinzugefügt werden. Wird das vergessen, erfolgt die Zuordnung hier noch einmal automatisch
$ArchivGruppe = "RessourcenArchiv"
 
# Postfächer der Exchange-Datenbank "$Archivgruppe abfragen
$ArchivMembersFromDB = Get-Mailbox -Database $Exchange_Archiv_DB | Select-Object samaccountname
 
# Mitglieder der Gruppe $ArchivGruppe abfragen
$ArchivMembersFromGroup = (Get-ADGroupMember -Identity $ArchivGruppe).SamAccountName
 
# Vergleich von $ArchivMembersFromDB und $ArchivMembersFromGroup
foreach ($ArchivMemberFromDB in $ArchivMembersFromDB)
    {
    # Wenn Postfach Mitglied in der Gruppe ist
    if ($ArchivMemberFromDB.samaccountname -in $ArchivMembersFromGroup)
        {
        # Debug: Textausgabe nur einkommentieren bei Problemen
        #write-host "Bestehendes Mitglied von `"$ArchivGruppe`": $($ArchivMemberFromDB.samaccountname)"
        }
    # Wenn Postfach nicht Mitglied in der Gruppe ist
    else
        {
        # Textausgabe und Postfach zu der Gruppe hinzufügen.
        write-host "Neues Mitglied von `"$ArchivGruppe`": $($ArchivMemberFromDB.samaccountname)"
        Add-ADGroupMember -Identity $ArchivGruppe -Members $($ArchivMemberFromDB.samaccountname)
        }
    }
 
 
# Exchange-Archiv-Postfach-OU
# Es werden nur Rechte von Archiven verwaltet, deren Postfächer in der folgenden OU liegen
$Exchange_Archiv_OU="secunet.de/secunet/Postfach/"
 
# MailstoreSession konfigurieren
$mailstore_server="mail-archiv-01.secunet.de"
$mailstore_port="8463"
$mailstore_username = "admin"
$mailstore_password = get-content C:\_Skripte\etc\mailstore-cred.txt | ConvertTo-SecureString -Key (1..16)
#$mailstore_password = get-content C:\_Skripte\etc\mailstore-cred.txt | ConvertTo-SecureString
$mailstore_credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $mailstore_username,$mailstore_password
$mailstore_api = New-MSApiClient -Credentials $mailstore_credentials -MailStoreServer $mailstore_server -Port $mailstore_port -IgnoreInvalidSSLCerts
 
 
# zu setzende Mailstore-Rechte
$mailstore_default_permissions = "read,write"
$mailstore_no_permissions = "none"
 
 
### 2.  Informationen zusammentragen
##  2.1 Mailstore Rechte
 
# Alle Mailstore-User abfragen
$mailstore_users = (Invoke-MSApiCall $mailstore_api "GetUsers").result
 
# Die Berechtigungen aller MailstoreUser abfragen und in einem Array speichern
$MailstPermissionTable = @()
foreach ($mailstore_user in $mailstore_users)
    {
    $user=$mailstore_user.username
    $MailstPermissions=(Invoke-MSApiCall $mailstore_api "GetUserInfo" @{userName = $mailstore_user.userName}).result.privilegesOnFolders.folder
    foreach ($MailstPermission in $MailstPermissions)
        {
        if ($($user) -ne $MailstPermission)
            {
            $NewPermission=New-Object –TypeName PSObject
            $NewPermission | Add-Member –MemberType NoteProperty –Name UserName –Value $user.ToLower() –PassThru | Add-Member –MemberType NoteProperty –Name Archiv –Value $MailstPermission.ToLower() –PassThru
            $MailstPermissionTable+=$NewPermission
            }
        }
    }
 
# Array sorterien
$MailstPermissionTable = ($MailstPermissionTable | Sort-Object username,archiv)    
 
 
##  2.2 Exchange-Postfächer auslesen
$Exchange_Mailboxes=Get-Mailbox -Database "$Exchange_Archiv_DB"
#$Exchange_Permissions=($Exchange_Mailboxes | Get-MailboxPermission | where-object {($_.isinherited -eq $false) -and  ($_.user -like "$AD_Domain*") -and $_.user -notlike "$AD_Domain`\discovery*"} | select-object identity,user,samaccountname,customattribute7)
 
### 2.3 Alle Exchange-Berechtigungen abfragen
$All_Exchange_Permissions=($Exchange_Mailboxes | Get-MailboxPermission | where-object {($_.isinherited -eq $false) -and  ($_.user -like "$AD_Domain*") -and $_.user -notlike "$AD_Domain`\discovery*"} | select-object identity,user,samaccountname,customattribute7)
 
# Alle Exchangeberechtigungen einem Array speichern
$ExchPermissionTable = @()
foreach ($ExchPermission in $All_Exchange_Permissions)
    {
    $archiv=$($ExchPermission.identity.name)
    $user=$($ExchPermission.user).rawidentity.TrimStart("SECUNET\").tolower()
    $NewPermission=New-Object –TypeName PSObject
    $NewPermission | Add-Member –MemberType NoteProperty –Name UserName –Value $user.ToLower() -PassThru | Add-Member –MemberType NoteProperty –Name Archiv –Value $archiv.ToLower() -PassThru 
    $ExchPermissionTable+=$NewPermission
    }
 
# Array sorterien
$ExchPermissionTable = ($ExchPermissionTable | Sort-Object username,archiv)
 
#$ExchPermissionTable | Export-Csv -Delimiter ";" -Path C:\_Skripte\data\exchange-permissions.csv
#$MailstPermissionTable | Export-Csv -Delimiter ";" -Path C:\_Skripte\data\mailstore-permissions.csv
 
 
# Exchange und Mailstore-Array vergleichen
$changes=(Compare-Object $ExchPermissionTable $MailstPermissionTable -IncludeEqual)
 
# Was fehlt in Mailstore
$AddToMailstore=($changes | where-object sideindicator -like "<=")
 
# Was ist zu viel in Mailstore
$RemoveFromMailstore=($changes | where-object sideindicator -like "=>")
 
Write-Host "`n---`nBerechtigungen hinzufügen:"
foreach ($permission in $($AddToMailstore.inputobject))
    {
    Write-Host "User : $($permission.UserName) | Archiv: $($permission.Archiv)"
    (Invoke-MSApiCall $mailstore_api "SetUserPrivilegesOnFolder" @{userName = $($permission.UserName) ; folder = $($permission.Archiv) ; privileges = $mailstore_default_permissions}).result
    }
 
Write-Host "`n---`nBerechtigungen entfernen:"
foreach ($permission in $($RemoveFromMailstore.inputobject))
    {
    Write-Host "User : $($permission.UserName) | Archiv: $($permission.Archiv)"
    (Invoke-MSApiCall $mailstore_api "SetUserPrivilegesOnFolder" @{userName = $($permission.UserName) ; folder = $($permission.Archiv) ; privileges = $mailstore_no_permissions}).result
    }
 
 
Stop-Transcript
 
 
### 3.  Rechte Verwalten
<#
### 3.1 Rechte hinzufügen
foreach ($Exchange_Mailbox in $Exchange_Mailboxes)
    {
    Write-host "`n## Mailbox:" $($Exchange_Mailbox.samaccountname)
    $Exchange_Permissions=(Get-MailboxPermission $($Exchange_mailbox.samaccountname) | where-object {($_.isinherited -eq $false) -and  ($_.user -like "$AD_Domain*") -and $_.user -notlike "$AD_Domain`\discovery*"} | select-object identity,user)
 
    foreach ($Exchange_Permission in $Exchange_Permissions)
        {
        # Umformatierten Benutzernamen des AD-Benutzers in eine eigene Variable speichern
        $exchange_permission_user=($Exchange_Permission.user).RawIdentity.TrimStart("SECUNET\").tolower()
 
        # Welche berechtigungen hat der Benutzer am Archiv?
        $archive_permissions=(Invoke-MSApiCall $mailstore_api "GetUserInfo" @{userName = $exchange_permission_user}).result.privilegesonfolders.folder
 
        $adusercheck=get-aduser $exchange_permission_user
        # Debug: Ausgabe von Benutzername und Aktivierungsstatus
        Write-host "$($adusercheck.SamAccountName) $($adusercheck.Enabled)"
 
        if ($($adusercheck.enabled) -eq $true)
            {
            if ($($archive_permissions.contains($($Exchange_Mailbox.samaccountname))) -eq $true) 
                {
                # Debug: Augabe nur, wenn Benutzer keine Zugrifsrechte erhalten
#               Write-Host "Benutzer hat Zugriffsrecht:`n Exchange_permission_user $exchange_permission_user`n=> Exchange_Mailbox.samaccountname $($Exchange_Mailbox.samaccountname)"
                }
            Else
                {
                # Rechte von aktiven Benutzern auf das Archiv setzen
                Write-Host "Benutzer zu Archiv hinzufügen:`nexchange_permission_user $exchange_permission_user`n=> Exchange_Mailbox.samaccountname $($Exchange_Mailbox.samaccountname)"
                (Invoke-MSApiCall $mailstore_api "SetUserPrivilegesOnFolder" @{userName = ($exchange_permission_user|Out-String) ; folder = ($Exchange_Mailbox.samaccountname).tolower() ; privileges = $mailstore_default_permissions}).result
                }
            }
        }
    }
#>
powershell/system/copy-exchangepermissionstomailstore.txt · Zuletzt geändert: 2024/05/27 08:36 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki