<# 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 } } } } #>