Exchange Online / Office 365 : Erstellen einer dynamischen Verteilerliste

Um uns die Arbeit etwas zu erleichtern haben wir unseren internen E-Mail Verteiler auf eine DynamicDistributionGroup in Exchange Online umgestellt. Das erspart uns die Arbeit neue Mitarbeiter immer manuell in den Verteiler aufzunehmen, außerdem reduziert es die Fehler (oder das vergessen die neuen User hinzuzufügen). Da wir in unserer Umgebung auch einige Funktionspostfächer haben mussten diese ausgeschlossen werden.

Erstmal habe ich eine Verteiler Gruppe erstellt in der ich die ganzen Funktionspostfächer aufnehme.
New-DistributionGroup -Name 'NODYNDIS'
Set-DistributionGroup -Identity 'NODYNDIS' -HiddenFromAddressListsEnabled $True
Mit einem ADD Befehl kann man neue Funktionspostfächer hinzufügen.
Add-DistributionGroupMember -Identity 'NODYNDIS' -Member 'user-email@domain'
Dann brauchen wir den DN der Gruppe für den Filter in der dynamischen Gruppe
Get-Group -Identity 'NODYNDIS' | Select-Object -ExpandProperty DistinguishedName

CN=NODYNDIS,OU=xxx,OU=xxx,DC=xxx,DC=xxx,DC=xxx
Dann kann man die dynamische Gruppe erstellen.
New-DynamicDistributionGroup -Name 'TESTVERTEILER' -RecipientFilter {((RecipientTypeDetails -eq 'UserMailbox') -and -not (MemberofGroup -eq 'CN=NODYNDIS,OU=xxx,OU=xxx,DC=xxx,DC=xxx,DC=xxx') -and -not (UserAccountControl -eq 'AccountDisabled, NormalAccount'))}
Kurz zur Erklärung der Filter :
(RecipientTypeDetails -eq 'UserMailbox')  : Es muss sich um ein Benutzer Postfach handeln
-and -not (MemberofGroup -eq 'CN=NODYNDIS,OU=xxx,OU=xxx,DC=xxx,DC=xxx,DC=xxx') : und nicht Mitglied dieser Gruppe
-and -not (UserAccountControl -eq 'AccountDisabled, NormalAccount') : User darf nicht deaktivert sein
Anzeigen aller Empfänger in dem dynamischen Verteiler
$mygroup = Get-DynamicDistributionGroup "TESTVERTEILER"
Get-Recipient -RecipientPreviewFilter $myGroup.RecipientFilter | Select Name,PrimarySmtpAddress

Infos :
Filterbare Eigenschaften für RecipientFilter
New-DynamicDistributionGroup
New-DistributionGroup
Set-DistributionGroup


Office 365 : Probleme beim Zugriff auf One Drive aus der UI heraus

Problem : Wir hatten hier einige User in unserem Tenant die aus dem Portal nicht auf ihr One Drive zugreifen konnten. Die Fehlermeldungen waren nicht wirklich hilfreich. Es sind immer wieder solche Fehler aufgelaufen.
one drive errors
Ein Ticket bei Microsoft hat uns dann die Lösung gebracht, auch wenn wir es nicht 100% nachvollziehen können. Vermutlich wird durch das Get-SPOSite ... | Select Owner ein neues provisioning angetriggert der dann das Feld füllt und dann auch der Zugriff aus der UI funktioniert. Ok einfach in Kurz .. davor ging es nicht danach konnte der User zugreifen ;-)
Lösung : Das Provisioning auslösen mit diesem Powershell Befehl
Get-SPOsite https://contoso-my.sharepoint.com/personal/user1_contoso_onmicrosoft_com | Select-Object -Property Url, Owner

Wir haben das alles nochmal in ein Skript geschrieben das noch andere Sachen checkt & korrigiert :-)
Hier gehts zum Skript : jhochwald/FixPersonalSPOSite.ps1

Office 365 : Anzeigen aller Gäste incl. Team

Unser Datenschützer wollte eine Übersicht über alle Gäste und den dazugehörigen Teams. Das kleine Skript erledigt diese Aufgabe für euch.

# Connect to Microsoft Teams
Connect-MicrosoftTeams
# Get all Guests and Teams
$Teams = Get-Team
$GuestUser = foreach ($Team in $Teams) 
{    
Get-TeamUser -GroupId $Team.GroupId | Where-Object -FilterScript {$_.Role -eq 'Guest'} | Select-Object -Property User, Role, @{n = 'TeamName';e = {$Team.DisplayName} }
}
#Export-CSV
$paramExportCsv = @{
   Path              = "c:\Externe\ExterneUser.csv"
   Force             = $true
   Encoding          = 'UTF8'
   Delimiter         = ';'
   NoTypeInformation = $true
}
$GuestUser | Export-Csv @paramExportCsv

Exchange Online / Office 365 : Connect to Exchange Online using Exchangev2 Module

Installieren des Modules :
Install-Module -Name ExchangeOnlineManagement
Jetzt kann man mal prüfen ob alles sauber installiert ist.
Verbindung zu Exchange Online aufbauen
$ParaConnectExchange = @{
   UserPrincipalName    = 'ADMIN-USER'
   ShowProgress         = $false
   ShowBanner           = $false
   EnableErrorReporting = $false
   UseMultithreading    = $true
   TrackPerformance     = $false
}
Connect-ExchangeOnline @ParaConnectExchange

Das ist der neue Weg, und wenn man MFA aktiviert hat erscheint jetzt auch die Abfrage.

Linux : ~/ sichern mit Borgbackup

Ich habe hier einiges an sensible Daten in meinem Homeverzeichnis die ich nicht verlieren möchte. Deswegen habe ich mir ein borgbackup eingerichtet das mir alle 30 Minuten ein Backup auf meine zweite HDD schiebt. Da beide HDD bei mir mit LUKS verschlüsselt sind ist das Repo nicht gesondert gesichert.

Sollte man hier auf ein NFS oder ein anderes unverschlüsseltes Ziel sichern rate ich zu einer encryption !

Installieren von borgbackup
sudo apt install borgbackup
dann richten wir auf der zweiten HDD ein Repo ein. Das hab ich dann so gemacht
mkdir -p /media/chris/hdd2/backup
cd /media/chris/hdd2/backup
natürlich muss der mountpoint eurer Umgebung angepasst werden. Jetzt initialisieren wir das REPO für das Backup
borg init -e none /media/chris/hdd2/backup
Nochmal der Hinweis -e none kommt bei mir nur zum Einsatz da ALLE HDDs in meinem Notebook mit LUKS verschlüsselt sind
Ab jetzt kann man Backups in das Verzeichnis machen. Ich hab mir hier das ein Script zusammengebaut
!/bin/bash
_bbin=$(which borg)
_tbin=$(which tee)
# -----------------------------------------------------------------
# VARs
# -----------------------------------------------------------------
_own_path=$(dirname $(readlink -f ${0}))
_mnt_path="" # mount point 2 hdd
_src_path="" # was soll gesichert werden ? z.B. /home/test sichert das komplette Homeverzeichniss
_exclude="" # welche Verzeichnisse sollten nicht gesichert werden ? z.B. /home/test/Downloads
_tar_path="" # Wohin wird gesichert
_repo_name="HOME-$(date '+%Y%m%d-%H%M%S')" # Name der Sicherung
_borg_para="-v --stats -C lz4" # Parameter für das Borgbackup
_borg_log="${_own_path}/logs/borg.log" # wo liegt das log
# -----------------------------------------------------------------
# parameter for borg prune
# https://borgbackup.readthedocs.io/en/stable/usage/prune.html
KH=2    # keep hourly
KD=2    # keep daily
KW=4    # keep weekly
KM=3    # keep monthly
# create prune parameter
_borg_prune=""
if [ ${KH} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-hourly=${KH}"
fi

if [ ${KD} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-daily=${KD}"
fi

if [ ${KW} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-weekly=${KW}"
fi

if [ ${KM} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-monthly=${KM}"
fi
# -----------------------------------------------------------------
# check folders
if [ ! -d "${_own_path}/logs" ]; then
    mkdir -p "${_own_path}/logs"
fi
# -----------------------------------------------------------------
# write all to logfile
exec > >(${_tbin} -i ${_borg_log})
exec 2>&1
# -----------------------------------------------------------------
_chk_mnt=$(mount | grep -iq "${_mnt_path}")
if [ $? -eq 0 ]; then
    echo -e "\n#----------------------------------------------------------------------------------------------#"
    echo "############### borg create ####################################################################"
    echo -e "#----------------------------------------------------------------------------------------------#\n"
    ${_bbin} create ${_borg_para} ${_tar_path}::${_repo_name} ${_src_path}
    if [ $? -eq 0 ]; then
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg prune #####################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} prune --list ${_tar_path} ${_borg_prune}
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg list ######################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} list ${_tar_path}
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg info ######################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} info ${_tar_path}
    fi
    exit 0
else
    echo "$(date '%Y%m%d %H:%M') - ${_mnt_path} is not mounted exited" >> ${_borg_log}
    exit 1
fi
diese Script legt man sich jetzt irgendwo auf die Platte und ruft es in crontab auf z.B. alle 30 Minuten
*/30 * * * * /scripts/create_borg_backup.sh

Exchange Online / Office 365 : DistributionGroup "Sie verfügen nicht über ausreichende Berechtigungen"

Problem : Beim Versuch eine DistributionGroup zu bearbeiten erscheint die Meldung das man nicht über ausreichend Rechte verfügt.
Sie verfügen nicht über ausreichende Berechtigungen. Dieser Vorgang kann nur von einem Manager der Gruppe ausgeführt werden.
    + CategoryInfo          : NotSpecified: (:) [Remove-DistributionGroup], OperationRequiresGroupManagerException
Lösung : Das Problem ist schnell mit Powershell gefixt.
Set-DistributionGroup -Identity VERTEILEREMAIL -ManagedBy "NEUERUSER" -BypassSecurityGroupManagerCheck
wenn der vorhandene Owner nicht überschrieben werden soll dann kann man diesen Befehl verwenden zu hinzufügen neuer Owner
Set-DistributionGroup -Identity 'VERTEILEREMAIL' -ManagedBy @{Add='USER1','USER2'} -BypassSecurityGroupManagerCheck -WhatIf
Quelle : https://docs.microsoft.com/de-de/exchange/troubleshoot/groups/no-sufficient-permissions-moving-dg
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)