function AddDomainUser($login, $password, $path, $adServer)
{
<#
.SYNOPSIS
Добавляет пользователя в AD

.DESCRIPTION

.PARAMETER login 
Имя нового пользователя
.PARAMETER password 
Пароль нового пользователя
.PARAMETER path 
Путь к контейнеру AD, в котором будут создаваться пользователи

.EXAMPLE 
AddDomainUser TestUser pswd

.NOTES
#>
	Write-Host ($MSG_AD_PATH_CHECKING -f $path,$adServer);
	CreatePath -path $path -adServer $adServer;
	Write-Host ($MSG_AD_PATH_CHECKED -f $path,$adServer) -ForegroundColor Yellow;
	
	Write-Host ($MSG_DOMAIN_USER_CREATING -f $login);
	New-ADUser -Name $login -AccountPassword (ConvertTo-SecureString $password -AsPlainText -force) -Enabled $true -Path $path  -PasswordNeverExpires $true -CannotChangePassword $true -Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_CREATED -f $login) -ForegroundColor Yellow;
}

function DeleteDomainUser($login, $adServer)
{
<#
.SYNOPSIS
Удаляет существующего пользователя из AD

.DESCRIPTION

.PARAMETER login 
Существующее имя пользователя

.EXAMPLE 
DeleteDomainUser TestUser

.NOTES
#>
	Write-Host ($MSG_DOMAIN_USER_GETTING -f $login,$adServer);
	$user = Get-ADUser -Identity $login -Server $adServer;
	Write-Host ($MSG_DOMAIN_USER_GETTED -f $login) -ForegroundColor Yellow;

	$path = $user.DistinguishedName;
	
	Write-Host ($MSG_DOMAIN_USER_DELETING -f $login);
	Remove-ADUser -Identity $login -Confirm:$false -Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_DELETED -f $login) -ForegroundColor Yellow;
	
	Write-Host ($MSG_ORGANIZATIONAL_UNIT_DELETING -f $login,$adServer);
	DeletePath -path $path -adServer $adServer;
	Write-Host ($MSG_ORGANIZATIONAL_UNIT_DELETED -f $login,$adServer);
}

function ChangePassword($login, $password, $adServer)
{
<#
.SYNOPSIS
Изменяет пароль существующего пользователя в AD

.DESCRIPTION

.PARAMETER login 
Существующее имя пользователя в AD

.PARAMETER password 
Новый пароль для учетной записи пользователя

.EXAMPLE 
ChangePassword -login "domain\User" "P@ssw0rd"

.NOTES
#>
	$accountPassword = ConvertTo-SecureString $password -AsPlainText -force;
	
	Write-Host ($MSG_DOMAIN_USER_PASSWORD_CHANGING -f $login);
	$user = Get-ADUser $login -Server $adServer -ErrorAction Stop;
	Set-ADAccountPassword -Identity $user -NewPassword $accountPassword -Server $adServer -reset -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_PASSWORD_CHANGED -f $login) -ForegroundColor Yellow;
}

function AddDomainUserToGroup($login, $group, $adServer)
{
<#
.SYNOPSIS
Добавляет доменного пользователя в группу AD

.DESCRIPTION

.PARAMETER login 
Существующее имя пользователя в AD, без домена

.PARAMETER group 
Существующее имя группы пользователей

.PARAMETER server 
DNS-имя/IP-адрес сервера AD

.EXAMPLE 
AddDomainUserToGroup -login "User" -group "Users" -server "adserver.company.local"

.NOTES
#>
	Write-Host ($MSG_DOMAIN_USER_GETTING -f $login,$adServer);
	$userObj = Get-ADUser -Identity $login –Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_GETTED -f $login) -ForegroundColor Yellow;
	
	Write-Host ($MSG_DOMAIN_GROUP_GETTING -f $group,$adServer);
	$groupObj = Get-ADGroup -Identity $group –Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_GROUP_GETTED -f $group) -ForegroundColor Yellow;
	
	Write-Host ($MSG_DOMAIN_USER_TO_GROUP_ADDING -f $login,$group,$adServer);
	Add-ADGroupMember -Identity $groupObj –Member $userObj -Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_TO_GROUP_ADDED -f $login,$group) -ForegroundColor Yellow;
}

function UpdateUserInfo($login, $firstName, $lastName, $patronymic, $adServer)
{
	Write-Host ($MSG_DOMAIN_USER_GETTING -f $login,$adServer);
	$userObj = Get-ADUser -Identity $login -Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_GETTED -f $login) -ForegroundColor Yellow;

	Write-Host ($MSG_DOMAIN_USER_SETTING -f $login,$adServer);
	Set-ADUser -Identity $userObj -Surname $lastName -givenName $firstName -DisplayName ($lastName + $firstName + $patronymic) -Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_SETTED -f $login) -ForegroundColor Yellow;
}

function CreatePath($path, $adServer)
{
<#
.SYNOPSIS
Создает полный путь к контейнеру AD

.DESCRIPTION

.PARAMETER path 
Путь к контейнеру, который необходмо воссоздать

.PARAMETER adServer 
Контроллер AD, на котором исполняются операции

.EXAMPLE 
CreatePath -path "OU=IS_Users" -adServer "eeliseeva"

.NOTES
#>

	$pathParts = $path.Split(",");
	
	for ($i=($pathParts.Length - 1); $i -ge 0; $i--)
	{
		$adObjectType = $pathParts[$i].Substring(0,2);
		if($adObjectType -eq "OU")
		{
			$adPathParts = $pathParts[($i+1)..($pathParts.Length - 1)];
			$adPath = $adPathParts -join ",";

			$OUName = $pathParts[$i].Substring(3,$pathParts[$i].Length - 3);
			if([adsi]::Exists("LDAP://$adServer/OU=$OUName,$adPath") -eq $false)
			{
				$OU = New-ADOrganizationalUnit -Name $OUName -Path $adPath -ProtectedFromAccidentalDeletion $false -Server $adServer -ErrorAction Stop;
			}
		}
	}
}

function DeletePath($path, $adServer)
{
<#
.SYNOPSIS
Удаляет путь к контейнеру AD при условии, что удаляемый контейнер пустой

.DESCRIPTION

.PARAMETER path 
Путь к контейнеру, который необходмо удалить

.PARAMETER adServer 
Контроллер AD, на котором исполняются операции

.EXAMPLE 
DeletePath -path "OU=IS_Users,DC=dc1,DC=sdc,DC=local" -adServer "eeliseeva"

.NOTES
#>
	$pathParts = $path.Split(",");
	
	for ($i=0; $i -le ($pathParts.Length - 1); $i++)
	{
		$adObjectType = $pathParts[$i].Substring(0,2);
		if($adObjectType -eq "OU")
		{
			$adPathParts = $pathParts[($i)..($pathParts.Length - 1)];
			$adPath = $adPathParts -join ",";

			$children = Get-ADObject -Filter * -SearchBase $adPath -SearchScope Subtree -Server $adServer -ErrorAction Stop;
			$countChildren = @($children).Length;
			if($countChildren -eq 1)
			{
				$OU = Remove-ADOrganizationalUnit -Identity $adPath -Confirm:$false -Server $adServer -ErrorAction Stop;
			}
			else
			{
				break;
			}
		}
	}
}

function EnableDomainUser($login, $adServer)
{
<#
.SYNOPSIS
Разблокирует учетную запись пользователя AD

.DESCRIPTION

.PARAMETER login 
Существующее имя пользователя в AD

.PARAMETER adServer 
Контроллер AD, на котором исполняются операции

.EXAMPLE 
EnableDomainUser -login "domain\User" -adServer "eeliseeva"

.NOTES
#>
	Write-Host ($MSG_DOMAIN_USER_ENABLING -f $login,$adServer)
	Enable-ADAccount -Identity $login -Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_ENABLED -f $login,$adServer)
}

function DisableDomainUser($login, $adServer)
{
<#
.SYNOPSIS
Блокирует учетную запись пользователя AD

.DESCRIPTION

.PARAMETER login 
Существующее имя пользователя в AD

.PARAMETER adServer 
Контроллер AD, на котором исполняются операции

.EXAMPLE 
DisableDomainUser -login "domain\User" -adServer "eeliseeva"

.NOTES
#>
	Write-Host ($MSG_DOMAIN_USER_DISABLING -f $login,$adServer)
	Disable-ADAccount -Identity $login -Server $adServer -ErrorAction Stop;
	Write-Host ($MSG_DOMAIN_USER_DISABLED -f $login,$adServer)
}