Заметки IT Менеджера

25.02.2013

Отчет по базам данных Exchange 2007/2010


powershell_21

Публикую полезный скриптик, который по всем базам данных Exchange собирает нужную статистику и отправляет отчет по электронной почте.

В самом отчете дается список всех баз данных, сервера, на которых они расположены, пути к ним, размер каждой из баз, количество ящиков в ней, самый большой ящик, его размер, дата и время последнего бэкапа и количество дней, прошедших с этого времени.

Кроме этого, в отчеты цветом выделяются значения размера базы, количества ящиков в ней, размера ящика и времени последнего бэкапа, если они превышают пороговые значения, которые указаны в скрипте.

Для Exchange 2010 может выводиться значения пустого места в базе.

Оригинальный скрипт был написан исключительно под Exchange 2010 и у меня не работал, так что пришлось его модифицировать. Кроме того, в оригинале, зачем-то, для генерации письма использовался файл, в который все и писалось, а в “финале” он включался в сообщение как его содержимое. Это было некрасиво, кроме того, делало сложным запуск этого скрипта как задачи на сервере.

Конечным результатом является отчет вида, представленного ниже

ex-db-rep1

А вот и сам скрипт:

# Exchange 2007/2010 Mailbox Database HTML Email Report
#Автор оригинального скрипта: Thiyagu14 (http://gallery.technet.microsoft.com/office/d9af4a66-a908-4a3f-af10-380aa63c3a74)
#Автор изменений и адаптации для для Exchange 2007: (itpadla.wordpress.com)
#Дата создания 09.05.2010
#Дата изменения: 18.02.2013
#Описание: скрипт для сбора разнообразной статистики по базам Exchange и отправки результатов его работы по почте
#Оригинальный скрипт не работал с Exchange 2007, неправильно обрабатывал сравнение размера ящика с пороговым значением. Кроме того, для формирования
#тела письма использовался файл, что затрудняло его использование как фоновой задачи.
#####################################################################################
# Exchange 2007/2010 Mailbox Database HTML Email Report
# Script gathers below information
# 1. Server currently hosting the Database.
# 2. Database Size
# 3. Database file path
# 4. Number of users in the Database.
# 5. Amount of Whitespace
# 6. Top Mailbox in the Database and the size of it.
# 7. Last Backup time and days since last backup.
# ###################################################################################
# It then generates HTML Files for this.
# You can setup Threshold in the script,below are the items which can have threshold
# 1. Number of Mailboxes
# 2. Database Size
# 3. How old a Backup can be
# 4. Top Mailbox Size
# If any one of the above threshold is reached the configured threshold.
# It will be marked as red in the HTML.
#####################################################################################
Clear-Host

If ($host.Version.Major -lt 3) {$ExchangePss = Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.Admin -ErrorAction SilentlyContinue}
Else {$ExchangePss = Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.Admin -ErrorAction Ignore}
If ($ExchangePss.Name -ne "Microsoft.Exchange.Management.PowerShell.Admin") {Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin}

$send_email = "noreplay@domain.com"
$rec_email = "it-stat@@domain.com"
$mailserver = "relay.@domain.com"
$MessageTitle = ‘Company Exchange Database Report’

$mailboxCountThreshold = 40
$dbSizeThreshold = 40GB
$backupThreshold = 7
$mbxSizeThreshold = 2147483648

$Body = @"
"@

Function Convert-BytesToSize
{
<#
.SYNOPSIS
Converts any integer size given to a user friendly size.
.DESCRIPTION
Converts any integer size given to a user friendly size.
.PARAMETER size
Used to convert into a more readable format.
Required Parameter
.EXAMPLE
ConvertSize -size 134217728
Converts size to show 128MB
#>
#Requires -version 2.0
[CmdletBinding()]
Param
(
[parameter(Mandatory=$False,Position=0)][int64]$Size
)
#Decide what is the type of size
Switch ($Size)
{
{$Size -gt 1PB}
{
Write-Verbose “Convert to PB”
$NewSize = “$([math]::Round(($Size / 1PB),2))PB”
Break
}
{$Size -gt 1TB}
{
Write-Verbose “Convert to TB”
$NewSize = “$([math]::Round(($Size / 1TB),2))TB”
Break
}
{$Size -gt 1GB}
{
Write-Verbose “Convert to GB”
$NewSize = “$([math]::Round(($Size / 1GB),2))GB”
Break
}
{$Size -gt 1MB}
{
Write-Verbose “Convert to MB”
$NewSize = “$([math]::Round(($Size / 1MB),2))MB”
Break
}
{$Size -gt 1KB}
{
Write-Verbose “Convert to KB”
$NewSize = “$([math]::Round(($Size / 1KB),2))KB”
Break
}
Default
{
Write-Verbose “Convert to Bytes”
$NewSize = “$([math]::Round($Size,2))Bytes”
Break
}
}
Return $NewSize
}

#HTML Header
$date = ( Get-Date ).ToString(‘yyyy/MM/dd’)
$Header = @"
<html>
<head>
<meta http-equiv=’Content-Type’ content=’text/html; charset=windows-1251′>
<title>Exchange Database Report</title>
<STYLE TYPE=text/css>
  <!—
  td {
  font-family: Tahoma;
  font-size: 11px;
  border-top: 1px solid #999999;
  border-right: 1px solid #999999;
  border-bottom: 1px solid #999999;
  border-left: 1px solid #999999;
  padding-top: 0px;
  padding-right: 0px;
  padding-bottom: 0px;
  padding-left: 0px;
  }
  body {
  margin-left: 5px;
  margin-top: 5px;
  margin-right: 0px;
  margin-bottom: 10px;
  
  table {
  border: thin solid #000000;
  }
  —>
  </style>
</head>
<body>
  <table width=’100%’>
  <tr bgcolor=’#CCCCCC’>
  <td colspan=’7′ height=’25’ align=’center’>
  <font face=’tahoma’ color=’#003399′ size=’4′><strong>$MessageTitle — $date</strong></font>
  </td>
  </tr>
  </table>
"@

$THeader = @"
<table width=’100%’><tbody> 
<tr bgcolor=#CCCCCC>
<td width=’10%’ align=’center’>Database Name</td>
<td width=’10%’ align=’center’>Server</td>
<td width=’15%’ align=’center’>Database File</td>
<td width=’10%’ align=’center’>Database Size(MB)</td>
<td width=’7%’ align=’center’># of Mailboxes</td>
<td width=’10%’ align=’center’>WhiteSpace(MB)</td>
<td width=’10%’ align=’center’>Top Mailbox</td>
<td width=’10%’ align=’center’>Top Mailbox Size</td>
<td width=’10%’ align=’center’>Last Full Backup</td>
<td width=’15%’ align=’center’>No Backup Since</td>
</tr>

"@
 
#Html Footer
$Footer = @"
</table>
</body>
</html>
"@

 
 
Function WriteData
{
param($name,$svr,$edb,$edbSize,$whiteSpace,$mbxCount,$topMailbox,$topMailboxSize,$lastBackup,$howOldBkp)
 
$tableEntry = "<tr><td>$name</td><td>$svr</td><td>$edb</td>"
#Checking if EDB size is greater than the set  Threshold
#If it is greater than the table cell will be marked red, else green.
if ($edbSize -gt $dbSizeThreshold)
{
$edbSize = $edbSize/1mb
$tableEntry += "<td bgcolor=’#FF0000′ align=center>$edbSize</td>"
}
else
{
$edbSize = $edbSize/1mb
$tableEntry += "<td bgcolor=’#387C44′ align=center>$edbSize</td>"
}
#Checking if mailbox count is greater than configured threshold
if ($mbxCount -gt $mailboxCountThreshold)
{
$tableEntry += "<td bgcolor=’#FF0000′ align=center>$mbxCount</td>"
}
else
{
$tableEntry += "<td bgcolor=’#387C44′ align=center>$mbxCount</td>"
}
$tableEntry +=  "<td>$whiteSpace</td>"
$tableEntry +=  "<td>$topMailbox</td>"
#Checking if mailbox count threshold is exceeded or not
if ($topMailboxSizeO.TotalItemSize -gt $mbxSizeThreshold)
{
$tableEntry += "<td bgcolor=’#FF0000′ align=center>$topMailboxSize</td>"
}
else
{
$tableEntry += "<td bgcolor=’#387C44′ align=center>$topMailboxSize</td>"
}
#Checking how old is the backup
 
if ($howOldBkp -eq $null)
{
 
$tableEntry += "<td bgcolor=’#FF0000′ align=center> null </td>"
$tableEntry += "<td bgcolor=’#FF0000′ align=center>Never Backed Up</td>"
}
elseif ($howOldBkp -le $backupThreshold)
{
$tableEntry += "<td bgcolor=’#387C44′ align=center>$lastbackup</td>"
$tableEntry += "<td bgcolor=’#387C44′ align=center>$howOldBkp</td>"
}
else
{
$tableEntry += "<td bgcolor=’#FF0000′ align=center>$lastbackup</td>"
$tableEntry += "<td bgcolor=’#FF0000′ align=center>$howOldBkp</td>"
}
$tableEntry
}
 

$dbs = Get-MailboxDatabase -Status | Sort-Object -Property Name
foreach($db in $dbs)
{
    $name = $db.name
    $svr = $db.servername    
    $edb = $db.EdbFilePath.PathName   
    #Exchange 2010
    #$edbSize = Convert-BytesToSize $db.DatabaseSize.tobytes()
    #Exchange 2007 
    $edbSize = (Get-ChildItem -Path ($edb -replace "^?:", ("\\" + $svr + "\" + $edb[0] + "$")).Trim($edb[0])).Length
    #Exchange 2010
    #$whiteSpace = Convert-BytesToSize $db.AvailableNewMailboxSpace.tobytes()
    $whiteSpace = 0
    $mbxCount = (Get-Mailbox -Database $db).count
    $topMailbox = Get-MailboxStatistics -Database $db.identity| Where-Object {$_.totalitemsize -ne $null}|Sort-Object TotalItemSize -Descending |Select-Object DisplayName -First 1 | Format-Table Displayname -HideTableHeaders | Out-String
    $topMailboxSizeO = Get-MailboxStatistics -Database $db.identity| Where-Object {$_.totalitemsize -ne $null} | Sort-Object TotalItemSize -Descending | Select-Object totalitemsize -First 1
    $topMailboxSize = Convert-BytesToSize $topMailboxSizeO.TotalItemSize.Value.tobytes()
    $lastBackup =  $db.LastFullBackup; $currentDate = Get-Date
    if ($lastBackup -eq $null)
    {    
     $howOldBkp =  $null     
    }
    else
    {
    $howOldBkp = $currentDate — $lastBackup    
    $howOldBkp = $howOldBkp.days    
    }
    $Body += WriteData $name $svr $edb $edbSize $whiteSpace $mbxCount $topMailbox $topMailboxSize $lastBackup $howOldBkp
 
}

$splat = @{
    From = $send_email
    To = $rec_email
    SMTPServer = $mailserver
    Subject = $MessageTitle
}

$EBody = ($Header + $THeader + $Body + $Footer)

Send-MailMessage @splat -Body $EBody -BodyAsHTML

Реклама

2 комментария »

  1. Добрый день.
    Скрипт красивый и если выводится такая статистика по серверам красивая то супер, тока у меня скрипт не работает.
    Можете подсказать в чом может быть проблема

    комментарий от Анатолий — 15.05.2013 @ 15:46 | Ответить

    • Как же я вам подскажу в чем проблема, если вы мне не дали никакой информации :-)

      Если пишет ошибки, то попытайтесь понять с чем они могут быть связаны и их устранить. Ну, или, попробуйте запустить оригинальный скрипт.

      Если ничего не пишет, то есть шанс того, что вы не заполнили переменные, связанные с почтой и/или сервер не хочет принимать сообщение, например, из-за авторизации. Если последнее, то можно, например, разрешить вашему ip отправку почты анонимно.

      комментарий от itpadla — 15.05.2013 @ 15:54 | Ответить


RSS feed for comments on this post. TrackBack URI

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

Создайте бесплатный сайт или блог на WordPress.com.

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