Poweshell: Сбор статистики по отправленным/полученным письмам по ящикам

Компания Microsoft со своими серверными продуктами чаще всего не поставляет красивых средств визуализации и просмотра статистики, отдавая это на откуп другим производителям программного обеспечения. Microsoft Exchange Server в этом не исключение, однако компания Microsoft предоставила удобный инструмент для сбора такой статистики. И тут уже сам администратор (или по запросу бизнеса) решает в каком разрезе получать статистику.
Если исходить из того, с чем приходилось сталкиваться, то наиболее частый запрос от бизнеса, это предоставить отчет по статистике использования почтовой системы, например: «предоставьте статистику по количеству отправленных и полученных писем для следующего списка адресов.» и далее список почтовыя ящиков.

Основная командлет который потребуется использовать в скрипте это Get-MessageTrackingLog, именно этот скрипт считывает транспортные логи и возвращает их в массив данных для дальнейшего разбора.
Ниже приведен пример скрипта, который может получить такую статистику по отправленным/полученнным письмам для конкретного ящика или группы ящиков с разбивкой на дни. Для работы скрипта требуется присвоить значение трем переменным, которые исходя из требуемого результата:

  • $FQDNExchange — URL ссылка к вашему Exchange серверу, сыылка обычно имеет подобный вид: http://mbx01.contoso.com/PowerShell/
  • $Listmailbox — список почтовых ящиков, для которых необходимо получить статистику
  • $DaysBack — количество дней назад, за которые надо получить статистику, если значение 0, то статистика только за сегодня, если 1 — то за вчера и сегодня
$FQDNExchange = "http://mbx01.contoso.com/PowerShell/" #URI your Exhchange server
$Listmailbox  = @("User1", "User2") # List User
$DaysBack =1 # Number of Back days for get statistics, 0 - only today

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $FQDNExchange -Authentication Kerberos  
$output = Import-PSSession $Session -AllowClobber -DisableNameChecking -WarningAction silentlycontinue 

$rundate = $(Get-Date).toshortdatestring()

$ListExchange = Get-TransportServer -WarningAction silentlycontinue # Get list Exchange Transport Servers

for ($DaysToGoBack = $DaysBack; $DaysToGoBack -ge 0; $DaysToGoBack--)
{ 
    foreach ($mailboxitem in $Listmailbox)
    {
        $mailbox = get-mailbox $mailboxitem

        $StartDate = Get-date ([datetime]((Get-Date $rundate).adddays(-$DaysToGoBack)))
        $StartDateString = (get-Date ($StartDate) -uformat "%H:%M:%S %m/%d/%Y").ToString()

        $EndDate = Get-date (((Get-Date $StartDate).AddSeconds(86399))) 
        $EndDateString = (get-Date ($EndDate) -uformat "%H:%M:%S %m/%d/%Y").ToString()
        
        $ListMessageSend =@()
        $ListMessageReceive =@()

        foreach ($server in $ListExchange)
        {
            $ListMessageSend += Get-MessageTrackingLog -Server $server.Name -Sender $mailbox.WindowsEmailAddress -Start $StartDateString -End $EndDateString -EventID "DELIVER" -resultsize unlimited 
            $ListMessageReceive += Get-MessageTrackingLog -Server $server.Name  -Recipients $mailbox.WindowsEmailAddress -Start $StartDateString -End $EndDateString -EventID "RECEIVE" -resultsize unlimited 
        }
        $TotalSend = $ListMessageSend | Measure-Object -Property Totalbytes -Sum # Sum size of mail sent per day per mailbox
        $TotalReceive = $ListMessageReceive | Measure-Object -Property Totalbytes -Sum # Sum size of mail receive per day per mailbox

        # Output: Date; Alias; NumberofMailReceived; SizeofMailReceived; NumberofMailSend; SizeofMailSent
        $StartDate.ToShortDateString() + ";" + $mailbox.Alias + ";" + $TotalReceive.Count  + ";" + [math]::Round(($TotalReceive.Sum)/(1024*1024)) + ";" + $TotalSend.Count  + ";" + [math]::Round(($TotalSend.Sum)/(1024*1024))
    }
}
Remove-PSSession $Session

Результа выполнения скрипта будет выведен на экран и состоять из 6 полей с разделителем точка с запятой:

Дата; Алиас пользователя; Количество полученных писем; общий размер полученных писем в МБ; количество отправленных писем; общий размер отправленных писем в МБ

Например так:

20.08.2018;User1;27;5;6;1
20.08.2018;User2;7;1;7;2
21.08.2018;User1;37;10;16;6
21.08.2018;User2;10;2;1;1

Данный скрипт проверен на версиях Microsoft Exchange 2010, 2013 и 2016, на Exchange Server 2007, к сожалению нет возможности проверить.

Для удобства текст скрипта можно скачать ввиде файла .ps1 или .zip:

  mailboxStatisticsEx201x.ps1 (2,2 КиБ, 923 hits)


  mailboxStatisticsEx201x.zip (1,1 КиБ, 350 hits)

3 комментария

    • Тут или создавать типизированный массив, или самое простое выводить результат в файл при помощи команды Out-File result.csv -Append.

      Например, так:
      $StartDate.ToShortDateString() + «;» + $mailbox.Alias + «;» + $TotalReceive.Count + «;» + [math]::Round(($TotalReceive.Sum)/(10241024)) + «;» + $TotalSend.Count + «;» + [math]::Round(($TotalSend.Sum)/(10241024)) | Out-File result.csv -Append

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.