function Show-Menu { param ( [string]$Title = 'Exchange Toolkit by Jeremy Berkleef' ) Clear-Host Write-Host -ForegroundColor Green "================ $Title ================" Write-Host "1: Press" -NoNewline Write-Host -ForegroundColor Cyan " '1' " -NoNewline Write-Host "to list the contents of a .csv." Write-Host "2: Press" -NoNewline Write-Host -Foregroundcolor Cyan " '2' " -NoNewline Write-Host "to apply the contents of a .csv to the currently logged in Exchange session." Write-Host "3: Press" -NoNewline Write-Host -ForegroundColor Cyan " '3' " -NoNewline Write-Host "to create a .csv file of aliases from Exchange based on a search term." Write-Host "4: Press" -NoNewline Write-Host -ForegroundColor Cyan " '4' " -NoNewline Write-Host "to use the legacy search script and output the alias list to console." Write-Host "5: Press" -NoNewline Write-Host -ForegroundColor Cyan " '5' " -NoNewline Write-Host "to export a list of mailboxes to .pst based on a search term." Write-Host "6: Press" -NoNewline Write-Host -ForegroundColor Cyan " '6' " -NoNewline Write-Host "to change mailbox locale/language based on a search term." Write-Host "Q: Press" -NoNewline Write-Host -ForegroundColor Red " 'Q' " -NoNewline Write-Host "to quit." } do { Show-Menu $selection = Read-Host "Please make a selection" switch ($selection) { '1' { #Ask where the .csv is $CsvLocation = Read-Host -Prompt 'CSV path' #Print a new line Write-Host `n #Read the .csv and print it to console Import-Csv $CsvLocation | ForEach-Object { Write-Host -Foregroundcolor Red -Backgroundcolor White (Write-Output $_.Displayname); write-Host -foregroundcolor Green -Separator `n (Write-Output $_.EmailAddresses.Split(";")) } } '2' { #Ask where the .csv is and import the values into the Alias_List variable $CsvLocation = Read-Host -Prompt 'CSV path' $Alias_list = Import-Csv $CsvLocation #Print a new line Write-Host `n #Read the .csv, apply the aliases and print the resulting aliases Foreach ($Alias in $Alias_list) { Set-Mailbox -Identity $Alias.Displayname -EmailAddresses $Alias.EmailAddresses.Split(";") } #Print the new values to console for verification Write-Host -ForegroundColor Green -BackgroundColor White "New Values:" #Get the mailboxes from Exchange and print the email addresses to confirm the changes. Foreach ($Alias in $Alias_list) { $addresses = (Get-Mailbox -Identity $Alias.Displayname).EmailAddresses Write-Host -Foregroundcolor Red -Backgroundcolor White (Write-Output $Alias.Displayname); write-Host -foregroundcolor Green -Separator `n (Write-Output $addresses) } } '3' { #Ask the user what we're looking for and we're we're going to save the .csv $searchTerm = Read-Host -Prompt 'Input search query' $CsvSavePath = Read-Host -Prompt 'Input location to save .csv' #List Aliases and select get-mailbox | Where-Object {$_.EmailAddresses -like "$searchTerm"} | Select-Object Displayname,@{Name="EmailAddresses";Expression={$_.EmailAddresses}} | Export-Csv -NoTypeInformation $CsvSavePath #Remind the user that they need to fix the csv formatting. Write-Host -ForegroundColor Red -BackgroundColor Black "Please be sure to remember to format the .csv correctly before importing it back into an Exchange Server or Exchange Online" Write-Host `n Write-Host -BackgroundColor Black -ForegroundColor Blue "Before importing, delete the non-email addresses from the .csv and replace the spaces between addresses with ';'.`nThis is a safety measure to prevent applying an incompatible address." } '4' { # Ask the user what we need to search for $searchTerm = Read-Host -Prompt 'Input Query' #List Aliases get-mailbox | Where-Object {$_.EmailAddresses -like "$searchTerm"} |ForEach-Object{ $host.UI.Write("White", $host.UI.RawUI.BackGroundColor, "`nUser Name: " + $_.DisplayName+"`n") for ($i=0;$i -lt $_.EmailAddresses.Count; $i++) { $address = $_.EmailAddresses[$i] $host.UI.Write("Green", $host.UI.RawUI.BackGroundColor, $address.AddressString.ToString()+"`t") if ($address.IsPrimaryAddress) { $host.UI.Write("Blue", $host.UI.RawUI.BackGroundColor, "Primary Email Address`n") } else { $host.UI.Write("Red", $host.UI.RawUI.BackGroundColor, "Alias`n") } } } } '5' { Write-Host -ForegroundColor Blue -BackgroundColor White "For exporting a single mailbox, prepend a * to the mailbox name (e.g. *mailbox@example.com)" $searchTerm = Read-Host -Prompt "Search Query" Write-Host -ForegroundColor Blue -BackgroundColor White "Path must be in UNC format for Exchange to export to." $savePath = Read-Host -Prompt "Export Path" $mailboxes = get-mailbox | Where-Object {$_.EmailAddresses -like "$searchTerm"} Foreach ($mailbox in $mailboxes) { #Concatenate the save path and the mailbox alias. $exportPath = Join-Path $savePath $mailbox.Alias New-MailboxExportRequest -Mailbox $mailbox -FilePath "$exportPath.pst" } } '6' { $searchTerm = Read-Host -Prompt "Input Query" $targetLanguage = Read-Host -Prompt "Language to switch to (nl-NL for Dutch)" $targetTimezone = Read-Host -Prompt "Time zone to switch to ("W. Europe Standard Time" for GMT -1)" $targetDateFormat = Read-Host -Prompt "Date format to switch to (e.g. "d-M-yyy")" #Search mailboxes and apply the changes Get-Mailbox | Where-Object {$_.EmailAddresses -like "$searchTerm"} | Set-MailboxRegionalConfiguration -Language "$targetLanguage" -TimeZone "$targetTimezone" -DateFormat "$targetDateFormat" } } Read-Host -Prompt 'Press Enter to Continue' } until ($selection -eq 'q')