ExchangeOnlineManagement: installierte Version prüfen und das Modul sauber aktualisieren
Wer Exchange Online per PowerShell verwaltet, arbeitet oft mit einer Modulversion, die Monate alt ist – und merkt es erst, wenn Connect-ExchangeOnline zickt. Mit Get-Module -ListAvailable sehen Sie in Sekunden, welche Versionen auf dem System liegen. Dieser Beitrag zeigt, wie Sie die installierte Version mit der aktuellen Fassung in der PowerShell Gallery vergleichen, das Modul aktualisieren, Altlasten entfernen – und warum Sie beim Installieren genau auf den Modulnamen achten sollten.
Hintergrund: Warum die Version eine Rolle spielt
Das Modul ExchangeOnlineManagement (Exchange Online PowerShell V3) wird von Microsoft laufend weiterentwickelt. Neue Fassungen bringen Fehlerkorrekturen bei der Authentifizierung, neue Parameter und aktualisierte Abhängigkeiten (MSAL, OData). Ältere Fassungen funktionieren oft noch – bis Microsoft serverseitig etwas umstellt. Die beiden letzten Versionen sind ein gutes Beispiel:
| Version | Veröffentlicht | Wichtig für Administratoren |
|---|---|---|
| 3.10.1 | 24.07.2026 | Behebt Fehler bei der zertifikatbasierten Anmeldung (CBA, App-Only) sowie kleinere Leistungsprobleme – relevant für alle unbeaufsichtigten Skripte und geplanten Aufgaben. |
| 3.10.0 | 08.06.2026 | Unter PowerShell 7 ist nun mindestens Version 7.6 erforderlich. Windows PowerShell 5.1 ist davon nicht betroffen. |
Hinzu kommt: PowerShell installiert neue Modulversionen neben die alten. Nach einigen Updates liegen auf einem Admin-Server schnell drei, vier Fassungen in unterschiedlichen Ordnern – und welche davon tatsächlich geladen wird, ist nicht immer die, die man erwartet.
Schritt 1: Installierte Versionen anzeigen
Get-Module -ListAvailable – der vollständige Blick
Der Parameter -ListAvailable durchsucht alle Pfade aus $env:PSModulePath – unabhängig davon, ob das Modul geladen ist oder wie es installiert wurde:
Get-Module -Name ExchangeOnlineManagement -ListAvailable |
Sort-Object Version -Descending |
Select-Object Name, Version, ModuleBase
Die Spalte ModuleBase zeigt, wo die jeweilige Version liegt. Typische Pfade:
| Umgebung | Scope | Pfad |
|---|---|---|
| Windows PowerShell 5.1 | AllUsers | C:\Program Files\WindowsPowerShell\Modules |
| Windows PowerShell 5.1 | CurrentUser | %USERPROFILE%\Documents\WindowsPowerShell\Modules |
| PowerShell 7.x | AllUsers | C:\Program Files\PowerShell\Modules |
| PowerShell 7.x | CurrentUser | %USERPROFILE%\Documents\PowerShell\Modules |
Was ist in der aktuellen Sitzung geladen?
Ohne -ListAvailable zeigt Get-Module nur die Module, die gerade importiert sind. Das ist die Version, mit der Ihre Cmdlets tatsächlich laufen:
Get-Module -Name ExchangeOnlineManagement | Select-Object Name, Version, ModuleBase # Zusätzlich die PowerShell-Version prüfen (3.10.x braucht unter PS 7 mindestens 7.6) $PSVersionTable.PSVersion
Get-InstalledModule und Get-InstalledPSResource
Diese beiden Cmdlets zeigen nur Versionen, die über PowerShellGet bzw. PSResourceGet installiert wurden. Manuell kopierte Modulordner fehlen hier – genau deshalb ist Get-Module -ListAvailable für die Bestandsaufnahme die zuverlässigere Wahl.
# PowerShellGet (klassisch) Get-InstalledModule -Name ExchangeOnlineManagement -AllVersions # PSResourceGet (Nachfolger, ab PowerShell 7.4 enthalten) Get-InstalledPSResource -Name ExchangeOnlineManagement
Schritt 2: Mit der aktuellen Version in der Gallery vergleichen
Welche Fassung aktuell ist, liefert Find-Module. Lassen Sie sich dabei immer Autor und Firma mit ausgeben – dazu gleich mehr im Abschnitt zu den Fallstricken:
Find-Module -Name ExchangeOnlineManagement -Repository PSGallery |
Select-Object Name, Version, Author, CompanyName, PublishedDate
Das folgende Skript erledigt den Vergleich in einem Rutsch und eignet sich auch für eine regelmäßige Prüfung per geplanter Aufgabe:
$name = 'ExchangeOnlineManagement'
$installed = Get-Module -Name $name -ListAvailable |
Sort-Object Version -Descending |
Select-Object -First 1
$online = Find-Module -Name $name -Repository PSGallery -ErrorAction Stop
if ($online.Author -notmatch 'Microsoft') {
Write-Warning "Unerwarteter Autor in der Gallery: $($online.Author) - Abbruch."
return
}
if (-not $installed) {
Write-Host "$name ist nicht installiert. Aktuell verfügbar: $($online.Version)" -ForegroundColor Yellow
}
elseif ($installed.Version -lt [version]$online.Version) {
Write-Host "Update verfügbar: $($installed.Version) -> $($online.Version)" -ForegroundColor Yellow
}
else {
Write-Host "$name ist aktuell ($($installed.Version))." -ForegroundColor Green
}
Schritt 3: Das Modul aktualisieren
Schließen Sie vorher alle PowerShell-Fenster, in denen das Modul geladen ist – die DLLs sind sonst gesperrt. Für eine Installation im Scope AllUsers starten Sie die Konsole als Administrator.
Variante A: PowerShellGet
Update-Module -Name ExchangeOnlineManagement
Update-Module funktioniert nur, wenn das Modul ursprünglich mit Install-Module installiert wurde. Meldet das Cmdlet, das Modul sei nicht über Install-Module installiert worden, installieren Sie die aktuelle Fassung direkt:
Install-Module -Name ExchangeOnlineManagement -Repository PSGallery -Scope AllUsers -Force
Variante B: PSResourceGet
Update-PSResource -Name ExchangeOnlineManagement -Scope AllUsers # oder gezielt eine Version installieren Install-PSResource -Name ExchangeOnlineManagement -Version 3.10.1 -Scope AllUsers -Repository PSGallery
Ergebnis prüfen
Öffnen Sie eine neue Sitzung, laden Sie das Modul gezielt und testen Sie die Verbindung:
Import-Module ExchangeOnlineManagement -RequiredVersion 3.10.1 Get-Module ExchangeOnlineManagement | Select-Object Name, Version Connect-ExchangeOnline -ShowBanner:$false Get-OrganizationConfig | Select-Object Name Disconnect-ExchangeOnline -Confirm:$false
Schritt 4: Alte Versionen entfernen
Weder Update-Module noch Update-PSResource räumen auf. Ältere Versionen bleiben liegen und sollten bewusst entfernt werden:
$name = 'ExchangeOnlineManagement'
$latest = Get-InstalledModule -Name $name
Get-InstalledModule -Name $name -AllVersions |
Where-Object { $_.Version -ne $latest.Version } |
ForEach-Object {
Write-Host "Entferne $($_.Name) $($_.Version)"
Uninstall-Module -Name $_.Name -RequiredVersion $_.Version -Force
}
# Kontrolle: Es sollte nur noch eine Version übrig sein
Get-Module -Name $name -ListAvailable | Select-Object Version, ModuleBase
Taucht danach noch eine Altversion auf, wurde sie nicht über PowerShellGet installiert (zum Beispiel manuell kopiert oder im anderen Scope). Den Ordner aus ModuleBase können Sie in diesem Fall nach Prüfung von Hand löschen.
Fallstricke aus der Praxis
Install-Module genügt, um fremden Code mit Administratorrechten auszuführen. Kopieren Sie den Modulnamen daher aus einer verlässlichen Quelle und prüfen Sie vor jeder Installation Author und CompanyName – beim Original steht dort Microsoft Corporation.Ergänzend lässt sich prüfen, wer die Dateien des installierten Moduls signiert hat:
$base = (Get-Module ExchangeOnlineManagement -ListAvailable |
Sort-Object Version -Descending | Select-Object -First 1).ModuleBase
Get-ChildItem $base -Recurse -Include *.dll, *.psm1, *.psd1 |
Get-AuthenticodeSignature |
Group-Object Status, { $_.SignerCertificate.Subject } |
Select-Object Count, Name
Erwartet wird ein gültiger Status mit Microsoft als Signierer. Abweichende oder fehlende Signaturen sollten Sie sich genau ansehen, bevor Sie das Modul weiter nutzen.
Weitere typische Stolpersteine
| Symptom | Ursache und Lösung |
|---|---|
| Nach dem Update läuft weiter die alte Version | Das Modul war in der Sitzung bereits geladen. Neue Sitzung öffnen oder mit -RequiredVersion importieren. |
| Trotz Update in AllUsers wird eine alte Version importiert | Eine Altversion im Benutzerprofil (CurrentUser) steht in $env:PSModulePath vorne und wird zuerst gefunden. Altversion entfernen und nur noch einen Scope verwenden. |
| 3.10.x lässt sich unter PowerShell 7 nicht laden | PowerShell 7 ist älter als 7.6. PowerShell aktualisieren, auf Windows PowerShell 5.1 ausweichen oder übergangsweise die letzte passende Vorgängerversion mit -RequiredVersion fest installieren. |
| Install-Module findet unter Windows PowerShell 5.1 keine Pakete | Auf älteren Servern fehlt TLS 1.2 oder der NuGet-Provider ist veraltet. Vorher [Net.ServicePointManager]::SecurityProtocol = 'Tls12' setzen und Install-PackageProvider NuGet -Force ausführen. |
| Anmeldefehler, wenn auch Microsoft.Graph geladen ist | Beide Module bringen eigene Authentifizierungsbibliotheken mit, die sich in einer Sitzung in die Quere kommen können. Exchange- und Graph-Aufgaben in getrennten Sitzungen ausführen. |
| Runbooks in Azure Automation nutzen weiter die alte Version | Module werden dort pro Runtime Environment gepflegt und müssen separat aktualisiert werden – lokale Updates wirken sich nicht aus. |
Compliance-Bezug
Verwaltungsmodule für Cloud-Dienste sind Software mit hohen Privilegien und gehören deshalb ins Patch- und Änderungsmanagement. Im BSI IT-Grundschutz betrifft das den Baustein OPS.1.1.3 Patch- und Änderungsmanagement. Unter NIS2 fallen sowohl die Wartung samt Umgang mit Schwachstellen (Art. 21 Abs. 2 lit. e) als auch die Sicherheit der Lieferkette (Art. 21 Abs. 2 lit. d) – und Letzteres umfasst ganz praktisch auch die Frage, ob ein installiertes Modul wirklich vom erwarteten Hersteller stammt. In den CIS Controls passen Control 2 (Inventar der Software) und Control 7 (kontinuierliches Schwachstellenmanagement).
Fazit
Get-Module -Name ExchangeOnlineManagement -ListAvailable ist der schnellste Weg zur vollständigen Bestandsaufnahme. Zusammen mit Find-Module, einem Update per PowerShellGet oder PSResourceGet und dem anschließenden Entfernen der Altversionen bleibt das Modul sauber und aktuell. Aktuell ist die Version 3.10.1 – unter PowerShell 7 setzt sie mindestens Version 7.6 voraus. Und vor jeder Installation gilt: Modulnamen und Autor prüfen, denn die Doppelgänger in der Gallery sind nur einen Tippfehler entfernt.
ISW Exchange Hygiene – prüft und bereinigt Exchange-Online-Postfächer nach PST-Import oder Tenant-Migration.
ISW CVE Vulnerability Scanner – findet verwundbare Softwarestände auf mehreren Servern über CPE-Zuordnung.
ISW Windows Patch Compliance Analyzer – Inventar und Compliance-Berichte für Windows-Updates.
ISW Security Advisory Board – Security Advisories mit Asset-Watchlist im Blick behalten.
