The estimated reading time 5 minutes
Mit PowerShell zu arbeiten kann Spaß machen, speziell wenn man sich in größeren Umgebungen aufhält. Deshalb möchte ich in diesem Artikel einige Standard Anwendungsbeispiele für Exchange Online behandeln, die beinahe jeden Administrator betreffen. Im Artikel werden verschiedene Kombinationen von PowerShell Befehlen gezeigt, natürlich kann man damit noch viel mehr krankes Zeug anstellen, aber ich möchte einfach nur ein paar Basics zeigen. Genug gequatscht, fangen wir an.
Auf die Installation des PowerShell Modules gehe ich nicht groß ein, siehe hierzu der Link von Microsoft .
Hier nochmals kurz mein Setup zur Installation des Modules:
Install-Module -Name ExchangeOnlineManagement -Scope AllUsers -Verbose -Force Import-Module -Name ExchangeOnlineManagement -Verbose Get-Module ExchangeOnlineManagement $creds = Get-Credential Connect-ExchangeOnline -Credential $creds #Connect-ExchangeOnline -Credential $creds -ShowBanner:$false
Nach dem Verbinden (wenn man den Banner nicht abschält) erscheinen die neuen cmdlets in der PowerShell Konsole:
Wie man sehen kann, sind die cmdlets hauptsächlich für Analysezwecke gemacht. Wer gerne eine Auflisten aller cmdlets hätte, kann dies mit folgendem Befehl erledigen.
Get-Module ExchangeOnlineManagement | Select-Object ExportedCommands -ExpandProperty ExportedCommands
Nachdem wir nun verbunden sind, was können wir mit diesen cmdlets überhaupt anfangen? Wir spielen einfach mal etwas mit ihnen.
Get-EXONMailbox references
Mit diesem cmdlet können Informationen zu einzelnen Postfächern abgerufen werden. Zum Thema Propertyset siehe Link.
#1. #find all mailboxes with "alex" in the following attributes: #CommonName (CN),DisplayName,FirstName,LastName,Alias Get-EXOMailbox -Anr alex #2. #using different propertysets to get special information Get-EXOMailbox -PropertySets Quota #combine different propertysets Get-EXOMailbox -PropertySets Quota,Delivery #combine different propertysets with individual properties Get-EXOMailbox -PropertySets Quota,Delivery -Properties EmailAddresses,RecipientTypeDetails #3. #find users with special attributes #find all shared mailboxes and their delivery options Get-EXOMailbox -PropertySets Delivery -Properties RecipientTypeDetails | Where-Object{$_.RecipientTypeDetails -eq "SharedMailbox"} | Sort-Object UserPrincipalName #find all usermailboxes with their delivery options Get-EXOMailbox -PropertySets Delivery -Properties RecipientTypeDetails | Where-Object{$_.RecipientTypeDetails -eq "UserMailbox"} | Sort-Object UserPrincipalName
Get-EXOCasMailbox
Mit „Get-EXOCasMailbox“ kann man z.B. Verbindungeinstellungen für ein einzelnes Postfach sehen (ist IMAP/POP etc. aktiv) CAS = Client Access Service. LINK zum Propertyset
#1. #see all mailboxes with their cas settings Get-EXOCasMailbox #2. #see important information with different propertysets Get-EXOCasMailbox -PropertySets Minimum #see all mailboxes IMAP and POP settings Get-EXOCasMailbox -PropertySets Imap,pop #3. #see all users with POP enabled Get-EXOCasMailbox -PropertySets IMAP,POP | Where-Object {$_.PopEnabled -eq $true} #see all users with POP and IMAP enabled Get-EXOCasMailbox -PropertySets IMAP,POP | Where-Object {($_.PopEnabled -eq $true) -and ($_.ImapEnabled -eq $true)} #see all users OWA enabled Get-EXOCasMailbox -Properties OWAEnabled| Where-Object {$_.OWAEnabled -eq $true}
Get-EXOMailboxStatistics
Mit diesem cmdlet kann man die Größe von Postfächern anzeigen lassen.
#see mailboxsize of special user #UPN,emailaddress,GUID are accepted parameters Get-EXOMailboxStatistics -Identity alexander Get-MailboxFolderStatistics -Identity alexander | ft Folderpath,FolderSize #see statistics of all users Get-EXOMailbox | Get-EXOMailboxStatistics #see statistics of all shared mailboxes Get-EXOMailbox | Where-Object{$_.RecipientTypeDetails -eq "SharedMailbox"} | Get-EXOMailboxStatistics #see detailed statistics of all users Get-EXOMailbox | Get-EXOMailboxStatistics -PropertySets All
Skript zur Ausgabe des größten Postfaches:
$Mailboxstats = Get-EXOMailbox | Get-EXOMailboxStatistics $MailboxStats | Add-Member -MemberType ScriptProperty -Name TotalItemSizeInBytes -Value {$this.TotalItemSize -replace "(.*\()|,| [a-z]*\)", ""} $overview = $MailboxStats | Select-Object DisplayName, TotalItemSizeInBytes,@{Name="TotalItemSize (GB)"; Expression={[math]::Round($_.TotalItemSizeInBytes/1GB,2)}} | Sort-Object "TotalItemSize (GB)" -Descending $overview
Skript zur Ausgabe aller Postfächer größer als ….
#greaterthan value in GB and with "." as comma $greaterthan = "0.5" $Mailboxstats = Get-EXOMailbox | Get-EXOMailboxStatistics $MailboxStats | Add-Member -MemberType ScriptProperty -Name TotalItemSizeInBytes -Value {$this.TotalItemSize -replace "(.*\()|,| [a-z]*\)", ""} $overview = $MailboxStats | Select-Object DisplayName,TotalItemSizeInBytes,@{Name="TotalItemSizeInGB"; Expression={[math]::Round($_.TotalItemSizeInBytes/1GB,2)}} | Sort-Object "TotalItemSizeInGB" -Descending $overview | Where-Object {$_.TotalItemSizeInGB -gt "$greaterthan"}
Skript zur Ausgabe aller Postfächer und der Summe aller Postfächer:
$Mailboxstats = Get-EXOMailbox -ResultSize unlimited | Get-EXOMailboxStatistics $MailboxStats | Add-Member -MemberType ScriptProperty -Name TotalItemSizeInBytes -Value {$this.TotalItemSize -replace "(.*\()|,| [a-z]*\)", ""} $overview = $MailboxStats | Select-Object DisplayName, TotalItemSizeInBytes,@{Name="TotalItemSizeInGB"; Expression={[math]::Round($_.TotalItemSizeInBytes/1GB,2)}} | Sort-Object "TotalItemSizeInGB" -Descending $sumtemp = ($overview | Measure-Object TotalItemSizeInGB -Sum).Sum $sum = $sumtemp.ToString() $sum = "Sum of all Mailboxes in GB: "+$sum+" GB" Write-Host "$sum" -ForegroundColor Yellow $overview
Get-EXOMailboxFolderPermission
Gibt alle Berechtigungen innerhalb eines Postfaches aus.
#1. #get special permission on one folder (need to know the foldername) Get-EXOMailboxFolderPermission -Identity alexander:\Inbox #2. #get folders from one mailbox with their permissions $email = "blablabla@it-koehler.com" $folders = (Get-EXOMailboxFolderStatistics -Identity $email) $perm = @() foreach($folder in $folders){# $fname = ($folder.Folderpath -replace '/','\') $foldername = $email +":" +$fname $temp = Get-EXOMailboxFolderPermission -Identity "$foldername" -ErrorAction SilentlyContinue | Select-Object Identity,User,AccessRights $perm += $temp } $perm | ft
Get-EXOMobileDeviceStatistics
Gibt alle mobilen Endgeräte aus, die mit dem Postfach gekoppelt sind.
#1. #get all mobile devices of one mailbox Get-EXOMobileDeviceStatistics -Mailbox blablabla@it-koehler.com | ft DeviceFriendlyName,DeviceOS,DeviceID,DeviceImei,FirstSyncTime,LastSuccessSync #2. #get all users and show their mobile devices $UPN = (Get-EXOMailbox -ResultSize unlimited).Userprincipalname foreach($user in $UPN){ $mobiles = Get-EXOMobileDeviceStatistics -Mailbox $user -ErrorAction SilentlyContinue if($mobiles){ Write-Host "User: $user" -ForegroundColor Yellow $mobiles | ft DeviceFriendlyName,DeviceOS,DeviceID,DeviceImei,FirstSyncTime,LastSuccessSync } }
Disconnect-ExchangeOnline
Disconnect-ExchangeOnline -Confirm:$false
Natürlich gibt es noch unzählige weitere Möglichkeiten Auswertungen zu machen, wie schon geschrieben möchte ich hier aber nur auf die Basics eingehen. Wer Fragen/ Anregungen hat kann mir diese gerne in den Kommentaren hierlassen. Wenn euch der Artikel gefallen hat, dann klickt bitte auf „Helpful“. Bis bald.
[…] Bevor es losgehen kann, muss eine Verbindung zu Exchange Online per PowerShell aufgebaut werden. Wer nicht genau weiß wie das geht, hier ein früherer Artikel zum Thema Exchange Online PowerShell Tutorial. […]
[…] Das war’s schon. HINWEIS: die beiden Beispiele funktionieren genau so, wenn die Module für Microsoft Teams und Exchange Online geladen sind und auch eine Verbindung zur Cloud besteht. Siehe hierzu meine beiden weiteren ArtikelExperimentieren mit Microsoft Teams PowerShell Modulund Exchange Online PowerShell V2 Tutorial […]
Und wie soll man jetzt mit den neuen Exchange V2 cmdlets an Properties wie ‚LastUserActionTime‘ rankommen? Unter dem alten Get-Mailboxstatistics konnte man es ganz einfach mit: „Get-MailboxStatistics -Identity ‚user-upn‘ | Select LastUserActionTime“ aber mit dem Neuen cmdlet Get-EXOMailboxstatistics dass jetzt auch modern authentication kann, ganz ohne basic authentication, kann man selbst mit ‚-PropertySets all‘ Zusatz nicht an ‚LastUserActionTime ran?
Hallo TheBigBear,
die Aussage stimmt so. Habe ich gerade mal getestet, dies geht leider nur über die „legacy“ Verbindung sprich mit Get-MailboxStatistics. Ich vermute aber, dass dies in zukünftigen EXO PowerShell Versionen hinzukommt. Es gibt dafür noch mehr Beispiele, man schaue sich nur mal folgende Ausgabe an:
(Get-Mailbox | Get-Member).count
und vergleiche die Anzahl mit:
(Get-EXOMailbox -PropertySets All | Get-Member).count
Bei Get-Mailbox sind es 242 Properties und Methods
Bei Get-EXOMailbox sind es nur 229 Properties und Methods
Die alten cmdlets können aktuell ja weiter genutzt werden.
Viele Grüße
Alexander
Hallo Alexander,
Bei uns haben wir angefangen im O365 Tenant Basic Auth zu verbieten und auf Modern Authentication umzusteigen. War ja ursprünglich für diesen Herbst angesagt. (Jetzt wegen Covid auf 2012 verschoben.) Aber mit MFA und ohne Basic Authentication geht der Trick mit den alten cmdlets benutzen leider nicht mehr.
Schade dass MS beim herausgeben der Neuen V2 Exchange cmdlets nicht darauf geachtet haben Funktionsparity zu haben. Beim
Get-EXOMailboxstatistics -PropertySets all | measure
ist der Mangel an Properties noch viel schlimmer als beim Get-EXOMailbox Cmdlet.