Exchange-Scripts/exchange-toolkit.ps1

215 lines
9.7 KiB
PowerShell
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 "7: Press" -NoNewline
Write-Host -ForegroundColor Cyan " '7' " -NoNewline
Write-Host "to list all mailbox permissions based on a search term."
Write-Host "8: Press" -NoNewline
Write-Host -ForegroundColor Cyan " '8' " -NoNewline
Write-Host "to list all mailbox permissions based on a search term and export to a .csv."
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 -ResultSize Unlimited -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 -ResultSize Unlimited | 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 -ResultSize Unlimited | 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 -ResultSize Unlimited | 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 -ResultSize Unlimited | Where-Object {$_.EmailAddresses -like "$searchTerm"} | Set-MailboxRegionalConfiguration -Language "$targetLanguage" -TimeZone "$targetTimezone" -DateFormat "$targetDateFormat"
}
'7' {
$searchTerm = Read-Host -Prompt "Input Query"
#Get mailboxes from search term
$mailboxes = Get-Mailbox -ResultSize Unlimited | Where-Object {$_.EmailAddresses -like "$searchTerm"}
#Create array to store the objects
[System.Collections.ArrayList]$permissionsArray = @()
#Get Permissions from mailboxes and create custom object
Write-Host "Getting permissions for $mailbox"
foreach ($mailbox in $mailboxes) {
$permissionsObject = [PSCustomObject]@{
displayname = $mailbox.DisplayName
emailAddress = $mailbox.PrimarySmtpAddress
sendOnBehalfOf = $mailbox.GrantSendOnBehalfTo
sendAs = Get-ADPermission $mailbox.identity | Where-Object {($_.ExtendedRights -like *Send-As*) -and -not ($_.User -like NT AUTHORITY\SELF) -and -not ($_.User -like s-1-5-21*)} | ForEach-Object {$_.User}
fullAccess = Get-MailboxPermission $mailbox.Identity | Where-Object {($_.IsInherited -eq $False) -and -not ($_.User -match NT AUTHORITY)} |Select-Object User,Identity,@{Name=AccessRights;Expression={$_.AccessRights}} | ForEach-Object {$_.User}
}
#Add the objects to the permissions array
$permissionsArray.Add($permissionsObject) | Out-Null
}
#Output a cool and nice table
$permissionsArray | Format-Table
Write-Host -ForegroundColor White -BackgroundColor Blue "Data is stored in the variable permissionsArray."
}
'8' {
$searchTerm = Read-Host -Prompt "Input Query"
$csvSavePath = Read-Host -Prompt ".csv save"
#Get mailboxes from search term
$mailboxes = Get-Mailbox -ResultSize Unlimited | Where-Object {$_.EmailAddresses -like "$searchTerm"}
#Create array to store the objects
[System.Collections.ArrayList]$permissionsArray = @()
#Get Permissions from mailboxes and create custom object
Write-Host "Getting permissions for $mailbox"
foreach ($mailbox in $mailboxes) {
$permissionsObject = [PSCustomObject]@{
displayname = $mailbox.DisplayName
emailAddress = $mailbox.PrimarySmtpAddress
sendOnBehalfOf = $mailbox.GrantSendOnBehalfTo
sendAs = Get-ADPermission $mailbox.identity | Where-Object {($_.ExtendedRights -like *Send-As*) -and -not ($_.User -like NT AUTHORITY\SELF) -and -not ($_.User -like s-1-5-21*)} | ForEach-Object {$_.User}
fullAccess = Get-MailboxPermission $mailbox.Identity | Where-Object {($_.IsInherited -eq $False) -and -not ($_.User -match NT AUTHORITY)} |Select-Object User,Identity,@{Name=AccessRights;Expression={$_.AccessRights}} | ForEach-Object {$_.User}
}
#Add the objects to the permissions array
$permissionsArray.Add($permissionsObject) | Out-Null
}
#Output a cool and nice table and output a .csv
$permissionsArray | Format-Table
$permissionsArray | Export-Csv -NoTypeInformation $csvSavePath
}
}
Read-Host -Prompt 'Press Enter to Continue'
}
until ($selection -eq 'q')