Benutzer-Werkzeuge

Webseiten-Werkzeuge


powershell:system:copy-exchangepermissionstomailstore

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
powershell:system:copy-exchangepermissionstomailstore [2019/04/04 07:52] – angelegt henningpowershell:system:copy-exchangepermissionstomailstore [2024/05/27 08:36] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 9: Zeile 9:
 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.  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====== ====== Das Skript======
 +<file powershell 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
 +                }
 +            }
 +        }
 +    }
 +#>
 +</file>
powershell/system/copy-exchangepermissionstomailstore.1554357140.txt.gz · Zuletzt geändert: 2024/05/27 08:35 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki