When I’ve migrated mailboxes from Exchange 2003 to Exchange 2007, I was always asked how quickly the mailboxes moved. It wasn’t the easiest to figure this information out, but I was able to report on it after massaging the data for a while.
Exchange 2010 moves store the information differently and you can access that information much easier. I decided that I wanted to get a summary of all moves, so I wrote a script to automate the process.
I wanted to run the report pretty much every day and then after I did, save the information out to an HTML file for review.
My script is very plain, but provides all the basics that I’d ever need to report.
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction SilentlyContinue
$UserMoves = Get-ExchangeServer | Where-Object { $_.IsE14OrLater -and $_.IsMailboxServer } | Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics -IncludeMoveHistory
$MoveReport = @()
ForEach ( $Move in $UserMoves )
{
if ( $Move.MoveHistory[0] )
{
# Get the most recent move history - ignore everything before this
$MoveDetails = $Move.MoveHistory[0]
$MoveItem = New-Object PSObject
$MoveItem | Add-Member -MemberType NoteProperty -Name Mailbox -Value $Move.DisplayName
$MoveItem | Add-Member -MemberType NoteProperty -Name SourceDB -Value $MoveDetails.SourceDatabase
$MoveItem | Add-Member -MemberType NoteProperty -Name SourceVersion -Value $MoveDetails.SourceVersion
$MoveItem | Add-Member -MemberType NoteProperty -Name TargetDB -Value $MoveDetails.TargetDatabase
$MoveItem | Add-Member -MemberType NoteProperty -Name TargetVersion -Value $MoveDetails.TargetVersion
$MoveItem | Add-Member -MemberType NoteProperty -Name BadItemLimit -Value $MoveDetails.BadItemLimit
$MoveItem | Add-Member -MemberType NoteProperty -Name BadItemsEncountered -Value $MoveDetails.BadItemsEncountered
$MoveItem | Add-Member -MemberType NoteProperty -Name StartTimestamp -Value $MoveDetails.StartTimestamp
$MoveItem | Add-Member -MemberType NoteProperty -Name CompletionTimestamp -Value $MoveDetails.CompletionTimestamp
$MoveItem | Add-Member -MemberType NoteProperty -Name OverallDuration -Value $MoveDetails.OverallDuration
$MoveItem | Add-Member -MemberType NoteProperty -Name TotalInProgressDuration -Value $MoveDetails.TotalInProgressDuration
$MoveItem | Add-Member -MemberType NoteProperty -Name MRSServerName -Value $MoveDetails.MRSServerName
$MoveItem | Add-Member -MemberType NoteProperty -Name TotalMailboxSize -Value $MoveDetails.TotalMailboxSize
$MoveItem | Add-Member -MemberType NoteProperty -Name TotalMailboxItemCount -Value $MoveDetails.TotalMailboxItemCount
$MoveItem | Add-Member -MemberType NoteProperty -Name MoveSpeedBytesPerSec -Value ( $MoveDetails.TotalMailboxSize.ToBytes() / $MoveDetails.TotalInProgressDuration.TotalSeconds )
$MoveItem | Add-Member -MemberType NoteProperty -Name MoveSpeedItemsPerSec -Value ( $MoveDetails.TotalMailboxItemCount / $MoveDetails.TotalInProgressDuration.TotalSeconds )
$MoveReport += $MoveItem
}
}
$MoveReport | ConvertTo-Html | Out-File -FilePath ( "D:ScriptsReportsMigrationSpeeds_" + ( Get-Date -Format "yyyyMMdd" ) + ".htm" ) -Force
Ramble On!
–Kevin