Ich bin im Script Explorer von Microsoft auf ein Skript gestoßen, welches den täglichen Durchsatz von gesendeten und empfangenen Emails anzeigt.

Das Ergebnis wird direkt in der Powershellkonsole angezeigt. Da dies sehr unübersichtlich ist, habe ich das Skript angepasst, um das Ergbnis wahlweise als csv, html oder per Email ausgeben zu lassen. Außerdem wurde ein Parameter implementiert, ab welchen Datum die Auswertung starten soll.

Beispielausgabe als HTML:

totalemail

Aufruf des Skripts:

./Totalemail.ps1 -startDate 20/05/2012 -HTML -email -csv

Für den Emailversand müssen folgenden Zeilen angepasst werden:

$sendAlertTo = “EmpfängerEmailAdresse”

$sendAlertFrom = “AbsenderEmailAdresse

$SMTPServer = “SMTP-Server”

Und hier nun das Skript:

# Initialize some variables used for counting and for output
param([string] $startDate = $(throw "Startdate is required"), [switch]$HTML, [switch]$email, [switch]$csv )
$From = Get-Date $startDate
$To = $From.AddDays(1) 

$sendAlertTo = "EmailEmpfänger"
$sendAlertFrom = "Emailabsender"
$SMTPServer = "SMTP-Server" 

$RptCollection = @()  

[Int64] $intSent = $intRec = 0
[Int64] $intSentSize = $intRecSize = 0
[String] $strEmails = $null 

Write-Host "DayOfWeek,Date,Sent,Sent Size,Received,Received Size" -ForegroundColor Yellow 

Do
{
	$rptObj = "" | select  DayOfWeek,Date,Sent,SentSize,Received,ReceivedSize
    # Start building the variable that will hold the information for the day
    $strEmails = "$($From.DayOfWeek),$($From.ToShortDateString()),"
 	$rptObj.DayOfWeek = $From.DayOfWeek
	$rptObj.Date = $From.ToShortDateString()

    $intSent = $intRec = 0
    (Get-TransportServer) | Get-MessageTrackingLog -ResultSize Unlimited -Start $From -End $To | ForEach {
        # Sent E-mails
        If ($_.EventId -eq "RECEIVE" -and $_.Source -eq "STOREDRIVER")
		{
			$intSent++
			$intSentSize += $_.TotalBytes
		}

        # Received E-mails
        If ($_.EventId -eq "DELIVER")
		{
			$intRec++
			$intRecSize += $_.TotalBytes
		}
    } 

	$intSentSize = [Math]::Round($intSentSize/1MB, 0)
	$intRecSize = [Math]::Round($intRecSize/1MB, 0)

 	$rptObj.Sent = $intSent
	$rptObj.SentSize = $intSentSize
	$rptObj.Received = $intRec
	$rptObj.ReceivedSize = $intRecSize

	$RptCollection +=$rptObj  

    # Add the numbers to the $strEmails variable and print the result for the day
    $strEmails += "$intSent,$intSentSize,$intRec,$intRecSize"
    $strEmails 

    # Increment the From and To by one day
    $From = $From.AddDays(1)
    $To = $From.AddDays(1)
}
While ($To -lt (Get-Date))
#While ($To -lt (Get-Date "01/12/2011"))

#if csv parameter is set, create csv file
if($csv)
{
	$RptCollection | Export-Csv -NoTypeInformation  c:\usageReport.csv
}

#Create new Object to build the html code
$sb = New-Object System.Text.StringBuilder

	$css = @'
	<style type="text/css">
	body { font-family: Tahoma, Geneva, Verdana, sans-serif;}
	table {border-collapse: separate; background-color: #F2F2F2; border: 3px solid #103E69; caption-side: bottom;}
	td { border:1px solid #103E69; margin: 3px; padding: 3px; vertical-align: top; color: #000;font-size: 12px;}
	thead th {background: #903; color:#fefdcf; text-align: left; font-weight: bold; padding: 3px;border: 1px solid #990033;}
	th {border:1px solid #CC9933; padding: 3px;}
	tbody th:hover {background-color: #fefdcf;}
	th a:link, th a:visited {color:#903; font-weight: normal; text-decoration: none; border-bottom:1px dotted #c93;}
	caption {background: #903; color:#fcee9e; padding: 4px 0; text-align: center; width: 40%; font-weight: bold;}
	tbody td a:link {color: #903;}
	tbody td a:visited {color:#633;}
	tbody td a:hover {color:#000; text-decoration: none;
	}
	</style>
'@	

		[void]$sb.AppendLine($css)
		[void]$sb.AppendLine("<table cellspacing='0'>")
		[void]$sb.AppendLine("<tr><td colspan='6' bgcolor=`"#F2F2F2`"><strong>Mailbox Auslastung am $((get-date).ToShortDateString())</strong></td></tr>")
		[void]$sb.AppendLine("<tr>")
		[void]$sb.AppendLine("<td><strong>DayOfWeek</strong></td>")
		[void]$sb.AppendLine("<td><strong>Date</strong></td>")
		[void]$sb.AppendLine("<td><strong>Sent</strong></td>")
		[void]$sb.AppendLine("<td><strong>SentSize</strong></td>")
		[void]$sb.AppendLine("<td><strong>Received</strong></td>")
		[void]$sb.AppendLine("<td><strong>ReceivedSize</strong></td>")
		[void]$sb.AppendLine("</tr>")

		$RptCollection | ForEach-Object{

			[void]$sb.AppendLine("<tr>")
			[void]$sb.AppendLine("<td>$($_.DayOfWeek)</td>")
			[void]$sb.AppendLine("<td>$($_.Date)</td>")
			[void]$sb.AppendLine("<td>$($_.Sent) items</td>")
			[void]$sb.AppendLine("<td>$($_.SentSize) MB</td>")
			[void]$sb.AppendLine("<td>$($_.Received) items</td>")
			[void]$sb.AppendLine("<td>$($_.ReceivedSize) MB</td>")
			[void]$sb.AppendLine("</tr>")

		}

	[void]$sb.AppendLine("</table>")
	#Write-Output $sb.ToString()

#if html parameter is set, create html file
if($HTML)
{
	$sb.ToString() | out-file "C:\report.htm"
	Invoke-Expression "C:\report.htm"
}

#if email parameter is set, create email notification
if($email)
{
	$SmtpClient = new-object system.net.mail.smtpClient
	$SmtpClient.host =  $SMTPServer
	$MailMessage = new-object System.Net.Mail.MailMessage
	$MailMessage.To.Add($sendAlertTo)
	$MailMessage.From = $sendAlertFrom
	$MailMessage.Subject = "Exchange Daily Send/Receive - Status"
	$MailMessage.IsBodyHtml = $TRUE
	$MailMessage.body = $sb.ToString()
	$SMTPClient.Send($MailMessage)
}

Wenn dir dieser Artikel gefallen hat, kannst du ihn mit einem Klick auf die folgenden Buttons weiterempfehlen. Möchtest du in Zukunft keine neuen Beiträge mehr verpassen? Dann abonniere doch den RSS Feed dieses Blogs. Vielen Dank!

Damit ich in die Zukunft über die Postfach Auslastung automatisch informiert werde, habe ich das bekannte Script aus dem Beitrag: [SCRIPT]MAILBOX GRÖSSE IM VERGLEICH ZUM QUOTA/KONTINGENT noch ein wenig angepasst.

Man kann jetzt über die Parameter -HTML -csv -email entscheiden, wie das Script das Ergebnis präsentieren soll (Parameter sind kombinierbar).

Das HTML Ergebnis sieht so aus (sortiert nach Mailboxgröße):auslastung

Damit ich monatlich über das Ergebnis informiert werde, habe ich eine Windows Aufgabe auf dem Exchange Server erstellt, die folgende Batch-Datei aufruft:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command “. ‘C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1′; Connect-ExchangeServer -auto; Get-MailboxQuotaUsage.ps1 -email”

Für den email Versand müssen diese Variablen im Script angepasst werden:

$sendAlertTo = “empfänger@report.de
$sendAlertFrom = abenderadresse@report.de
$SMTPServer = “SMTP-Server IP-Adresse”

Zum Schluß das überarbeitete Script:

## Comparsion MailboxSize and Quota Script written by Marius Schloten
##
param([string]$customAttribute = "", [switch]$HTML, [switch]$email, [switch]$csv )
$RptCollection = @()
$cattribute = ""

$sendAlertTo = "Empfänger@email.com"
$sendAlertFrom = "Absender@email.com"
$SMTPServer = "smtp-server-adresse"

function CovertBitValue($String){
    $numItempattern = '(?=\().*(?=bytes)'
    $matchedItemsNumber = [regex]::matches($String, $numItempattern)
    $Mb = [INT64]$matchedItemsNumber[0].Value.Replace("(","").Replace(",","")
    return [math]::round($Mb/1048576,0)
}  

#In my case we filter some users with the customAttribute1, you can use this
#parameter. If there is no parameter all mailboxes will be used
if ($customAttribute -eq "") {

    'No Parameter! customAttribute is not set. Getting all mailboxes and writing log-File to C:\usageReport.csv'
    'Optional Usage:'
    './Get-MailboxQuotaUsage.ps1 with customAttribute1 (e.g. "CompanyName") or/and HTML/csv/email Output'
    ''
	'./Get-MailboxQuotaUsage.ps1 -customAttribute "contoso" -HTML -csv -email'
	''
	$cattribute = "*"
}
else{
$cattribute = $customAttribute
}

#Get-Mailboxes, with or without 'customAttribute1'
$mailboxes = Get-Mailbox -ResultSize Unlimited | ?{$_.customattribute1 -like $cattribute}  

$mailboxes | ForEach-Object{   

$username = $_.SamAccountName
$MailboxName = $_.Name.ToString()
"Processing Mailbox : " + $MailboxName  

$rptObj = "" | select  MailboxName,Mailboxsize,SetQuota,customAttribute
$rptObj.MailboxName = $MailboxName 

if($_.ProhibitSendQuota -eq "unlimited")
{
	$rptObj.SetQuota = $_.Database | Get-MailboxDatabase | %{$_.ProhibitSendQuota}
}
else{
	$rptObj.SetQuota = $_.ProhibitSendQuota
 }

$MailboxStats = Get-MailboxStatistics $username
$ts = CovertBitValue($MailboxStats.TotalItemSize.ToString())
"Total Size : " + $MailboxStats.TotalItemSize
$rptObj.MailboxSize = $MailboxStats.TotalItemSize
#"SetQuota : " + $_.ProhibitSendQuota
"SetQuota : " + $rptObj.SetQuota
$rptObj.customAttribute = $_.customattribute1

$RptCollection +=$rptObj  

}
#if csv parameter is set, create csv file
if($csv)
{
	$RptCollection = $RptCollection | Sort-Object MailboxSize -Descending
	$RptCollection | Export-Csv -NoTypeInformation  c:\usageReport.csv
}

#Create new Object to build the html code
$sb = New-Object System.Text.StringBuilder

	$css = @'
	<style type="text/css">
	body { font-family: Tahoma, Geneva, Verdana, sans-serif;}
	table {border-collapse: separate; background-color: #F2F2F2; border: 3px solid #103E69; caption-side: bottom;}
	td { border:1px solid #103E69; margin: 3px; padding: 3px; vertical-align: top; color: #000;font-size: 12px;}
	thead th {background: #903; color:#fefdcf; text-align: left; font-weight: bold; padding: 3px;border: 1px solid #990033;}
	th {border:1px solid #CC9933; padding: 3px;}
	tbody th:hover {background-color: #fefdcf;}
	th a:link, th a:visited {color:#903; font-weight: normal; text-decoration: none; border-bottom:1px dotted #c93;}
	caption {background: #903; color:#fcee9e; padding: 4px 0; text-align: center; width: 40%; font-weight: bold;}
	tbody td a:link {color: #903;}
	tbody td a:visited {color:#633;}
	tbody td a:hover {color:#000; text-decoration: none;
	}
	</style>
'@	

		[void]$sb.AppendLine($css)
		[void]$sb.AppendLine("<table cellspacing='0'>")
		[void]$sb.AppendLine("<tr><td colspan='6' bgcolor=`"#F2F2F2`"><strong>Mailbox Auslastung am $((get-date).ToShortDateString())</strong></td></tr>")
		[void]$sb.AppendLine("<tr>")
		[void]$sb.AppendLine("<td><strong>MailboxName</strong></td>")
		[void]$sb.AppendLine("<td><strong>Mailboxsize</strong></td>")
		[void]$sb.AppendLine("<td><strong>SetQuota</strong></td>")
		[void]$sb.AppendLine("<td><strong>customAttribute</strong></td>")
		[void]$sb.AppendLine("</tr>")

		$RptCollection = $RptCollection | Sort-Object MailboxSize -Descending
		$RptCollection | ForEach-Object{

			[void]$sb.AppendLine("<tr>")
			[void]$sb.AppendLine("<td>$($_.MailboxName)</td>")
			[void]$sb.AppendLine("<td>$($_.Mailboxsize)</td>")
			[void]$sb.AppendLine("<td>$($_.setQuota)</td>")
			[void]$sb.AppendLine("<td>$($_.customattribute)</td>")
			[void]$sb.AppendLine("</tr>")

		}

	[void]$sb.AppendLine("</table>")
	#Write-Output $sb.ToString()

#if html parameter is set, create html file
if($HTML)
{
	$sb.ToString() | out-file "C:\report.htm"
	Invoke-Expression "C:\report.htm"
}

#if email parameter is set, create email notification
if($email)
{
	$SmtpClient = new-object system.net.mail.smtpClient
	$SmtpClient.host =  $SMTPServer
	$MailMessage = new-object System.Net.Mail.MailMessage
	$MailMessage.To.Add($sendAlertTo)
	$MailMessage.From = $sendAlertFrom
	$MailMessage.Subject = "AMS Exchange Status"
	$MailMessage.IsBodyHtml = $TRUE
	$MailMessage.body = $sb.ToString()
	$SMTPClient.Send($MailMessage)
}

Wenn dir dieser Artikel gefallen hat, kannst du ihn mit einem Klick auf die folgenden Buttons weiterempfehlen. Möchtest du in Zukunft keine neuen Beiträge mehr verpassen? Dann abonniere doch den RSS Feed dieses Blogs. Vielen Dank!