Скрипт для генерации отчёта по заполнению почтовых ящиков Exchange Server


Как известно в Exchange Server 2013 командлет Get-MailboxStatistics не отображает значение StorageLimitStatus, которое характеризует уровень заполнения почтового ящика по отношению к установленным квотам. Это описано в статье KB2819389, где ситуация объясняется производительностью Exchange.

В результате появилось немало скриптов, которые расширяют возможности стандартного командлета Get-MailboxStatistics и добавляют отображение StorageLimitStatus. Я решил тоже написать миллионный «калькулятор» J На самом деле не «калькулятор», а скрипт для генерации отчёта о заполнении почтовых ящиков по отношению к установленным квотам.

Для анализа и наглядного представления информации нет ничего лучше Excel. Поэтому скрипт не только выгружает сырую информацию, но и создаёт файл Excel с отчётом на основе этой информации. Сама выгрузка информации в CSV файл получилась компактной, а вот создание отчёта выглядит достаточно громоздко.

Первую часть запускаем на Exchange Server и получаем файл QuotaList.csv

Вторую часть можно запускать на любом компьютере с установленным Excel и с Powershell 3 и выше. В результате получим файл отчёта QuotaStatus.xlsx

Загрузить скрипты можно в Script Gallery


Get-Mailbox -Filter "RecipientTypeDetails -eq 'UserMailbox'" -ResultSize Unlimited | % {

   if ( ($stat = Get-MailboxStatistics $_) ) {

    $userobj = [pscustomobject]@{
            UserPrincipalName=$_.UserPrincipalName;
            DisplayName=$_.DisplayName;
            PrimarySmtpAddress=$_.PrimarySmtpAddress;
            TotalItemSize=$stat.TotalItemSize.Value.ToBytes();
            UseDatabaseQuotaDefaults=$_.UseDatabaseQuotaDefaults
        }

    if ($_.UseDatabaseQuotaDefaults) {

        $userobj | Add-Member @{
                IssueWarningQuota = if ($stat.DatabaseIssueWarningQuota.IsUnlimited) {$([int64]::MaxValue)} else {$stat.DatabaseIssueWarningQuota.Value.ToBytes()};
                ProhibitSendQuota = if ($stat.DatabaseProhibitSendQuota.IsUnlimited) {$([int64]::MaxValue)} else {$stat.DatabaseProhibitSendQuota.Value.ToBytes()};
                ProhibitSendReceiveQuota = if ($stat.DatabaseProhibitSendReceiveQuota.IsUnlimited) {$([int64]::MaxValue)} else {$stat.DatabaseProhibitSendReceiveQuota.Value.ToBytes()}
            } -PassThru
    } else {
        $userobj | Add-Member @{
                IssueWarningQuota = if ($_.IssueWarningQuota.IsUnlimited) {$([int64]::MaxValue)} else {$_.IssueWarningQuota.Value.ToBytes()};
                ProhibitSendQuota = if ($_.ProhibitSendQuota.IsUnlimited) {$([int64]::MaxValue)} else {$_.ProhibitSendQuota.Value.ToBytes()};
                ProhibitSendReceiveQuota = if ($_.ProhibitSendReceiveQuota.IsUnlimited) {$([int64]::MaxValue)} else {$_.ProhibitSendReceiveQuota.Value.ToBytes()}
            } -PassThru
    }
   }
} | % { Add-Member -InputObject $_ @{

    QuotaStatus = if ($_.TotalItemSize -lt $_.IssueWarningQuota) {"BelowLimit"}
        elseif ($_.TotalItemSize -ge $_.IssueWarningQuota -and $_.TotalItemSize -lt $_.ProhibitSendQuota) {"Warning"}
        elseif ($_.TotalItemSize -ge $_.ProhibitSendQuota -and $_.TotalItemSize -lt $_.ProhibitSendReceiveQuota) {"BlockSend"}
        elseif ($_.TotalItemSize -ge $_.ProhibitSendReceiveQuota) {"BlockSendReceive"}
        } -PassThru
    } | Export-Csv -Path .\QuotaList.csv -Encoding Unicode -NoTypeInformation -Delimiter ";"

Вторая часть. Файл QuotaList.csv должен быть в текущей директории. В неё же будет записан файл отчёта QuotaList.xlsx


$excel                         = New-Object -comObject excel.application
$excel.visible                 = $ false # or = $ true
$excel.displayAlerts           = $false

$WorkBook = $excel.Workbooks.Add()
$WorkSheet = $WorkBook.Sheets.Item(1)
$WorkSheet.Select()
$WorkSheet.Name = "Quotas"
$WorkSheet.Range("A1").Select()

$qlist = Get-Content .\QuotaList.csv -Raw
[Windows.Clipboard]::setText($qlist)
$WorkSheet.Paste()

$excel.Selection.TextToColumns($excel.Selection,
        [Microsoft.Office.Interop.Excel.XlTextParsingType]::xlDelimited,
        [Microsoft.Office.Interop.Excel.XlTextQualifier]::xlTextQualifierDoubleQuote,
        $false,$false,$true)

$WorkSheet.Range("A1").Select()
$WorkSheet.Range("A1").CurrentRegion.Select()

$table = $WorkSheet.ListObjects.Add(
    [Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange,
    $excel.Selection, $Null,
    [Microsoft.Office.Interop.Excel.XlYesNoGuess]::xlYes)
$table.Name =  "Таблица1"

$rows = $WorkSheet.Range("I2").CurrentRegion.Rows.Count
$WorkSheet.Range("I2:I$rows").Select()

$FormatCondition = $excel.Selection.FormatConditions.Add( 2, $Null, '=$I2="BlockSendReceive"', $Null)
$FormatCondition.SetFirstPriority()
$FormatCondition.StopIfTrue = $true
$FormatCondition.Interior.PatternColorIndex = -4105
$FormatCondition.Interior.ColorIndex = 3

$FormatCondition = $excel.Selection.FormatConditions.Add( 2, $Null, '=$I2="BlockSend"', $Null)
$FormatCondition.SetFirstPriority()
$FormatCondition.StopIfTrue = $true
$FormatCondition.Interior.PatternColorIndex = -4105
$FormatCondition.Interior.ColorIndex = 6

$FormatCondition = $excel.Selection.FormatConditions.Add( 2, $Null, '=$I2="Warning"', $Null)
$FormatCondition.SetFirstPriority()
$FormatCondition.StopIfTrue = $true
$FormatCondition.Interior.PatternColorIndex = -4105
$FormatCondition.Interior.ThemeColor = 4
$FormatCondition.Interior.TintAndShade = 0.599963377788629

$FormatCondition = $excel.Selection.FormatConditions.Add( 2, $Null, '=$I2="BelowLimit"', $Null)
$FormatCondition.SetFirstPriority()
$FormatCondition.StopIfTrue = $true
$FormatCondition.Interior.PatternColorIndex = -4105
$FormatCondition.Interior.ThemeColor = 3
$FormatCondition.Interior.TintAndShade = -9.99481185338908E-02

$WorkSheet2 = $WorkBook.Sheets.Add()
$WorkSheet2.Name = "Report"

$PivotTable =     $WorkBook.PivotCaches().Create(
    [Microsoft.Office.Interop.Excel.XlPivotTableSourceType]::xlDatabase,
    "Таблица1",
    [Microsoft.Office.Interop.Excel.xlPivotTableVersionList]::xlPivotTableVersion15).CreatePivotTable(
       "Report!R3C1",
        "СводнаяТаблица1",
        [Microsoft.Office.Interop.Excel.xlPivotTableVersionList]::xlPivotTableVersion15)

$PivotTable.PivotFields("QuotaStatus").Orientation = [Microsoft.Office.Interop.Excel.XlPivotFieldOrientation]::xlRowField
$PivotTable.PivotFields("QuotaStatus").Position = 1
$PivotTable.PivotFields("DisplayName").Orientation = [Microsoft.Office.Interop.Excel.XlPivotFieldOrientation]::xlRowField
$PivotTable.PivotFields("DisplayName").Position = 2

$a=$PivotTable.AddDataField( $PivotTable.PivotFields("DisplayName"),
             "Количество по полю DisplayName",
            [Microsoft.Office.Interop.Excel.XlConsolidationFunction]::xlCount)

$a=$PivotTable.AddDataField($PivotTable.PivotFields("TotalItemSize"),
            "Сумма по полю TotalItemSize",
            [Microsoft.Office.Interop.Excel.XlConsolidationFunction]::xlSum)

$PivotTable.PivotFields("Сумма по полю TotalItemSize").NumberFormat = "#,##0"

$slicer = $WorkBook.SlicerCaches.Add2($PivotTable,"QuotaStatus").Slicers.Add($WorkSheet2)
$slicer.Top=12
$slicer.Height =120
$slicer.Left=450

$chart = $WorkSheet2.Shapes.AddChart2(201, [Microsoft.Office.Interop.Excel.XlChartType]::xlColumnClustered,13,150,360,220)
$chart.Chart.SetSourceData($WorkSheet2.Range('Report!$A$3:$B$8'),[Microsoft.Office.Interop.Excel.XlRowCol]::xlColumns)

$WorkBook.ApplyTheme("C:\Program Files (x86)\Microsoft Office\Document Themes 15\Facet.thmx")

$WorkBook.SaveAs(".\QuotaStatus.xlsx", [Microsoft.Office.Interop.Excel.XlFileFormat ]::xlOpenXMLWorkbook)

$excel.quit()
Реклама

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: