Pre-FlightChecks.ps1 v1.4

#MsExchange

As promised script #1 of #3

<#
.NOTES
NAME: Pre-FlightChecks.ps1
AUTHOR: Paul Flaherty
Last Edit: v1.4 [11 April 2012]
v1.0 sometime    : A script it born
v1.1 22 Nov 2011 : Added OU to user list output
v1.2 07 Dec 2011 : Added console resize
v1.3 08 Mar 2012 : Added RemoveExistingMoveRequests switch
V1.4 11 Apr 2012 : Add autodiscovery of ADSite
.LINK
blogs.flaphead.com
.SYNOPSIS
This script performs some preflight checks for mailboxes moves
and should be run before a mailbox move
.DESCRIPTION
This script performs a number of checks getting ready for a mailbox move.
The first check is Test-MRSHealth for the a selected set of Hub/Cas servers that
may be involved in the mailbox moves
The second check is to make sure all the mailbox databases are homes on activation
preference #1
The final check read the CSVin file and checks:
  – The mailbox exists
  – If it is in a "valid" state
  – if it has any outstanding move requests
.OUTPUTS
  None
.EXAMPLE
pre-flightchecks.ps1
Run the checks using the default csv file
.EXAMPLE
pre-flightchecks.ps1 -CSVin <csvfile>
Uses the provided CSV file for the list of users
.EXAMPLE
pre-flightchecks.ps1 -RemoveExistingMoveRequests
Uses the default CSV and will remove any existing move requests
.PARAMETER CSVin
  Inpout csv file that contains a list of email addresses and has a single heading of email
.PARAMETER RemoveExistingMoveRequests
This switch will remove existing move requests if they already exist
#>
##########################################################################################
PARAM([String]$CSVin = "C:MigrationListmiguserlist.csv",
      [switch]$RemoveExistingMoveRequests = $False,
      [string]$ExchangeServerPrefix = "*",
      [string]$DatabaseFilter = "*")
$Error.Clear()
CLS
#########################################################################################
$AppName    = "Pre-FlightChecks.ps1"
$AppVer     = "v1.4 [11 Apr 2012]"
$ServerName = hostname
$today      = Get-Date
$RunUser    = ([System.Security.Principal.WindowsIdentity]::GetCurrent()).Name
##########################################################################################
#Display script name and version
##########################################################################################
Write-host " " $AppName -NoNewLine -foregroundcolor Green
Write-Host ": " $AppVer -foregroundcolor Green
Write-host "`n Run on $ServerName at $Today by $RunUser" -foregroundcolor Yellow
Write-Host "|——————————————————————-|`n"
$ADSite = ([System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite()).Name
Write-Host "CSVin:………………….."$CSVin
Write-Host "RemoveExistingMoveRequests:.."$RemoveExistingMoveRequests
Write-Host "ExchangeServerPrefix:…….."$ExchangeServerPrefix
Write-Host "DatabaseFilter:………….."$DatabaseFilter
Write-Host "Current AD Site:…………."$ADSite
$xPsCheck = Get-PSSnapin | Select Name | Where {$_.Name -Like "*Exchange*"}
If ($xPsCheck -eq $Null) {Add-PsSnapin Microsoft.Exchange.Management.PowerShell.e2010}
Write-Host "`n`nChecking MRSHealth" -Foregroundcolor Green
Write-Host "Getting a list of Client Access Servers [$ExchangeServerPrefix]"
$tmpCmdLet = "Get-ExchangeServer $ExchangeServerPrefix | Where{(##_.IsClientAccessServer) -AND (##_.IsE14OrLater)} | Sort Name"
$tmpCmdLet = $tmpCmdLet.Replace("##","$")
$tmpCAS = Invoke-Expression $tmpCmdLet
IF($ExchangeServerPrefix -eq "*"){
  Write-Host "Using ADSite: "$ADSite
  $tmpCAS = $tmpCAS | where {$_.Site -like "*$AdSite*"}
}
ForEach($item in $tmpCAS){
  Test-MRSHealth $item.Name | select Identity, Check, Passed, IsValid, Message | ft -AutoSize -wrap
}
read-host "Review the text above and Press Enter to Continue"
Write-Host "`nChecking Databases [$DatabaseFilter]"  -Foregroundcolor Green
IF($DatabaseFilter  -eq "*"){
  Write-Host "Using ADSite: "$ADSite
  $tmpCmdLet = "Get-ExchangeServer $ExchangeServerPrefix | Where{(##_.IsMailboxServer) -AND (##_.IsE14OrLater)} | Sort Name"
  $tmpCmdLet = $tmpCmdLet.Replace("##","$")
  $tmpMBX = Invoke-Expression $tmpCmdLet
  $tmpMBX = $tmpMBX | where {$_.Site -like "*$AdSite*"}
  $tmpMDB = $tmpMBX | Get-MailboxDatabase | Sort Name -Unique
}ELSE{
  $tmpMDB = Get-MailboxDatabase $DatabaseFilter | Sort Name
}
$tmpMDB | FOREACH {$db=$_.Name; $xNow=$_.Server.Name ;$dbown=$_.ActivationPreference| Where {$_.Value -eq 1};  Write-Host $db "on" $xNow "Should be on" $dbOwn.Key -NoNewLine; If ( $xNow -ne $dbOwn.Key){Write-host " WRONG" -ForegroundColor Red; }ELSE{Write-Host " OK" -Foregroundcolor Green}}
read-host "Review the text above and make sure you have green OK.  Then Press Enter to Continue"
Write-Host "`nChecking Mailboxes"  -Foregroundcolor Green
Write-Host "Using " $csvin
If(test-path $csvin){
  Write-host "$csvin found" -foregroundcolor Green
  $users2Migrate = import-csv $csvin
}ELSE{
  Write-host "$csvin not found" -foregroundcolor red
  exit
} #If(test-path $csvin)
$users = @()
ForEach($xUser in $Users2Migrate){
  $tmpemail = $xUser.email
  Write-Host $tmpemail
  $tUser = Get-Mailbox $tmpemail
  $tmpusers = $tUser | Select PrimarySmtpAddress, @{Expression={$_.Database.Name};Label="Database"}, IsValid, @{Expression={$_.OrganizationalUnit.replace("ad.bgep.co.uk/Offices/","")};Label="OrganizationalUnit"}
  $MR = Get-MoveRequest $tmpemail  -ErrorAction silentlycontinue
  IF($MR -ne $Null){
    Write-Host "!!Outstanding MoveRequest!! .. Run Remove-MoveRequest $tmpemail BEFORE you continue" -foregroundcolor red
    IF($RemoveExistingMoveRequests){Remove-MoveRequest $tmpemail -confirm:$False}
  }
  $users += $tmpUsers
  If ($tmpUsers.IsValid -eq $False){
    Write-Host "`n## Invalid User ##" -Foregroundcolor Red;
    $invalid=$tUser.validate();
    write-host "Property Name:.."$inValid
[0].PropertyName;
    write-host "Description:…."$inValid[0].Description;
    Write-host "######`n"-Foregroundcolor Red
  }
}
$users | ft –auto

#END
#########################################################################################

Enable-PersonalArchive.ps1 v1.2

#MSExchange

During migrations to Exchange 2010,  we are also using a tool call Transvault to export data from Enterprise Vault in to Exchange.  As you would expect this is a massive task.  Originally we moved the data in to the primary mailbox, but with laptop rebuilds and slow links while syncing the data we switched Transvault to move the data in to an Exchange Personal Archive, and it works like a dream.

This results in me having to enable the personal archive for different users and as expected I scripted it and here it is.  The help text at the top should explain everything you need to know .. Enjoy

<#
.NOTES
  NAME: Enable-PersonalArchive.ps1
  AUTHOR: Paul Flaherty
  Last Edit: v1.2 [4 April 2012]
  v1.0 21 Feb 2012 : A script is born
  v1.1 02 Mar 2012 : Added switches to allow only applying of policies
  v1.2 04 Apr 2012 : Added mailbox switch
.LINK
  blogs.flaphead.com 
.SYNOPSIS
  Enable Exchange 2010 Personal Archive from a CSV file
.DESCRIPTION
  This Script gets reads a CSV file that contains email addresses and enabled
  the Exchange 2010 Personal Archive.
.PARAMETER CSVIN
  Location of a csv file that contains a single column for email
  Default file is C:MigrationListArchivelist.csv
.PARAMETER RetentionPolicy
  Name of the Retention Policy to apply
.PARAMETER CreateArchive
  Create the archive
.PARAMETER ApplyPolicy
  Specified Retention Policy
.PARAMETER StartMFA
  Start the ManageFolderAssistant for the users
  Automatically enabled if the ApplyPolicy switch is selected
.PARAMETER ListRetentionPolicies
  Shows a list of available retention Policies
.PARAMETER Mailbox
  Specify an individual mailbox instead of using the CSV file
.EXAMPLE
  Enable-PersonalArchive.ps1
  Enable the Personal Archive for all the users in C:MigrationListArchivelist.csv
  and applies the "Default Archive and Retention Policy" retention policy
.EXAMPLE
  Enable-PersonalArchive.ps1 -CreateArchive
  Create personal archives using the default retention policy for all the users in C:MigrationListArchivelist.csv
.EXAMPLE
  Enable-PersonalArchive.ps1 -ListRetentionPolicies
  Displays a list of the available retention policies
#>
#########################################################################################
PARAM([String]$CSVin="C:MigrationListArchivelist.csv",
      [String]$RetentionPolicy="Default Archive and Retention Policy",
      [Switch]$ListRetentionPolicies=$false,
      [Switch]$EnableArchive,
      [Switch]$ApplyPolicy,
      [Switch]$StartMFA,
      [String]$Mailbox)
$Error.Clear()
#########################################################################################
$AppName    = "Enable-PersonalArchive.ps1"
$AppVer     = "v1.2 [4 April 2012]"
$ServerName = hostname
$today      = Get-Date
$RunUser    = ([System.Security.Principal.WindowsIdentity]::GetCurrent()).Name
##########################################################################################
#Display script name and version
##########################################################################################
Write-host " " $AppName -NoNewLine -foregroundcolor Green
Write-Host ": " $AppVer -foregroundcolor Green
Write-host "`n Run on $ServerName at $Today by $RunUser" -foregroundcolor Yellow
Write-Host "|——————————————————————-|`n"
Write-Host "PARAMETERS:" -Foregroundcolor Green
Write-host "ListRetentionPolicies:.. " $ListRetentionPolicies
Write-host "EnableArchive:……….." $EnableArchive
Write-host "ApplyPolicy:…………." $ApplyPolicy
Write-Host "StartMFA:……………." $StartMFA
Write-host "CSVin: ………………" $CSVin
Write-host "RetentionPolicy:………" $RetentionPolicy
write-Host "Mailbox:…………….." $Mailbox
##########################################################################################
$xPsCheck = Get-PSSnapin | Select Name | Where {$_.Name -Like "*Exchange*"}
If ($xPsCheck -eq $Null) {Add-PsSnapin Microsoft.Exchange.Management.PowerShell.e2010}
If($ListRetentionPolicies){
  Write-Host "Available Retention Policies" -Foregroundcolor Blue
  Get-RetentionPolicy | select Name
  Exit
} #If($ListRetentionPolicies)
Write-Host ""
If ($Mailbox -eq ""){
  Write-Host "Reading $CSVin"
  $tmpUsers = Import-Csv $CSVin
  $tmpUserCnt =0;$tmpUsers | ForEach{$tmpUserCnt ++}
  Write-Host $tmpUserCnt -Foregroundcolor Green -NoNewLine
  Write-Host " Users found"
}ELSE{
  Write-Host "Individual Mailbox spelected [$Mailbox]"
  $tmpusers = "" | Select email
  $tmpusers.email = $mailbox
} #If ($Mailbox -eq "")
If($EnableArchive -eq $True){
  #First Loop to enable archive
  Write-Host "`nEnabling Archive" -foregroundcolor Yellow
  ForEach($user in $tmpUsers){Write-Host "`n"$user.email; Get-Mailbox $user.email | Enable-Mailbox -Archive}
  Write-Host "`nWaiting 30 Seconds while AD Catches up!`n" -Foregroundcolor Blue
  Sleep 30
} #If($EnableArchive -eq $True)
#Loop to enable policy
IF($ApplyPolicy -eq $True){
  $StartMFA = $True
  Write-Host "`nSetting Retention Policy: " -NoNewLine
  Write-Host $RetentionPolicy -foregroundcolor Yellow
  ForEach($user in $tmpUsers){
    Write-Host $user.email
    Get-Mailbox $user.email | Set-Mailbox -RetentionPolicy $RetentionPolicy
  } #ForEach($user
  Write-Host "`nWaiting 30 Seconds while AD Catches up!`n" -Foregroundcolor Blue
  Sleep 30
} #IF($ApplyPolicy -eq $True)
#Loop to Start the managedfolderassistant
IF($StartMFA -eq $True){
  Write-Host "`nStart-ManagedFolderAssistant: " -foregroundcolor Yellow
  ForEach($user in $tmpUsers){
    Write-Host $user.email
    Get-Mailbox $user.email | Start-ManagedFolderAssistant
  } #ForEach($user
} #IF($StartMFA -eq $True)
#Loop for the results
Write-Host "`n`nResults" -foregroundcolor Yellow
$tmpResults =@()
ForEach($user in $tmpUsers){
  #Write-Host
$user.email
  $tmpResults += Get-Mailbox $user.email | select PrimarySmtpAddress, Database, RetentionPolicy, ArchiveDatabase
} #ForEach($user
$tmpResults | ft -auto
If ($Mailbox -eq ""){
  If ($EnableArchive -or $ApplyPolicy){
    $xBatchName = get-date -Format "yyyy-MMM-dd_HH-mmm-ss"
    $csvRename = ($csvin.split("."))[0] + "_" + $xBatchName + ".csv"
    Write-host "Renaming csv files to $csvrename" -foregroundcolor yellow
    Ren $csvin $csvRename
  } #If ($EnableArchive -or $ApplyPolicy)
} #If ($Mailbox -eq "")
#END
#########################################################################################