Exchange Online jest usługą chmurową SaaS (Software as a service) platformy Microsoft 365. Oferuje swoim użytkownikom funkcjonalność serwera pocztowego Exchange. Obecnie jest jedną z najczęściej wybieranych usług chmurowych. Jak w przypadku wielu innych rozwiązań Microsoftu, w Exchange Online, mamy możliwość użycia narzędzia PowerShell. W poniższym tekście poznasz podstawy poruszania się po Exchange Online z pomocą komend. Omówimy także proste, przykładowe skrypty mogące mieć zastosowanie w środowisku produkcyjnym.

Podłączenie się do usługi Exchange Online za pomocą PowerShell

Zanim przystąpisz do jakiejkolwiek czynności, konieczne będzie zainstalowanie i zaimportowanie odpowiedniego modułu PowerShell oraz włączenie uruchamiania skryptów w systemie.

Włączenie wykonywania skryptów:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

 W przypadku Exchange Online możesz zainstalować moduł za pomocą komendy:

Install-Module -Name ExchangeOnlineManagement

Następnie zaimportuj moduł ExchangeOnlineManagament:

Import-Module ExchangeOnlineManagement

Połącz się z Exchange:

Connect-ExchangeOnline

Pojawi się komunikat, w którym logujemy się za pomocą poświadczeń konta, którego będziemy używać (najczęściej konto z uprawnieniami administratora).

microsoft login

Jeżeli twoje konto jest zabezpieczone MFA, konieczna będzie także weryfikacja drugą metodą uwierzytelniania. W poniższym przypadku jest to numer telefonu:

microsoft login wprowadzanie kodu

Gdy pomyślnie uwierzytelnisz swoje konto, zostaniesz połączony z chmurą Exchange.

Więcej informacji na temat łączenia się Exchange Online:

https://learn.microsoft.com/en-us/powershell/exchange/connect-to-exchange-online-powershell?view=exchange-ps

Niezbędne uprawnienia

Aby podłączyć się do Exchange Online, użytkownik, którego użyjemy musi mieć ustawioną wartość true w parametrze „RemotePowerShellEnabled”. Możesz sprawdzić zawartość tego parametru dla konkretnego użytkownika komendą „Get-User”. Jest także możliwość ustawienia go na false lub true. Zabroni to lub zezwoli użytkownikowi na korzystanie z PowerShell’a.

#Sprawdzenie wartości RemotePowershellEnabled dla użytkownika user@contoso.com
Get-User user@contoso.com | Select Name, RemotePowerShellEnabled

#Ustawienie wartości RemotePowershellEnabled na true - zezwolenie użytkownikowi na użycie Powershella
Set-User user@contoso.com -RemotePowerShellEnabled $true

#Ustawienie wartości RemotePowershellEnabled na false - zabronienie użytkownikowi użycia Powershella
Set-User user@contoso.com -RemotePowerShellEnabled $false

Domyślnie każdy użytkownik ma ustawioną wartość true – ma możliwość podłączenia się komendą „Connect-ExchangeOnline”. Ze względów bezpieczeństwa możesz to zablokować, lecz nie jest to koniecznością, ponieważ polecenia są ograniczone przez rolę przypisaną do konta. Role oraz ich możliwości sprawdzisz w panelu administracyjnym Microsoft 365. Wszelkie polecenia i skrypty zawarte w tym artykule testowane były kontem z przypisaną rolą Administratora Globalnego, która daje dostęp do niemalże wszystkich poleceń.

Get-Mailbox vs Get-EXOMailbox

„Get-Mailbox” – podstawowa komenda pozwalająca sprawdzić parametry skrzynki email. Od wersji modułu Exchange Online V2 (EXO V2) wprowadzono także komendę „Get-EXOMailbox”. „Get-Mailbox” zwraca wszystkie parametry skrzynki, „Get-EXOMailbox” natomiast tylko część (dodatkowo te, które wybierzemy). Dzięki temu „Get-EXOMailbox” jest znacznie wydajniejsze – na wyjściu jest mniejsza ilość danych. Jest to bardziej zauważalne, gdy działamy na dużej ilości skrzynek.

Każda skrzynka w Exchange składa się z wielu parametrów, które odpowiadają za jej ustawienia. Sprawdzisz je za pomocą „Get-Mailbox”:

#Wyświetlenie wszystkich parametrów skrzynki user@contoso.com

#"Format-List" możemy zastąpić skrótem "FL"
Get-Mailbox -Identity user@contoso.com | Format-List

Wynikiem polecenia są wszystkie parametry skrzynki user@contoso.com. Została wyświetlona duża ilość informacji. Co jeżeli interesuje Cię tylko kilka parametrów?

Możesz sprecyzować swoje polecenie:

#Export listy aliasów przypisanych do wszystkich skrzynek w tenancie

#Za pomocą Get-Mailbox
Get-Mailbox | Select UserPrincipalName, EmailAddresses | Export-Csv C:\getm.csv

#Za pomocą Get-EXOMailbox
Get-EXOMailbox | Select UserPrincipalName, EmailAddresses | Export-Csv C:\getEXOm.csv

Wynikiem jest lista wszystkich skrzynek mailowych oraz ich aliasów.

Wspomniałem wcześniej o większej wydajności „Get-EXOMailbox”.  Porównajmy zatem „Get-Mailbox” oraz „Get-EXOMailbox”:

#Eksport do pliku CSV parametrów skrzynki user@contoso.com za pomocą Get-Mailbox
Get-Mailbox user@contoso.com | Export-Csv C:\getm.csv #zwrócony plik CSV zajmuje 10KB

#Eksport do pliku CSV parametrów skrzynki user@contoso.com za pomocą Get-EXOMailbox
Get-EXOMailbox user@contoso.com | Export-Csv C:\exo.csv #zwrócony plik CSV zajmuje 2KB

W tym wypadku plik wyjściowy jest pięciokrotnie mniejszy przy użyciu nowszej wersji komendy, ponieważ komenda Get-ExoMailbox zwraca mniejszą ilość parametrów skrzynki Łatwo wykalkulować, jak wielka różnica jest w wypadku operacji na setkach lub tysiącach skrzynek.

Wszystkie możliwości komend „Get-Mailbox” oraz „Get-EXOMailbox” sprawdzisz w dokumentacji udostępnionej przez Microsoft:

https://learn.microsoft.com/en-us/powershell/module/exchange/get-mailbox?view=exchange-ps

https://learn.microsoft.com/en-us/powershell/module/exchange/get-exomailbox?view=exchange-ps

Set-Mailbox

Interesuje Cię wprowadzenie zmian w ustawieniach skrzynki? Użyj do tego komendy „Set-Mailbox”! Używając jej, możesz wprowadzić zmiany w parametrach skrzynek, które sprawdziłeś za pomocą „Get-Mailbox”. Jak w przypadku użycia innych „setterów” (komend z prefiksem „Set”, wprowadzających zmiany), należy zachować szczególną uwagę. Warto przetestować je przed użyciem w środowisku testowym. Usunięcie wszystkich aliasów w tenancie byłoby problematyczne 😊.

Na potrzeby testów przyjmijmy, że chcemy dodać do skrzynki user@contoso.com alias u@contoso.com:

#Dodanie do skrzynki user@contoso.com aliasu u@contoso.com

#Dodanie aliasu do atrybutu EmailAdresses
Set-Mailbox user@contoso.com -EmailAddresses @{add="u@contoso.com"}

Planujesz monitorować skrzynki mailowe za pomocą logów? To także skonfigurujesz za pomocą „Set-Mailbox”:

#Uruchomienie zbierania logów dla wszystkich użytkowników w tenancie

#Get-Mailbox zwraca nam wszystkie skrzynki mailowe, filtrujemy je pod kontem skrzynek użytkowników (-Filter {RecipientTypeDetails -eq "UserMailbox").
#Za pomocą pipeline (znak "|") przesyłamy wynik Get-Users do polecenia Set-Mailbox
#Set-Mailbox ustawia tym skrzynkom wartość true dla parametru "AuditEnabled"
Get-Mailbox -ResultSize Unlimited -Filter {RecipientTypeDetails -eq "UserMailbox"} | Set-Mailbox -AuditEnabled $true

Od teraz działania na skrzynkach będą monitorowane. Możesz podejrzeć je w centrum administracyjnym Microsoft 365 lub za pomocą komendy „Search-MailboxAuditLog”.

Poniżej odnośnik do szczegółowych informacji na temat „Set-Mailbox”: https://learn.microsoft.com/en-us/powershell/module/exchange/set-mailbox?view=exchange-ps

Przykładowe zastosowania PowerShell w Exchange Online

W artykule wymienionych zostało kilka komend oraz skryptów, które mogą mieć zastosowanie w środowisku produkcyjnym. Przedstawienie przykładowego zadania oraz skryptu, który je rozwiąże najlepiej zobrazuje jak przydatnym narzędziem jest PowerShell. Jeżeli zarządzasz Exchange Online, możesz natknąć się na poniższe przykłady podczas codziennej pracy.

Firma zakupiła nową domenę – contoso.com, twoim zadaniem jest przypisanie wszystkim skrzynkom dodatkowego aliasu w tej domenie. Obecnie w twoim tenancie znajduje się około 500 skrzynek mailowych – w tym wypadku najszybszym rozwiązaniem będzie skrypt PowerShell.

#Łączenie z Exchange Online
Connect-ExchangeOnline

#Tworzenie zmiennej $mailboxes zawierającej wszystkie skrzynki
$mailboxes = Get-EXOMailbox

#Pętla Foreach wykona się dla każdej skrzynki w zmiennej $mailboxes
Foreach($mailbox in $mailboxes){

#Tworzenie zmiennej $newalias z nowym aliasem dla aktualnie przetwarzanej przez pętlę skrzynki
$newalias = "$($mailbox.alias)@contoso.com"

#Dodanie nowego aliasu
Set-Mailbox $mailbox –EmailAddresses @{Add=’$newalias’}
}

Została utworzona skrzynka invoices@contoso.com, która miała być skrzynką współdzieloną. Niestety ktoś z działu IT popełnił błąd i stworzył ją jako skrzynkę użytkownika z przypisaną licencją. Twoim zadaniem jest zmiana typu skrzynki na „Shared”. Usunięcie i ponownie stworzenie nie wchodzi w grę – na skrzynkę zostało już wysłanych kilkadziesiąt faktur, które muszą zostać zachowane. W tym wypadku możesz bez problemu wykonać zadanie w centrum administracyjnym Exchange Online, lecz wykorzystajmy do tego komendy:

#Łączenie z Exchange Online
Connect-ExchangeOnline

#Ustawienie typu skrzynki na współdzieloną	
Set-Mailbox invoices@contoso.com -Type Shared

#Sprawdzenie czy typ skrzynki został zmieniony na Shared - "RecipientTypeDetails" zawiera teraz wrtość "SharedMailbox"
Get-EXOMailbox invoices@contoso.com | fl Name,RecipientTypeDetails

Twój przełożony poprosił o przygotowanie listy wszystkich skrzynek współdzielonych. Jak najszybciej wykonasz zadanie?

#Łączenie z Exchange Online
Connect-ExchangeOnline

#Get-EXOMailbox z filtrem pozwala na wybranie wszystkich skrzynek, których parametr "RecipientTypeDetails" zawiera "SharedMailbox"
#Wybrane skrzynki są przesłane do polecenia Select - interesują nas tylko adres bez szczegółów, wybieramy więc tylko "PrimarySmtpAddress"
#Adresy przesłane są do polecenia Export-Csv, które eksportuje je do pliku csv i zapisuje w wybranej lokalizacji
Get-EXOMailbox -Filter{RecipientTypeDetails -eq "SharedMailbox"} | Select PrimarySmtpAddress | Export-Csv -Path c:\SharedMailboxes.csv

Twoim zadaniem jest sprawdzenie skrzynek, które mają uruchomioną opcję „Prześlij dalej” (forwarding). Posłuży do tego proste polecenie:

#Skrypt wyświetlający listę przekierowanych skrzynek

#Łączymy się z ExchangeOnline
Connect-ExchangeOnline

#Get-Mailbox zwraca wszystkie skrzynki
#Where ogranicza skrzynki tylko do tych, których pole "ForwardingAddress" nie jest puste
#Następnie dzięki Select wyświetla się adres mailowy oraz skrzynka, na którą przekierowane są maile
Get-Mailbox | Where {$_.ForwardingAddress -ne $Null} | Select PrimarySmtpAddress,ForwardingAddress

Istnieje wiele innych komend mających zastosowanie w Exchange Online. Artykuł skupia się na „Get-Mailbox” oraz „Set-Mailbox” – to ich użyjesz w większości przypadków. Jeżeli chcesz poszerzyć wiedzę o inne polecenia, to zachęcam do sprawdzenia dokumentacji udostępnionej przez Microsoft (https://learn.microsoft.com/en-us/powershell/module/exchange/?view=exchange-ps#powershell-v2-module). Znajdziesz tam wszystkie dostępne komendy wraz z ich opisem i składnią. Zawsze możesz także użyć komendy Get-Help 😊.

Rate this post

Bartłomiej Róg
Administrator IT w Support Online