Zebranie logów poczty w Exchange Online

Aby sprawdzić logi przesyłania poczty w Exchange online po zalogowaniu się na stronie https://admin.exchange.microsoft.com/ przechodzimy do Mail Flow ->Message Trace -> + Start Trace

yW oknie po prawej stronie podajemy parametry wyszukiwania takie jak nadawca czy odbiorca, suwakiem możemy ustawić zakres przeszukiwanych dni lub po wybraniu „Custom time range” możemy podać określoną datę rozpoczęcia i zakończenia. Po podaniu daty rozpoczęcia starszej niż 10 dni wynik możemy tylko pobrać jako plik wynikowy csv. Po wygenerowaniu takiego pliku zostaniemy poinformowani o możliwości jego pobrania. W zależności od obciążenia środowiska Online oraz ilości zleceń może to potrwać dłużej.

Innym sposobem jest skorzystanie z Powershella i polecenia Get-MessageTrace. Jako parametr możemy podać nadawcę (-SenderAddress), odbiorcę (-RecipientAddress), czas rozpoczęcia wyszukiwania (-startdate) czy czas zakończenia (-enddate). Podobnie jak w wersji www nie możemy podać czas rozpoczęcia starczego niż 10 dni. Dobrym rozwiązaniem jest eksportowanie logów do pliku csv. W późniejszym czasie mamy szybki dostęp także do logów starszych niż 10 dni.

Aby pobrać logi z konkretnego dnia musimy podać czas rozpoczęcia oraz czas zakończenia np.

Get-MessageTrace -startdate '8.08.2023 0:00:00' -enddate '8.08.2023 23:59:59'

W zależności od konfiguracji regionalnych wymagana jest modyfikacja w podaniu daty np. dd.MM.yyyy, MM.dd.yyyy lub yyyy.MM.dd. W wyniku powyższego polecenia otrzymamy wynik zawierający 1000 rekordów. W przypadku większej ilości wiadomości musimy rozszerzyć ten wynik. Maksymalna ilość wyników to 5000.

Get-MessageTrace -startdate '8.08.2023 0:00:00' -enddate '8.08.2023 23:59:59' -PageSize 5000

W przypadku gdy mamy jeszcze więcej informacji musimy skorzystać ze stronicowania: po parametrze -Page podajemy nr strony

Get-MessageTrace -startdate '8.08.2023 0:00:00' -enddate '8.08.2023 23:59:59' -PageSize 5000 -Page 1

W przypadku gdy obsługujemy wiele kont tych stron po 5000 może być nawet kilkadziesiąt.

Poniższy skrypt automatyzuje cały proces. Na początku ustawiamy zmienne: strona ($P), wiadomości ($Message), datę rozpoczęcia i zakończenia wskazująca na poprzedni dzień, ścieżkę do programu 7zip (na koniec plik csv jest kompresowany do zip) oraz nazwy plików. W kolejnym kroku w pętli do-until pobierane są kolejne strony i dopisywane do zmiennej $messages. Na koniec całość eksportowana jest do pliku csv. Ważne jest podanie parametru -encoding kodującego poprawnie polskie znaki diakrytyczne. Po zakończeniu eksportu plik csv jest kompresowany do postaci zip.

#Zebranie wiecej niz 5000 wynikow z Exchange Online
#ustawienie zmiennych
$P = 1
$messages = $null
#czesc nazwy pliku zawierajaca date poprzedniego dnia
$czasplik = (get-date).adddays(-1).ToString('yyyy.MM.dd')
#czas rozpoczecia zbierania logów wskazujący na początek poprzedniego dnia
$czas_start = (get-date).adddays(-1).ToString('dd.MM.yyyy')
$czas_start += ' 0:00:00'
$czas_start
#czas zakonczenia zbierania logów wskazujący na koniec poprzedniego dnia
$czas_end = (get-date).adddays(-1).ToString('dd.MM.yyyy')
$czas_end += ' 23:59:59'
$czas_end
#ściażka do programu 7zip
$7Zip = "c:\'Program Files'\7-Zip\7z.exe"
#nazwy plików
$Target = "C:\ExoLog\exo.email.log.$czasplik.zip"
$source = "C:\ExoLog\exo.email.log.$czasplik.csv"
#pętla pobierajaca logi
do 
{ 
    Write-Host "Message Trace, Page $P" 
    $temp_Messages = Get-MessageTrace -startdate $czas_start -enddate $czas_end -PageSize 5000 -Page $P
    $P++ 
    $Messages += $temp_Messages 
}until ($temp_Messages -eq $null)

#display messages
$Messages.Count
$Messages |Export-Csv $Source -Encoding UTF8
& "C:\Program Files\7-Zip\7z.exe" a -sdel  $Target -tzip $Source

Wykorzystując automatyczne logowanie do Exchange Online opisane tutaj możemy zautomatyzować proces pobierania logów za pomocą harmonogramu zadań.