215 lines
9.6 KiB
PowerShell
215 lines
9.6 KiB
PowerShell
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 {($_.ExtendedRights -like “*Send-As*”) -and -not ($_.User -like “NT AUTHORITY\SELF”) -and -not ($_.User -like “s-1-5-21*”)} | % {$_.User}
|
||
fullAccess = Get-MailboxPermission $mailbox.Identity | ?{($_.IsInherited -eq $False) -and -not ($_.User -match “NT AUTHORITY”)} |Select User,Identity,@{Name=”AccessRights”;Expression={$_.AccessRights}} | % {$_.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 {($_.ExtendedRights -like “*Send-As*”) -and -not ($_.User -like “NT AUTHORITY\SELF”) -and -not ($_.User -like “s-1-5-21*”)} | % {$_.User}
|
||
fullAccess = Get-MailboxPermission $mailbox.Identity | ?{($_.IsInherited -eq $False) -and -not ($_.User -match “NT AUTHORITY”)} |Select User,Identity,@{Name=”AccessRights”;Expression={$_.AccessRights}} | % {$_.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')
|
||
|