Skip to the main content.

ScriptRunner Blog

Exchange Online – 2. Teil der Graph PowerShell Reihe

Inhaltsverzeichnis

Post Featured Image

Wie unterscheidet sich die Exchange Online-Administration mit dem Microsoft Graph PowerShell-Modul vom herkömmlichen Exchange Online-Management? Hier erhältst du praktische Einblicke und Beispiele für die Verwendung von Graph PowerShell für Postfacheinstellungen und die aktuell bestehenden Einschränkungen der Administrationsfunktionen.

 

Einführung

Exchange und PowerShell gehören zusammen, und die überwiegende Mehrheit der Administratoren von Exchange Online verwendet das PowerShell-Modul Exchange Online Management. Microsofts Graph PowerShell-Modul bietet ebenfalls Zugriff auf Exchange Online, wie die Cmdlets in den Sub-Modulen zeigen, jedoch keine vollständigen Abdeckung aller Funktionen. Warum sollte man es also verwenden?

 

Sub-Module

Das Microsoft Graph PowerShell Modul bietet derzeit 38 verschiedene Untermodule und tausende Cmdlets. Im Hinblick auf die Exchange-Verwaltung gibt es kein einziges Modul, das alle Cmdlets für Exchange in Graph enthält. Ein Untermodul sticht heraus: das Microsoft.Graph.Mail Modul, das zum Zeitpunkt des Verfassens dieses Artikels 75 Cmdlets enthält. Zum Vergleich: Das Exchange Online-PowerShell-Modul enthält zum Zeitpunkt der Erstellung dieses Artikels über 800 Cmdlets. Welche anderen Untermodule können bei der Verwaltung von Exchange nützlich sein?


Microsoft.Graph.Compliance
Microsoft.Graph.Security
Microsoft.Graph.Reports
Microsoft.Graph.Contacts

Diese vier Untermodule enthalten nützliche Cmdlets für die Arbeit mit Exchange Online. Administratoren finden hier nützliche Cmdlets für Aufgaben, die sich auf die Postfächer der Nutzer und nicht auf die Makroebene der Konfiguration von Exchange Online konzentrieren. Werfen wir einen Blick darauf, wofür Exchange Online PowerShell verwendet werden kann, und schauen wir uns einmal an, welche praktischen Aufgaben wir mit diesen Modulen ausführen können. 

 

Aufgaben der Exchange Online (ExO) Administration

Exchange ist ein komplexes Produkt mit vielen administrationsrelevanten Funktionen. Nachfolgend ein Beispiel, was wir mit dem Exchange Online PowerShell Modul (v3) verwalten können: 

  • Adressraumverfügbarkeit
  • Anti-Phishing
  • Anti-Spam
  • Aufbewahrungsrichtlinien
  • Clutter-Einstellungen (anzeigen, ein-/ausschalten von 'Clutter')
  • DKIM
  • Freigabe-Richtlinie
  • Globale Addressliste
  • Journaling/Protokollierung
  • Kontakte
  • Mailboxen – Kalender, Ordner, Berechtigungen, Importe, Migrationen, OOF
  • Mailflow-Konnektoren
  • Nachrichtenverfolgung
  • Nachrichtenverschlüsselung
  • Öffentliche Ordner
  • Quarantäne-Richtlinie
  • RBAC-Rollen
  • Regeln für den Posteingang
  • Richtlinien für E-Mail-Adressen
  • Richtlinien für mobile Geräte / OWA
  • Richtlinien für sichere Dateianhänge
  • Richtlinien für sichere Links
  • Transportregeln
  • Verteilergruppen (auch dynamisch)
  • und mehr.

Exchange und Graph PowerShell

Nachfolgend eine kurze Liste der Möglichkeiten von Graph. Sie ist stark vereinfacht, da es viele Cmdlets gibt, die wir in Graph für Exchange Online verwenden können, allerdings beschränken sich diese auf Optionen auf Nutzer-/Postfachebene.

  • E-Mail-Nachrichten senden
  • Postfachintegration auf niedriger Ebene – E-Mails, Ordner, Einladungen usw.
  • Kontakte
  • Nutzerfotos

Hinweis: Die oben aufgeführten Cmdlets sind sehr nutzerorientiert und bieten nur wenige oder gar keine administrative Optionen für Exchange Online.

Wie bei jeder Aufgabe in Graph können wir nicht davon ausgehen, dass Cmdlets, die sich auf Exchange beziehen, nur im Untermodul Microsoft.Graph.Mail vorhanden sind. Daher führen wir eine allgemeinere Abfrage durch, um zu sehen, welche Cmdlets mit dem Substantiv -email außerhalb des Mail-Submoduls existieren:


Get-Command *email*

01_email

Wie wir oben sehen können, gibt es Cmdlets mit dem Substantiv -email in den Graph-Untermodulen Reports, Identity und Teams

 

Aktuelle Funktionen in Graph 

Der Wunsch der Administratoren, Graph PowerShell anstelle von Exchange zu verwenden, scheint bei Microsoft wenig Wirkung gezeigt zu haben, da die verfügbaren Funktionen nicht vollständig sind.  Die Exchange Online-Verwaltung hat viele Facetten, die durch das Exchange Online PowerShell-Modul ausreichend abgedeckt werden, aber ein großer Teil der Backend-Verwaltung fehlt in Graph. Das bedeutet nicht, dass Graph für die Administration von Exchange ungeeignet ist, aber wir müssen uns über die Grenzen von Graph im Klaren sein. In diesem Abschnitt des Artikels werden wir uns mit einigen hervorragenden Einsatzmöglichkeiten von Graph PowerShell für Exchange Workloads beschäftigen.

 

Postfach-Operationen

Die meisten Cmdlets konzentrieren sich auf Nutzer und ihre Postfächer und können sehr nützlich sein, um Probleme mit Postfächern abzufragen und zu beheben.

 

Mail-Ordner

PowerShell kann verwendet werden, um Teile von Postfächern zu untersuchen, einschließlich Ordner. In Ordnern werden Dateien abgelegt und E-Mails für den geschäftlichen oder privaten Gebrauch organisiert. In diesen Ordnern können wir Dinge wie die Größe und Anzahl der gesamten und ungelesenen E-Mails abfragen. Warum sollte uns das interessieren? Outlook hat Grenzen, die sichtbar werden, wenn die Ordner zu groß werden. Die folgende Abfrage kann dies aufdecken, um Probleme bei der Outlook-Synchronisation zu beheben:


Get-MgUserMailFolder -UserId 22561a78-a72e-4d39-898d-cd7c57c84ca6 |
Format-Table DisplayName,*ItemCount,AdditionalProperties

02_screenshot of folders

Ordner-Screenshot 

Im obigen Screenshot sehen wir, dass einige Ordner tausende von Einträgen haben, aber die Anzahl nicht die Grenzen von Outlook überschreitet. 

Das obige Beispiel ist eine einfache Abfrage, aber was wäre, wenn wir alle Postfächer überprüfen wollten, um festzustellen, ob die Gesamtzahl der Elemente einen bestimmten Schwellenwert (z.B. 10.000) überschreitet, da dies die Leistung von Outlook beeinträchtigen könnte? Wie gehen wir vor?


foreach ($Mailbox in $Mailboxes) {
try {
$Folders = Get-MgUserMailFolder -UserId $Mailbox.Id -ErrorAction Stop |
Select-Object DisplayName, TotalItemCount
}
catch
{}
foreach ($Folder in $Folders) {
if ($Folder.TotalItemCount -gt 10000) {
$FolderName = $Folder.DisplayName
$MailboxName = $Mailbox.DisplayName
Write-Host "$MailboxName - $FolderName has over 10k mail items."
}
}
}

oder Write-Host wie folgt: 


   foreach ($Folder in $Folders) {
if ($Folder.TotalItemCount -gt 10000) {
$FolderName = $Folder.DisplayName
$MailboxName = $Mailbox.DisplayName
Write-Host "$($Folder.DisplayName) - $($Mailbox.DisplayName) has over 10k mail items."
}

 

Zu erwartende Ergebnisse dieses Codes, wenn Postfächer mehr als 10.000 Elemente in einem Ordner haben:

03_10000 items

10.000 Elemente überschritten

Es wurden vier Postfächer gefunden, die mehr als 10.000 Elemente im Posteingangsordner gespeichert haben. Wir können die Nutzer proaktiv auffordern, dies zu bereinigen, um zukünftige Probleme zu vermeiden.

Achtung: Wenn wir delegierte Berechtigungen verwenden, können wir nur Informationen über den lokalen Nutzer abrufen und müssen uns stattdessen über eine Anwendung mit Graph verbinden. 

 

Beispiel: 



$Thumbprint = '77643669B10C64A23B35DA761FEEF4222039F439'
$AppId = 'dad165ff-4Fa8-4d0f-bbf9-5F67876be441'
$TenantId = '5d0DD54e-0082-4eb8-a311-ce17a036f3f4'
Connect-MgGraph -CertificateThumbprint $Thumbprint -ClientId $AppId -TenantId $TenantId

 

Mailbox-Bereinigung

Hier gibt es verschiedene Szenarien: Wenn z.B. eine E-Mail unbeabsichtigt versendet wurde, können wir diese Nachrichten suchen und entfernen. Oder wir haben versehentlich die Microsoft Quarantäne-Benachrichtigung aktiviert, ohne die Nutzer zu informieren, und müssen diese E-Mails entfernen. Beide Szenarien können mit Graph PowerShell durchgeführt werden.

Stelle sicher, dass du dich wieder mit der Azure App to Graph verbindest, da wir so auf alle Postfächer zugreifen können. Zuerst ein Beispiellauf:



$UserID = '5fc8abf1-2178-4043-b601-4802e0a703cd'
Get-MgUserMessage -UserId $UserID -Filter "Subject eq 'Emails Quarantined for your mailbox.'"

 

04_quarantined emails

Eine Liste der ersten in Quarantäne verschobenen E-Mails im Ausgangspostfach

Einmalig, um die oberste Nachricht zu entfernen:
(Test ob die erwarteten Ergebnisse angezeigt werden)



Remove-MgUserMessage -UserId $UserID -MessageId
'AAMkADNhNWI1ODRiLTVmNjQtNGU4Mi1hYmRlLWFjMzJkYTY2Nzk2NQBGAAAAAABoWADN1g6YRpgk4ssxd16qBwCAEw_FeYpCSKoYCRXHiLVBAS0F7CqPAABpkGQwsqIcSYSWFGyKXc7bAAI4DSpIAAA='

 

Damit wird tatsächlich eine E-Mail-Nachricht entfernt. Als Nächstes wollen wir alle Nachrichten für einen Nutzer entfernen:


$msgFilter = "Subject eq 'Emails Quarantined for your mailbox.'"
$EmailToRemove = (Get-MgUserMessage -UserId $UserID -Filter $msgFilter).Id
foreach ($Email in $EmailToRemove) {
Remove-MgUserMessage -UserId $UserID -MessageId $Email -WhatIf
}

 

Mit -WhatIf wird überprüft, ob das Cmdlet korrekt ist:

05_whatif switch

Der -WhatIf Switch meldet die E-Mails, die aus dem Postfach entfernt werden sollen

Entferne den -WhatIf Switch:


foreach ($Email in $EmailToRemove) {
Remove-MgUserMessage -UserId $UserID -MessageId $Email
}

Dann stellen wir fest, dass es noch mehr E-Mails gibt, die dieses Kriterium erfüllen. Warum ist das so? Graph und Paging. Wenn wir das Cmdlet ausführen, erhalten wir nur die 10 besten Ergebnisse. Wenn wir alle erhalten möchten, müssen wir Graph das mit dem Switch -All mitteilen.


$EmailToRemove = Get-MgUserMessage -UserId $UserID -Filter "Subject eq 'Emails Quarantined for your mailbox.'" -All

Jetzt bekommen wir alle:

06_count

Erster Durchlauf – Ergebnis 248 E-Mails

Anhand der Eigenschaft .Count sehen wir, dass weitere 248 E-Mails entfernt werden müssen. Dies liegt daran, dass Get‑MgUserMessage standardmäßig nicht alle Ergebnisse zurückgibt.

Es wird empfohlen, -WhatIf erneut auszuführen und dann die eigentliche Suche zu starten. Kontrolliere am Ende, ob noch Nachrichten vorhanden sind; es sollten keine mehr sein, das Ergebnis ist null:

07_second run

Zweiter Durchlauf – Null 

Nach erneutem Ausführen des Codes wurden alle E-Mails gelöscht und sind nicht mehr auffindbar.

 

Überprüfen von E-Mails im Postfach eines Nutzers

Es gibt ein zusätzliches Cmdlet, das die Anzahl der E-Mails in den Ordnern eines Nutzers abfragt, WENN wir die Ordner-ID haben.


Get-MgUserMailFolder -UserId $UserId |
Select-Object DisplayName,ID |
ForEach-Object {
Write-Host "$($_.DisplayName) - " -NoNewLine
Get-MgUserMailFolderMessageCount -UserId $UserId -MailFolderId $_.Id
}

08_Get-MgUserMailFolderMessageCount

Gesamtzahlen der Ordner

Get-MgUserMailFolderMessageCount kann auch verwendet werden, um die Gesamtzahl der Ordner zu ermitteln.

 

Fotos der Nutzer  

Nutzerfotos waren eine Zeit lang eine Funktion von Exchange Online PowerShell, da Exchange der Workload war, mit dem Unternehmen auf Microsoft 365 umgestiegen sind. Jetzt, da Exchange nicht mehr im Mittelpunkt des Microsoft 365-Ökosystems steht, hat Microsoft diese Funktionalität entfernt und stattdessen eine Lösung in Graph PowerShell eingeführt. Innerhalb von Graph gibt es vier Cmdlets, die auf Benutzerfotos ausgerichtet sind:


Get-MgUserPhoto
Get-MgUserPhotoContent
Remove-MgUserPhoto
Set-MgUserPhotoContent

To add a photo to an existing user, we can run code like this:


Set-MgUserPhotoContent -UserId Eric@powershellgeek.com -InFile C:\Data\SampleUserPhoto.jpg

Um zu beweisen, dass es funktioniert, können wir überprüfen, ob Eric tatsächlich ein Foto hat:


Get-MgUserPhoto -UserId Eric@powershellgeek.com

09_size of photo

Höhe und Breite des Nutzerfotos

Jetzt haben wir die Größe des Profilfotos des Nutzers: 91x100 Pixel. Und wir können das Foto ganz einfach herunterladen:


Get-MgUserPhotoContent -UserId Eric@powershellgeek.com -OutFile c:\data\SamplePhoto-Eric.jpg

samplePhoto-Eric

Exportiertes und importiertes Bild

Oben sind die beiden Fotos zu sehen, links das exportierte und rechts das importierte (Ansicht aus dem Verzeichnis "C:\Data").

Die Anwendung ist sehr einfach und kann auch in großen Mengen durchgeführt werden. Um herauszufinden, wer ein Foto hat und wer nicht, führen wir diesen Befehl aus:


Get-MgUser -All |
Select-Object DisplayName, Id |
ForEach-Object {
try {
$Photo = Get-MgUserPhoto -UserId $_.Id -ErrorAction Stop
Write-Host "$($_.DisplayName) has a photo." -ForegroundColor Green
}
catch {
Write-Host "$($_.DisplayName) is missing photo." -ForegroundColor Yellow
}
}

Das Ergebnis sieht folgendermaßen aus:

11_who has a photo like eric

Wer nutzt (wie Eric auch) ein Foto?

Einige Nutzer haben ein Foto, andere nicht. Jetzt können wir mit Graph PowerShell Fotos zu Nutzern hinzufügen.

 

Cmdlets entdecken

Hier ist es einfacher, ein konsolidiertes Modul für die Verwaltung eines Workloads zu verwenden, und damit meine ich Exchange Online Management. Graph ist ein Modell, das auf dem Zugriff auf API-URLs basiert, und Graph-PowerShell-Cmdlets sind Wrapper für diese API-Aufrufe. Das Problem ist, dass die Cmdlets, nach denen du suchst, um einen Workload zu verwalten, über eine ganze Reihe anderer Module verteilt sind. Probiere diese Suche aus und du wirst sehen, dass viele verschiedene Module referenziert werden:


Get-Command '*user*mail*' | Format-Table Name, Source

Diese Untermodule sind die eindeutigen Werte, die wir bei dieser Suche finden:

12_mail related cmdlets

Mailbezogene Cmdlets

Wir sehen, dass es tatsächlich eine ganze Reihe von Funktionen gibt, die PowerShell-Cmdlets für Mail enthalten. Für diejenigen, für die die Verwaltung einiger Aspekte von Exchange über Graph neu ist, wird es eine Lernkurve geben. Betrachte dies nicht als Hindernis, sondern als eine Reise durch die vielen Möglichkeiten, die Graph bietet. Tatsächlich sind einige der Cmdlets in Graph für Exchange sehr nützlich und erleichtern die Arbeit mit einigen Verwaltungsaufgaben. Die Erkundung verschiedener Aspekte des Postfachs eines Benutzers bedeutet, dass wir Graph PowerShell anstelle von EWS verwenden können, was gut ist, da Microsoft vor kurzem die Abschaffung von EWS angekündigt hat.

 

Fazit – letzte Gedanken

Microsoft Graph ist wie eine Schnitzeljagd. Cmdlets, die für einen Workload relevant sind, können aufgrund der Organisation von Graph in verschiedenen Untermodulen gespeichert sein. Wenn man dann noch die Berechtigungsebenen, Delegated vs. Application Permissions und PowerShell Cmdlets vs. Invoke0-RestMethod hinzunimmt, könnte ein Administrator das Gefühl bekommen, dass das gesamte Graph PowerShell SDK umständlich ist. Für die Funktionen, die es bietet, ist es jedoch eine gute Alternative, und in Bezug auf Exchange Online bietet Graph dringend benötigte Einblicke in die Postfächer der Nutzer, die mit der Exchange Online PowerShell möglicherweise nicht möglich sind. Was die allgemeine Eignung für die Verwaltung von Exchange Online betrifft, ist Graph einfach noch nicht so weit, und Administratoren müssen sich weiterhin auf die Exchange Online PowerShell-Module und die Security and Compliance PowerShell-Module zusammen mit Graph verlassen, um diese Arbeitslast effektiv zu bewältigen. Es ist wahrscheinlich, dass Microsoft in der Zukunft einen Punkt erreichen wird, an dem dies nicht mehr der Fall sein wird. Heute ist das jedoch noch nicht der Fall.

 

 

Good2know

Eric übernimmt das Büro!

Du fragst dich, wer Eric ist und warum wir dieses Hundebild für den Blogpost ausgewählt haben?

Eric-1

 Schau dir das Video mit dem wunderbaren Eric hier oder auf LinkedIn an!   LinkedIn.svg

 

🐾 Eric übernimmt das Büro! 🐾

 Rate mal, wer unser Mitarbeiter des Monats ist (und des des letzten Monats und des nächsten)?
Eric, unser Labrador! Er übernimmt manchmal das Büro
und mit Hilfe von ScriptRunner hat er alles automatisiert – vom Versenden
"wichtiger" E-Mails bis hin zur perfekten Eintakung aller Administrations-Tasks.
Er hat sogar Zeit für ein Nickerchen unter dem Schreibtisch gefunden.
🐾 Spoiler: Er ist ein Profi in Sachen Automatisierung und Entspannung! 🐾

🐶 Hier kommt Erics humorvolles Büroabenteuer in voller Länge! 🐶
Kommentiere gerne bei LinkedIn und verrate uns, ob du mehr über Eric erfahren willst.     LinkedIn.svg

 

Und wenn du ernsthaftere Hilfe suchst, empfehlen wir dir unsere Cheat Sheets:

Dein unverzichtbares PowerShell Cheat Sheet,
um Microsoft Exchange zu automatisieren

Vereinfache dein Microsoft Exchange Management mit unserem 5-seitigen PowerShell Cheat Sheet für Microsoft Exchange. Dieser unverzichtbare Leitfaden fasst wichtige PowerShell-Befehle und bewährte Methoden zusammen, um wiederkehrende Aufgaben zu automatisieren, Benutzer zu verwalten und Einstellungen mühelos zu konfigurieren. Egal, ob du neu bei Exchange bist oder ein erfahrener Administrator – das Cheat Sheet ist darauf ausgelegt, deine Arbeit einfacher und effizienter zu gestalten.

Exchange Cheat Sheet für PowerShell Scripting

Hier liegt dein Exchange Cheat Sheet!

 

 

Dein ultimatives PowerShell Cheat Sheet

Entfalte das volle Potential von PowerShell mit unserem praktischen Poster. Egal ob Anfänger oder erfahrener Profi, dieses Cheat Sheet ist darauf ausgelegt, dein Anlaufpunkt für die wichtigsten und am häufigsten verwendeten cmdlets zu sein.

Das Poster gibt es zum Download und in Papierform.

PowerShell Poster 2023

Hol dir hier dein Poster!

 

 

Weiterführende Links

Zusammenhängende Posts

13 min read

Lizenzen und Microsoft Graph PowerShell

Das Microsoft Graph SDK PowerShell-Modul ersetzt zwei andere Module. Erfahre mehr darüber, wie du dich mit Graph...

12 min read

Hilfe bei Migration zu Graph – das Ende der Azure AD und MSOnline Module

Mit der Abkündigung von MS Online und dem Azure AD-Modul ist es an der Zeit, die bisherigen Abläufe durch neue Lösungen...

15 min read

Exchange Online – 2. Teil der Graph PowerShell Reihe

Wie unterscheidet sich die Exchange Online-Administration mit dem Microsoft Graph PowerShell-Modul vom herkömmlichen...

Über den Autor: