function CreateDomain ($domainName, $domainDisplayName)
{
<#
.SYNOPSIS
Создает новый домен на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.PARAMETER domainDisplayName 
Отображаемое имя домена

.EXAMPLE 
CreateDomain -domainName "company.local" -domainDisplayName "company"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Создаем новый почтовый домен
	Write-Host ($MSG_MAIL_DOMAIN_CREATING -f $domainName);
	$domain = New-AcceptedDomain -DomainName $domainName -DomainType Authoritative -Name $domainDisplayName -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_CREATED -f $domainName) -ForegroundColor Yellow;
	
	# Создаем глобальный адресный список для этого домена
	Write-Host ($MSG_MAIL_DOMAIN_GLOBAL_ADDRESS_LIST_CREATING -f "Global:$domainName");
	$globalAddressList = New-GlobalAddressList -Name "Global:$domainName"  -ErrorAction Stop -RecipientFilter {((RecipientType -eq "UserMailbox") -and (CustomAttribute11 -eq $domainName))};
	Write-Host ($MSG_MAIL_DOMAIN_GLOBAL_ADDRESS_LIST_CREATED -f "Global:$domainName");
	
	# Создаем адресный список
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_CREATING -f "Local:$domainName");
	$addressList = New-AddressList -Name "Local:$domainName" -ConditionalCustomAttribute11 $domainName -IncludedRecipients MailboxUsers -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_CREATED -f "Local:$domainName");
	
	# Обновляем адресный список, чтобы он наполнился адресами
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_UPDATING -f "Local:$domainName");
	$addressList = Update-AddressList -Identity "Local:$domainName" -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_UPDATED -f "Local:$domainName");
	
	# Создаем новую Offline-Адресную книгу
	Write-Host ($MSG_MAIL_DOMAIN_OFFLINE_BOOK_CREATING -f "Local:$domainName");
	$addressBook = New-OfflineAddressBook -Name $domainName -AddressLists "Local:$domainName" -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_OFFLINE_BOOK_CREATED -f "Local:$domainName");
	
	# Создаем политику для новой адресной книги
	Write-Host ($MSG_MAIL_DOMAIN_POLICY_CREATING -f "Local:$domainName");
	$addressBookPolicy = New-AddressBookPolicy -Name $domainName -AddressLists "Local:$domainName" -OfflineAddressBook $domainName -GlobalAddressList "Global:$domainName" -RoomList "\All Rooms" -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_POLICY_CREATED -f "Local:$domainName");
}

function DeleteDomainMailBoxes($domainName, $domainController)
{
<#
.SYNOPSIS
Удаляет все почтовые ящики домена на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
DeleteDomainMailBoxes -domainName "company.local" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем все почтовые ящики этого почтого домена
	Write-Host ($MSG_MAIL_DOMAIN_MAILBOXES_DELETING -f $domainName);
	Get-Mailbox -DomainController $domainController -ErrorAction Stop | Where-Object { $_.AddressBookPolicy -eq $domainName } | Remove-Mailbox -DomainController $domainController -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_MAILBOXES_DELETED -f $domainName);	
}

function DeleteAddressBookPolicy($domainName, $domainController)
{
<#
.SYNOPSIS
Удаляет политику адресной книги на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
DeleteAddressBookPolicy -domainName "company.local" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем политику домена
	Write-Host ($MSG_MAIL_DOMAIN_POLICY_DELETING -f $domainName);
	Remove-AddressBookPolicy -DomainController $domainController -Identity $domainName -Confirm:$False -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_POLICY_DELETED -f $domainName);
}

function DeleteOfflineAddressBook($domainName, $domainController)
{
<#
.SYNOPSIS
Удаляет адресную книгу на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
DeleteOfflineAddressBook -domainName "company.local" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем адресную книгу
	Write-Host ($MSG_MAIL_DOMAIN_OFFLINE_BOOK_DELETING -f $domainName);
	Remove-OfflineAddressBook -Identity $domainName -Confirm:$False -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_OFFLINE_BOOK_DELETED -f $domainName);
}

function DeleteAddressList($domainName, $domainController)
{
<#
.SYNOPSIS
Удаляет локальный адресный список на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
DeleteAddressList -domainName "company.local" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем адресный список
	$AddressListName = ("Local:{0}" -f $domainName);
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_DELETING -f $AddressListName);
	Remove-AddressList -Identity $AddressListName -Confirm:$False -Recursive -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_DELETED -f $AddressListName);
}

function DeleteGlobalAddressList($domainName, $domainController)
{
<#
.SYNOPSIS
Удаляет домен на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
DeleteGlobalAddressList -domainName "company.local" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;

	# Удаляем глобальный адресный список
	$GlobalAddressListName = ("Global:{0}" -f $domainName);
	Write-Host ($MSG_MAIL_DOMAIN_GLOBAL_ADDRESS_LIST_DELETING -f $GlobalAddressListName);
	Remove-GlobalAddressList -Identity $GlobalAddressListName -Confirm:$False -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_GLOBAL_ADDRESS_LIST_DELETED -f $GlobalAddressListName);
}

function DeleteDomain($domainName, $domainController)
{
<#
.SYNOPSIS
Удаляет домен на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
DeleteDomain -domainName "company.local" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Получаем почтовый домен
	$domain = GetDomain $domainName;

	# Удаляем почтовый домен
	Write-Host ($MSG_MAIL_DOMAIN_DELETING -f $domainName);
	$domain = Remove-AcceptedDomain $domain.Name -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_DELETED -f $domainName) -ForegroundColor Yellow;
}

function ChangeDomainDisplayName($domainName, $domainDisplayName)
{
<#
.SYNOPSIS
Изменяет отображаемое имя домена на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.PARAMETER domainDisplayName 
Отображаемое имя почтового домена

.EXAMPLE 
ChangeDomainDisplayName -domainName "company.local" -domainDisplayName "TestDomain"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Получаем почтовый домен
	$domain = GetDomain $domainName;
	
	# Изменяем отображаемое имя почтового домена
	Write-Host ($MSG_MAIL_DOMAIN_UPDATING -f $domainName);
	$domain = Set-AcceptedDomain -Identity $domain.Name -Name $domainDisplayName -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_UPDATED -f $domainName) -ForegroundColor Yellow;
	
	# Переименовываем глобальный адресный список для этого домена
	Write-Host ($MSG_MAIL_DOMAIN_GLOBAL_ADDRESS_LIST_UPDATING -f "Global:$domainName");
	$GlobalAddressListName = ("Global:{0}" -f $domainName);
	$globalAddressList = Set-GlobalAddressList -Identity $GlobalAddressListName -Name "Global:$domainDisplayName"  -ErrorAction Stop -RecipientFilter {((RecipientType -eq "UserMailbox") -and (CustomAttribute11 -eq $domainDisplayName))};
	Write-Host ($MSG_MAIL_DOMAIN_GLOBAL_ADDRESS_LIST_UPDATED -f "Global:$domainName");	
	
	# Переименовываем адресный список
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_UPDATING -f "Local:$domainName");
	$AddressListName = ("Local:{0}" -f $domainName);
	$addressList = Set-AddressList -Identity $AddressListName -Name "Local:$domainDisplayName" -ConditionalCustomAttribute11 $domainDisplayName -IncludedRecipients MailboxUsers -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_UPDATED -f "Local:$domainName");
	
	# Обновляем адресный список, чтобы он наполнился адресами
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_UPDATING -f "Local:$domainDisplayName");
	$addressList = Update-AddressList -Identity "Local:$domainDisplayName" -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_ADDRESS_LIST_UPDATED -f "Local:$domainName");
	
	# Переименовываем новую Offline-Адресную книгу
	Write-Host ($MSG_MAIL_DOMAIN_OFFLINE_BOOK_CREATING -f "Local:$domainName");
	$addressBook = Set-OfflineAddressBook -Identity $domainName  -Name $domainDisplayName -AddressLists "Local:$domainDisplayName" -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_OFFLINE_BOOK_CREATED -f "Local:$domainName");
	
	# Переименовываем политику для новой адресной книги
	Write-Host ($MSG_MAIL_DOMAIN_POLICY_CREATING -f "Local:$domainName");
	$addressBookPolicy = Set-AddressBookPolicy -Identity $domainName -Name $domainDisplayName -AddressLists "Local:$domainDisplayName" -OfflineAddressBook $domainDisplayName -GlobalAddressList "Global:$domainDisplayName" -RoomList "\All Rooms" -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_POLICY_CREATED -f "Local:$domainName");		
	
}

function GetDomain($domainName)
{
<#
.SYNOPSIS
Получает существующий домен на Exchange сервере

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
GetDomain -domainName "company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Получаем почтовый домен по имени домена
	Write-Host ($MSG_MAIL_DOMAIN_GETTING -f $domainName);
	$domain = Get-AcceptedDomain -ErrorAction Stop | Where { $_.DomainName -eq $domainName } ;
	Write-Host ($MSG_MAIL_DOMAIN_GETTED -f $domainName) -ForegroundColor Yellow;
	
	return $domain;
}

function UpdateDomainUserInfo($email, $firstName, $lastName, $patronymic, $domainController)
{
<#
.SYNOPSIS
Изменяет фамилию, имя, отчество в БД AD и на Exchange сервере

.DESCRIPTION

.PARAMETER firstName 
Имя почтового домена

.PARAMETER lastName 
Имя почтового домена

.PARAMETER patronymic 
Имя почтового домена

.EXAMPLE 
UpdateDomainUserInfo -email "test@company.local" -firstName "Иван" -lastName "Иванов" -patronymic "Иванович" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Изменяем фамилию, имя, отчество в БД AD и на Exchange сервере
	# Конструируем ФИО
	$firstName = $firstName.TrimEnd().TrimStart();
	$lastName = $lastName.TrimEnd().TrimStart();
	$patronymic = $patronymic.TrimEnd().TrimStart();
	
	$displayName = "$lastName $firstName $patronymic";
	$displayName = $displayName.TrimEnd().TrimStart();
	
	if([string]::IsNullOrEmpty($displayName))
	{
		$displayName = $email;
	}
	
	Write-Host ($MSG_MAIL_USER_INFO_UPDATING -f $email);
	$user = Set-User -Identity $email -DisplayName $displayName -FirstName $firstName -LastName $lastName -DomainController $domainController -ErrorAction Stop;
	Write-Host ($MSG_MAIL_USER_INFO_UPDATED -f $email) -ForegroundColor Yellow;
}

function CreateMailBox($email, $firstName, $lastName, $patronymic, $domainController)
{
<#
.SYNOPSIS
Создает новый почтовый ящик на Exchange сервере на основе существующей учетной записи

.DESCRIPTION

.PARAMETER email 
Email имя пользователя

.PARAMETER firstName 
Имя пользователя

.PARAMETER lastName 
Фамилия пользователя

.PARAMETER patronymic 
Отчество пользователя

.EXAMPLE 
CreateMailBox -email "user@company.local" -firstName "Иван" -lastName "Иванов" -patronymic "Иванович" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Конструируем ФИО
	$displayName = "$lastName $firstName $patronymic";
	$displayName = $displayName.TrimEnd().TrimStart();
	
	if([string]::IsNullOrEmpty($displayName))
	{
		$displayName = $email;
	}
		
	Write-Host ($MSG_MAILBOX_CREATING -f $email);

	$mailbox = Enable-Mailbox -Identity ($email.Split("@")[0]) -DisplayName $displayName -PrimarySmtpAddress $email -DomainController $domainController -ErrorAction Stop;

	Write-Host ($MSG_MAILBOX_CREATED -f $email) -ForegroundColor Yellow;
	
	$DomainName = $email.Split("@")[1];
	$mailbox = Set-Mailbox -Identity $email -CustomAttribute11 $DomainName -AddressBookPolicy $DomainName -DomainController $domainController -ErrorAction Stop;
}

function DeleteMailBox($email)
{
<#
.SYNOPSIS
Отсоединяет почтовый ящик от аккаунта в AD. Удаляет учетную запись в AD.
Помечает почтовый ящик для удаления. По умолчанию Exchange удаляет почтовый ящик через 30 дней.

.DESCRIPTION

.PARAMETER email 
Email имя пользователя

.EXAMPLE 
DeleteMailBox -email "test@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем почтовый ящик пользователя
	Write-Host ($MSG_MAILBOX_DELETING -f $email);
	$domain = Remove-Mailbox -Identity $email -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAILBOX_DELETED -f $email) -ForegroundColor Yellow;
}

function ChangePasswordExch($email, $password)
{
<#
.SYNOPSIS
Изменяет пароль для указанного почтового ящика

.DESCRIPTION

.PARAMETER email 
Email имя пользователя

.PARAMETER password 
Пароль пользователя

.EXAMPLE 
ChangePasswordExch -email "test@company.local" -password "P@ssw0rd"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Устанавливаем пароль владельца почтовго ящика с указанным Email-адресом 
	Write-Host ($MSG_MAIL_BOX_PASSWORD_CHANGING -f $email);
	$Password = ConvertTo-SecureString –String $password –AsPlainText -Force -ErrorAction Stop;
	Set-Mailbox -Identity $email -Password $Password -ErrorAction Stop;
	Write-Host ($MSG_MAIL_BOX_PASSWORD_CHANGED -f $email) -ForegroundColor Yellow;
}

function AddMailBoxAlias($email, $alias)
{
<#
.SYNOPSIS
Добавляет псевдоним для указанного почтового ящика

.DESCRIPTION

.PARAMETER email 
Email имя пользователя

.PARAMETER alias 
Псевдоним почтового ящика

.EXAMPLE 
AddMailBoxAlias -email "test@company.local" -alias "test1@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Добавляем псевдоним для почтового ящика
	Write-Host ($MSG_MAIL_BOX_ALIAS_ADDING -f $email,$alias);
	Set-Mailbox -Identity $email -EmailAddresses @{Add=$alias} -ErrorAction Stop;
	Write-Host ($MSG_MAIL_BOX_ALIAS_ADDED -f $email,$alias) -ForegroundColor Yellow;
}

function RemoveMailBoxAlias($email, $alias)
{
<#
.SYNOPSIS
Удаляет псевдоним для указанного почтового ящика

.DESCRIPTION

.PARAMETER email 
Email имя пользователя

.PARAMETER alias 
Псевдоним почтового ящика

.EXAMPLE 
RemoveMailBoxAlias -email "test@company.local" -alias "test1@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем псевдоним для почтового ящика
	Write-Host ($MSG_MAIL_BOX_ALIAS_DELETING -f $email,$alias);
	Set-Mailbox -Identity $email -EmailAddresses @{Remove=$alias} -ErrorAction Stop;
	Write-Host ($MSG_MAIL_BOX_ALIAS_DELETED -f $email,$alias) -ForegroundColor Yellow;
}

function CreateDistributionList($email, $owner, $name)
{
<#
.SYNOPSIS
Создает список рассылки

.DESCRIPTION

.PARAMETER email 
Email группы

.PARAMETER owner 
Владелец группы

.PARAMETER name 
Название списка рассылки

.EXAMPLE 
CreateDistributionList -email "list@company.local" -owner "test@company.local" -name "listusers"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Создаем новый список рассылки
	Write-Host ($MSG_MAIL_LIST_CREATING -f $name,$email);
	$Group = New-DistributionGroup -Name $name -SamAccountName $name -ManagedBy $owner -PrimarySmtpAddress $email -ErrorAction Stop;
	Write-Host ($MSG_MAIL_LIST_CREATED -f $name,$email) -ForegroundColor Yellow;
}

function DeleteDistributionList($name)
{
<#
.SYNOPSIS
Удаляет список рассылки

.DESCRIPTION

.PARAMETER name 
Название списка рассылки

.EXAMPLE 
DeleteDistributionList -name "listusers"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Создаем новый список рассылки
	Write-Host ($MSG_MAIL_LIST_DELETING -f $name);
	$Group = Remove-DistributionGroup -Identity $name -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_LIST_DELETED -f $name) -ForegroundColor Yellow;
}

function AddDistributionListAlias($email, $alias)
{
<#
.SYNOPSIS
Добавляет псевдоним для указанного списка рассылки

.DESCRIPTION

.PARAMETER email 
Email списка рассылки

.PARAMETER alias 
Псевдоним списка рассылки

.EXAMPLE 
AddDistributionListAlias -email "test@company.local" -alias "test1@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Добавляем псевдоним для почтового ящика
	Write-Host ($MSG_MAIL_LIST_ALIAS_ADDING -f $email,$alias);
	Set-DistributionGroup -Identity $email -EmailAddressPolicyEnabled $false -EmailAddresses @{Add=$alias} -ErrorAction Stop;
	Write-Host ($MSG_MAIL_LIST_ALIAS_ADDED -f $email,$alias) -ForegroundColor Yellow;
}

function RemoveDistributionListAlias($email, $alias)
{
<#
.SYNOPSIS
Удаляет псевдоним для указанного списка рассылки

.DESCRIPTION

.PARAMETER email 
Email списка рассылки

.PARAMETER alias 
Псевдоним почтового ящика

.EXAMPLE 
RemoveDistributionListAlias -email "test@company.local" -alias "test1@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем псевдоним для почтового ящика
	Write-Host ($MSG_MAIL_LIST_ALIAS_DELETING -f $email,$alias);
	Set-DistributionGroup -Identity $email -EmailAddresses @{Remove=$alias} -ErrorAction Stop;
	Write-Host ($MSG_MAIL_LIST_ALIAS_DELETED -f $email,$alias) -ForegroundColor Yellow;
}

function AddAddressToList($listName, $email)
{
<#
.SYNOPSIS
Добавляет email-адрес в список рассылки

.DESCRIPTION

.PARAMETER listName 
Название списка рассылки

.PARAMETER email 
Email пользователя для добавления в список рассылки

.EXAMPLE 
AddAddressToList -listName "listusers" -email "test@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Добавляем пользователя в список рассылки
	Write-Host ($MSG_MAIL_LIST_MEMBER_ADDING -f $listName,$email);
	$Group = Add-DistributionGroupMember -Identity $listName -Member $email -ErrorAction Stop;
	Write-Host ($MSG_MAIL_LIST_MEMBER_ADDED -f $listName,$email) -ForegroundColor Yellow;
}

function DeleteAddressFromList($listName, $email)
{
<#
.SYNOPSIS
Удаляет email-адрес из списка рассылки

.DESCRIPTION

.PARAMETER listName 
Название списка рассылки

.PARAMETER email 
Email пользователя для удаления из списка рассылки

.EXAMPLE 
DeleteAddressFromList -listName "listusers" -email "test@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем пользователя из списка рассылки
	Write-Host ($MSG_MAIL_LIST_MEMBER_DELETING -f $listName,$email);
	$Group = Remove-DistributionGroupMember -Identity $listName -Member $email -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_LIST_MEMBER_DELETED -f $listName,$email) -ForegroundColor Yellow;
}

function CreateResourceRoomMailBox($email)
{
<#
.SYNOPSIS
Создает новый ресурсный почтовый ящик типа Room на основе существующей учетной записи

.DESCRIPTION

.PARAMETER email
Email имя пользователя

.EXAMPLE 
CreateResourceRoomMailBox -email "user@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;

	Write-Host ($MSG_MAILBOX_ROOM_CREATING -f $email);
	$mailbox = Enable-Mailbox -Identity ($email.Split("@")[0]) -Room -PrimarySmtpAddress $email -ErrorAction Stop;
	Write-Host ($MSG_MAILBOX_ROOM_CREATED -f $email) -ForegroundColor Yellow;
}

function CreateResourceEquipmentMailBox($email)
{
<#
.SYNOPSIS
Создает новый ресурсный почтовый ящик типа Equipment на основе существующей учетной записи

.DESCRIPTION

.PARAMETER email
Email имя пользователя

.EXAMPLE 
CreateResourceEquipmentMailBox -email "user@company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;

	Write-Host ($MSG_MAILBOX_EQUIPMENT_CREATING -f $email);
	$mailbox = Enable-Mailbox -Identity ($email.Split("@")[0]) -Equipment -PrimarySmtpAddress $email -ErrorAction Stop;
	Write-Host ($MSG_MAILBOX_EQUIPMENT_CREATED -f $email) -ForegroundColor Yellow;
}

function CreatePublicFolder($name, $owner)
{
<#
.SYNOPSIS
Создает новую папку с указанным именем в корневой директории

.DESCRIPTION

.PARAMETER name 
Название папки

.PARAMETER owner 
Владелец папки

.EXAMPLE 
CreatePublicFolder -name "TestPublicFolder" -owner "user@company.local"

.NOTES
#>
	# Создание новой папки в корневой директории
	Write-Host ($MSG_PUBLIC_FOLDER_CREATING -f $name);
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	$folder = New-PublicFolder -Name $name -ErrorAction Stop;
	Write-Host ($MSG_PUBLIC_FOLDER_CREATED -f $name) -ForegroundColor Yellow;
	
	Start-Sleep -Seconds $TIMEOUT;
	Enable-MailPublicFolder "\$name" -ErrorAction Stop;
	Start-Sleep -Seconds $TIMEOUT;
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Предоставление полного набора прав на папку указанному пользователю
	Write-Host ($MSG_PUBLIC_FOLDER_OWNER_ADDING -f $name,$owner);
	$permissions = Add-PublicFolderClientPermission -Identity ("\" + $name) -User $owner -AccessRights Owner -ErrorAction Stop;
	Write-Host ($MSG_PUBLIC_FOLDER_OWNER_ADDED -f $name,$owner) -ForegroundColor Yellow;
	
	Start-Sleep -Seconds $TIMEOUT;
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	Write-Host ($MSG_PUBLIC_FOLDER_MAIL_SETTING -f $name);
	$n = 50;
	for($i=1; $i -le $n; $i++) 
	{
		Start-Sleep -Seconds 2;
		try
		{
			Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
			Set-MailPublicFolder -Identity "\$name" -PrimarySmtpAddress $name -EmailAddressPolicyEnabled $false -ErrorAction Stop;
			break;
		}
		catch 
		{
			if($i -eq ($n - 1))
			{
				throw $_.Exception;
			}
		}
	}
	
	Write-Host ($MSG_PUBLIC_FOLDER_MAIL_SETTED -f $name);
}

function DeletePublicFolder($name)
{
<#
.SYNOPSIS
Удаляет папку с указанным именем из корневой директории

.DESCRIPTION

.PARAMETER name 
Название папки

.EXAMPLE 
DeletePublicFolder -name "TestPublicFolder"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	Disable-MailPublicFolder "\$name" -Confirm:$False -ErrorAction Stop;
	Start-Sleep -Seconds $TIMEOUT;
	
	# Удаление новой папки в корневой директории
	Write-Host ($MSG_PUBLIC_FOLDER_DELETING -f $name);
	$folder = Remove-PublicFolder -Identity ("\" + $name) -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_PUBLIC_FOLDER_DELETED -f $name) -ForegroundColor Yellow;
}

function CreateContact($email, $firstName, $lastName, $patronymic, $domainController)
{
<#
.SYNOPSIS
Создает новую контактную запись на Exchange сервере

.DESCRIPTION

.PARAMETER email
Email имя пользователя

.PARAMETER firstName 
Имя пользователя

.PARAMETER lastName 
Фамилия пользователя

.PARAMETER patronymic 
Отчество пользователя

.EXAMPLE 
CreateContact -email "user@company.local" -firstName "Иван" -lastName "Иванов" -patronymic "Иванович" -domainController sdc-client-01.client-test.parking.ru

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Конструируем ФИО
	$displayName = $lastName;
	if(-not [string]::IsNullOrEmpty($firstName))
	{
		$displayName += " " + $firstName;
	}
	
	if(-not [string]::IsNullOrEmpty($patronymic))
	{
		$displayName += " " + $patronymic;
	}
	
	Write-Host ($MSG_MAIL_CONTACT_CREATING -f $email);
	$mailcontact = New-MailContact -ExternalEmailAddress $email -Name $displayName -FirstName $firstName -LastName $lastName -PrimarySmtpAddress $email -DomainController $domainController -ErrorAction Stop;
	Write-Host ($MSG_MAIL_CONTACT_CREATED -f $email) -ForegroundColor Yellow;
}

function DeleteContact($email, $domainController)
{
<#
.SYNOPSIS
Удаляет контактную запись на Exchange сервере

.DESCRIPTION

.PARAMETER email
Email адрес пользователя

.EXAMPLE 
DeleteContact -email "user@company.local" -domainController $domainController

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Удаляем контактную запись
	Write-Host ($MSG_MAIL_CONTACT_DELETING -f $email);
	$mailcontact = Remove-MailContact -Identity $email -Confirm:$false -DomainController $domainController -ErrorAction Stop;
	Write-Host ($MSG_MAIL_CONTACT_DELETED -f $email) -ForegroundColor Yellow;
}

function AddRedefinitionDomainAddr($internalAddress, $externalAddress)
{
<#
.SYNOPSIS
Создает запись переопределения адресов домена на Exchange сервере

.DESCRIPTION

.PARAMETER internalAddress
Внутренний адрес Exchange

.PARAMETER externalAddress
Внешний адрес exchange

.EXAMPLE 
addRedefinitionDomainAddr -internalAddress  -externalAddress

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	Write-Host ($MSG_DOMAIN_ADDRESS_REWRITE_ENTRY_ADDING -f $email);
	$reWriteEntry = New-AddressRewriteEntry -Name "$internalAddress to $externalAddress" -InternalAddress $internalAddress -ExternalAddress $externalAddress;
	Write-Host ($MSG_DOMAIN_ADDRESS_REWRITE_ENTRY_ADDED -f $email) -ForegroundColor Yellow;
}

function CreateDomainAlias($domain, $domainAlias)
{
<#
.SYNOPSIS
Создает новый домен, соответствующий псевдониму.
Далее создает Email-address policy, в которой прописано правило, фильтрующее почтовые ящики по имени домена,
прописанному в 11-ом атрибуте учетной записи пользователя AD.

.DESCRIPTION

.PARAMETER domain
Имя почтового домена

.PARAMETER domainAlias
Псевдоним почтового домена

.EXAMPLE 
CreateDomainAlias -domain "test1.ru" -domainAlias "test2.ru"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;

	Write-Host ($MSG_MAIL_DOMAIN_ALIAS_CREATING -f $domain,$domainAlias);
	# Создание домена-псевдонима (чтоба Exchange-сервер смог принимать и отправлять почту с адресов-псевдонимов)
	$domainAliasObj = New-AcceptedDomain -DomainName $domainAlias -DomainType Authoritative -Name $domainAlias -ErrorAction Stop;
	# Создаем Email address policy
	$emailPolicy = New-EmailAddressPolicy -Name "Alias name $domainAlias for $domain domain" -IncludedRecipients AllRecipients -ConditionalCustomAttribute11 $domain -EnabledEmailAddressTemplates "SMTP:@$domainAlias" -ErrorAction Stop;
	# Применяем её
	$emailPolicy = Update-EmailAddressPolicy -Identity "Alias name $domainAlias for $domain domain" -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_ALIAS_CREATED -f $domain,$domainAlias) -ForegroundColor Yellow;
}

function DeleteDomainAlias($domain, $domainAlias)
{
<#
.SYNOPSIS
Удаляет Email-address policy, в которой прописано правило, фильтрующее почтовые ящики по имени домена,
прописанному в 11-ом атрибуте учетной записи пользователя AD.

.DESCRIPTION

.PARAMETER domain
Имя почтового домена

.PARAMETER domainAlias
Псевдоним почтового домена

.EXAMPLE 
DeleteDomainAlias -domain "test1.ru" -domainAlias "test2.ru"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	Write-Host ($MSG_MAIL_DOMAIN_ALIAS_DELETING -f $domain,$domainAlias);
	# Удаляем Email-address policy, отвечающую за создание псевдонима
	$EmailAddressPolicy = Remove-EmailAddressPolicy -Identity "Alias name $domainAlias for $domain domain" -Confirm:$false -ErrorAction Stop;
	# Удаляем почтовый домен, являющийся псевдонимом другого домена
	$domainAliasObj = Remove-AcceptedDomain $domainAlias -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_ALIAS_DELETED -f $domain,$domainAlias) -ForegroundColor Yellow;
}

function SetMailBoxSize($email, $size)
{
<#
.SYNOPSIS
Устанавливает размер указанного почтового ящика

.DESCRIPTION

.PARAMETER email 
Email имя пользователя

.PARAMETER size 
Размер почтового ящика в МБ

.EXAMPLE 
SetMailBoxSize -email "test@company.local" -size "10KB"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Устанавливаем размер почтового ящика
	Write-Host ($MSG_MAIL_BOX_SIZE_SETTING -f $email,$size);
	$IssueWarningQuota = $size - 2;
	$ProhibitSendQuota = $size - 1;
	$ProhibitSendReceiveQuota = $size;
	Set-Mailbox -Identity $email -IssueWarningQuota ("$IssueWarningQuota" + "MB") -ProhibitSendQuota ("$ProhibitSendQuota" + "MB") -ProhibitSendReceiveQuota ("$ProhibitSendReceiveQuota" + "MB") -UseDatabaseQuotaDefaults $false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_BOX_SIZE_SETTED -f $email,$size) -ForegroundColor Yellow;
}

function LockDomain($domainName, $domainController, $login, $password)
{
<#
.SYNOPSIS
Блокирует домен на Exchange сервере. Для всех пользователей, у которых в 11 атрибуте установлена принадлежность указанному домену,
отключается почтовый ящик.

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
LockDomain -domainName "company.local" 

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Получаем почтовый домен
	$domain = GetDomain $domainName;
	
	$PasswordObj = ConvertTo-SecureString –String $password –AsPlainText -Force -ErrorAction Stop;
	$UserCredential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $login,$PasswordObj -ErrorAction Stop;

	# Блокируем почтовый домен
	Write-Host ($MSG_MAIL_DOMAIN_LOCKING -f $domain.Name);
	$users = Get-ADUser -Filter * -Server $domainController -Credential $UserCredential -Properties ExtensionAttribute11 | Where-Object { $_.ExtensionAttribute11 -eq $domain.Name } | Disable-ADAccount -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_LOCKED -f $domain.Name) -ForegroundColor Yellow;
}

function UnlockDomain($domainName, $domainController, $login, $password)
{
<#
.SYNOPSIS
Разблокирует домен на Exchange сервере. Для всех пользователей, у которых в 11 атрибуте установлена принадлежность указанному домену,
подключается ранее отключенный почтовый ящик.

.DESCRIPTION

.PARAMETER domainName 
Имя почтового домена

.EXAMPLE 
UnlockDomain -domainName "company.local"

.NOTES
#>
	Set-AdServerSettings -ViewEntireForest $True -ErrorAction Stop;
	
	# Получаем почтовый домен
	$domain = GetDomain $domainName;
	
	$PasswordObj = ConvertTo-SecureString –String $password –AsPlainText -Force -ErrorAction Stop;
	$UserCredential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $login,$PasswordObj -ErrorAction Stop;

	# Разблокируем почтовый домен
	Write-Host ($MSG_MAIL_DOMAIN_UNLOCKING -f $domain.Name);
	$users = Get-ADUser -Filter * -Server $domainController -Credential $UserCredential -Properties ExtensionAttribute11 | Where-Object { $_.ExtensionAttribute11 -eq $domain.Name } | Enable-ADAccount -Confirm:$false -ErrorAction Stop;
	Write-Host ($MSG_MAIL_DOMAIN_UNLOCKED -f $domain.Name) -ForegroundColor Yellow;
}