function CreateHostHeader([string]$iisserver, [string]$name, [int]$port, [string]$hostheader, [string]$ipAddress, [string]$protocol)
{
<#
.SYNOPSIS
Создает Host-Header для сайта с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER name 
Название сайта

.PARAMETER port 
Номер порта

.PARAMETER hostheader 
Устанавливаемый host header

.PARAMETER ipAddress 
Устанавливаемый IP-адрес. Если необходимо прослушивать все IP-адреса, то необходимо передать значение "*"

.PARAMETER protocol 
Устанавливаемый протокол

.EXAMPLE 
CreateHostHeader -iisserver "iis.server.local" -name "test" -port 80 -hostheader "www.test.local" -ipAddress "*" -protocol "http"

.NOTES
#>
	# $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_HOST_HEADER_CREATING -f $name,$hostheader);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[int]$port,
			[string]$hostheader,
			[string]$ipAddress,
			[string]$protocol
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}

					$Binding = New-WebBinding -Name $name -IPAddress $ipAddress -Port $port -HostHeader $hostheader -Protocol $protocol -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name,$port,$hostheader,$ipAddress,$protocol -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_HOST_HEADER_CREATED -f $name,$hostheader) -ForegroundColor Yellow;
	}
}

function DeleteHostHeader([string]$iisserver, [string]$name, [int]$port, [string]$hostheader, [string]$ipAddress,[string]$protocol)
{
<#
.SYNOPSIS
Удаляет HostHeader для веб-сайта с указанными параметрами на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER name 
Название сайта

.PARAMETER port 
Номер порта

.PARAMETER hostheader 
Устанавливаемый host header

.PARAMETER ipAddress 
Устанавливаемый IP-адрес. Если необходимо прослушивать все IP-адреса, то необходимо передать значение "*"

.PARAMETER protocol 
Устанавливаемый протокол

.EXAMPLE 
DeleteHostHeader -iisserver "iis.server.local" -name "test" -port 80 -hostheader "www.test.local" -ipAddress "*" -protocol "http"

.NOTES
#>
	# $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_HOST_HEADER_DELETING -f $name,$hostheader);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[int]$port,
			[string]$hostheader,
			[string]$ipAddress,
			[string]$protocol
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					$Binding = Remove-WebBinding -Name $name -IPAddress $ipAddress -Port $port -HostHeader $hostheader -Protocol $protocol -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name,$port,$hostheader,$ipAddress,$protocol -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_HOST_HEADER_DELETED -f $name,$hostheader) -ForegroundColor Yellow;
	}
}

function CreateSite([string]$iisserver, [string]$name, [int]$port, [string]$hostheader, [string]$ipAddress, [string]$physicalPath, [string]$applicationPool)
{
<#
.SYNOPSIS
Создает Web-сайт с указанными параметрами на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER name 
Название сайта

.PARAMETER port 
Номер порта

.PARAMETER hostheader 
Устанавливаемый host header

.PARAMETER ipAddress 
Устанавливаемый IP-адрес. Если необходимо прослушивать все IP-адреса, то необходимо передать значение "*"

.PARAMETER protocol 
Устанавливаемый протокол

.PARAMETER applicationPool 
Пул приложений, в рамках которого будет работать сайт. Если такого пула приложений не существует, то создается новый с таким же именем, как и имя веб-сайта

.EXAMPLE 
CreateSite -iisserver "iis.server.local" -name "test" -port 80 -hostheader "www.test.local" -ipAddress "*" -protocol "http" -applicationPool "DefaultAppPool"

.NOTES
#>
	# $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_WEB_SITE_CREATING -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[int]$port,
			[string]$hostheader,
			[string]$ipAddress,
			[string]$physicalPath,
			[string]$applicationPool
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Проверяем существование пула приложений, если он не существует - создаем его
					if(!((Test-Path ("IIS:\AppPools\$applicationPool")) -and ($applicationPool -ne "")))
					{
						$AppPool = New-WebAppPool $applicationPool -ErrorAction Stop;
					}
					
					if(!(Test-Path $physicalPath))
					{
						$folder = New-Item -Path $physicalPath -ItemType "directory";
					}
					
					$wwwRootPath           = Join-Path $physicalPath "WWWRoot";
					$wwwLogsPath           = Join-Path $physicalPath "WWWLogs";
					$failedRequestLogsPath = Join-Path $physicalPath "FailedRequestLogs";
					
					if(!(Test-Path $wwwRootPath))
					{
						$folder = New-Item -Path $wwwRootPath -ItemType "directory";
					}
					
					if(!(Test-Path $wwwLogsPath))
					{
						$folder = New-Item -Path $wwwLogsPath -ItemType "directory";
					}
					
					if(!(Test-Path $failedRequestLogsPath))
					{
						$folder = New-Item -Path $failedRequestLogsPath -ItemType "directory";
					}
					
					$WebSite = New-WebSite -Name $name -IPAddress $ipAddress -Port $port -HostHeader $hostheader -PhysicalPath $wwwRootPath -ApplicationPool $applicationPool -ErrorAction Stop;
					
					# Настройка логгирования ошибочных запросов
					
					Set-ItemProperty "IIS:\Sites\$name" -name traceFailedRequestsLogging.directory $failedRequestLogsPath -ErrorAction Stop;
					Set-ItemProperty "IIS:\Sites\$name" -name traceFailedRequestsLogging.enabled $true -ErrorAction Stop;
					Set-ItemProperty "IIS:\Sites\$name" -name traceFailedRequestsLogging.maxLogFiles 50 -ErrorAction Stop;
					Set-ItemProperty "IIS:\Sites\$name" -name traceFailedRequestsLogging.maxLogFileSizeKB 1024 -ErrorAction Stop;
					
					# Настройка логгирования запросов
					# Отличается для IIS разных версий
					
					$IISVersion = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\InetStp\" | Select SetupString).SetupString
					
					if($IISVersion -like '*IIS 7*')
					{
						Set-ItemProperty "IIS:\Sites\$name" -name logFile.logFormat 2 -ErrorAction Stop; # 2 == W3C
						Set-ItemProperty "IIS:\Sites\$name" -name logFile.period 1 -ErrorAction Stop; # 1 == Daily
						Set-ItemProperty "IIS:\Sites\$name" -name logFile.logExtFileFlags 0xFFFFFFFF
					}
					else
					{
						Set-ItemProperty "IIS:\Sites\$name" -name logFile.logFormat "W3C" -ErrorAction Stop;
						Set-ItemProperty "IIS:\Sites\$name" -name logFile.period "Daily" -ErrorAction Stop;
						Set-ItemProperty "IIS:\Sites\$name" -name logFile.logExtFileFlags "Date,Time,ClientIP,UserName,SiteName,ComputerName,ServerIP,Method,UriStem,UriQuery,HttpStatus,Win32Status,BytesSent,BytesRecv,TimeTaken,ServerPort,UserAgent,Cookie,Referer,ProtocolVersion,Host,HttpSubStatus" -ErrorAction Stop;
					}
					
					Set-ItemProperty "IIS:\Sites\$name" -name logFile.directory $wwwLogsPath -ErrorAction Stop;
					
					# Установка анонимной аутентификации с правами от имени учетной записи пула приложений
					Set-WebConfigurationProperty -filter /system.WebServer/security/authentication/AnonymousAuthentication -name username -value "" -Location $name
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name,$port,$hostheader,$ipAddress,$physicalPath,$applicationPool -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_WEB_SITE_CREATED -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function StartAppPool([string]$name,[string]$iisserver)
{
<#
.SYNOPSIS
Выполняет запуск пула-приложений с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя пула приложений

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.EXAMPLE 
StartAppPool -iisserver "iis.server.local" -name "DefaultAppPool"

.NOTES
#>
	# $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_APP_POOL_STARTING -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Запускаем пул приложений
					$AppPool = Start-WebAppPool -Name $name -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_STARTED -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function RestartAppPool([string]$name,[string]$iisserver)
{
<#
.SYNOPSIS
Выполняет перезапуск пула-приложений с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя пула приложений

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.EXAMPLE 
RestartAppPool -iisserver "iis.server.local" -name "DefaultAppPool"

.NOTES
#>
	# $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_APP_POOL_RESTARTING -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Перезапускаем пул приложений
					$AppPool = Restart-WebAppPool -Name $name -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_RESTARTED -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function ChangeFrameworkVersion([string]$name,[string]$iisserver,[string]$version)
{
<#
.SYNOPSIS
Изменяет версию .Net Framework для указанного пула-приложений на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя пула приложений

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER version 
Версия .Net Framework. Например: v4.0, v3.5

.EXAMPLE 
ChangeFrameworkVersion -iisserver "iis.server.local" -name "DefaultAppPool" -version v2.0

.NOTES
#>
	# $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_APP_POOL_NET_VERSION_CHANGING -f $name,$iisserver,$version);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[string]$version
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Изменяем версию .Net Framework для пула приложений
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name managedRuntimeVersion $version -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name,$version -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_NET_VERSION_CHANGED -f $name,$iisserver,$version) -ForegroundColor Yellow;
	}
}

function ChangePipelineMode([string]$name,[string]$iisserver,[string]$mode)
{
<#
.SYNOPSIS
Изменяет режим конвейера для указанного пула-приложений на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя пула приложений

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER mode 
Режим конвейера. Допустимые значения: Integrated Classic

.EXAMPLE 
ChangePipelineMode -iisserver "iis.server.local" -name "DefaultAppPool" -mode Classic

.NOTES
#>
	# $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_APP_POOL_PIPELINE_MODE_CHANGING -f $name,$iisserver,$mode);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[string]$mode
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Изменяем режим конвейера для пула приложений
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name managedPipelineMode $mode -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}

		return $null;
		
	} -ArgumentList $name,$mode -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_PIPELINE_MODE_CHANGED -f $name,$iisserver,$mode) -ForegroundColor Yellow;
	}
}

function ChangeAppPoolIdentity([string]$name,[string]$iisserver,[string]$login,[string]$password)
{
<#
.SYNOPSIS
Изменяет учетную запись, под которой работает указанный пул-приложений на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя пула приложений

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER login
Логин учетной записи

.PARAMETER password
Пароль учетной записи

.EXAMPLE 
ChangeAppPoolIdentity -iisserver "iis.server.local" -name "DefaultAppPool" -login "CLIENT-TEST\ot" -password P@ssw0rd

.NOTES
#>
	# $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_APP_POOL_IDENTITY_CHANGING -f $name,$iisserver,$login);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[string]$login,
			[string]$password
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					
					# Изменяем учетную запись пользователя, под которой работает пул приложений
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name ProcessModel.identityType 3 -ErrorAction Stop;
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name ProcessModel.userName $login -ErrorAction Stop;
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name ProcessModel.password $password -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name,$login,$password -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_IDENTITY_CHANGED -f $name,$iisserver,$login) -ForegroundColor Yellow;
	}
}

function StartWebSite([string]$name,[string]$iisserver)
{
<#
.SYNOPSIS
Выполняет запуск сайта с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя сайта

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.EXAMPLE 
StartWebSite -iisserver "iis.server.local" -name "SiteName"

.NOTES
#>
	# $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_WEB_SITE_STARTING -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Запускаем сайт
					$Site = Start-WebSite -Name $name -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_WEB_SITE_STARTED -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function StopWebSite([string]$name,[string]$iisserver)
{
<#
.SYNOPSIS
Выполняет остановку сайта с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя сайта

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.EXAMPLE 
StopWebSite -iisserver "iis.server.local" -name "SiteName"

.NOTES
#>
	# $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_WEB_SITE_STOPPING -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Останавливаем сайт
					$Site = Stop-WebSite -Name $name -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $name -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_WEB_SITE_STOPPED -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function ChangeWebSitePool([string]$siteName, [string]$appPoolName, [string]$iisserver)
{
<#
.SYNOPSIS
Изменяем пул приложений для указанного сайта на указанном IIS-сервере

.DESCRIPTION

.PARAMETER siteName 
Имя сайта

.PARAMETER appPoolName 
Имя пула приложений

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.EXAMPLE 
ChangeWebSitePool -iisserver "iis.server.local" -siteName "SiteName" -appPoolName "DefaultAppPool"

.NOTES
#>
	# $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_WEB_SITE_APP_POOL_CHANGING -f $siteName,$iisserver,$appPoolName);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$siteName,
			[string]$appPoolName
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Проверяем, существует ли такой пул приложений, если такого нет, генерируется исключение
					$AppPoolState = Get-WebAppPoolState $appPoolName -ErrorAction Stop;
					
					# Изменяем пул приложений для веб-сайта
					$Site = Set-ItemProperty ("IIS:\Sites\" + $siteName) -name ApplicationPool $appPoolName -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $siteName,$appPoolName -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_WEB_SITE_APP_POOL_CHANGED -f $siteName,$iisserver,$appPoolName) -ForegroundColor Yellow;
	}
}

function RemoveWebSite([string]$name,[string]$iisserver,[bool]$deleteFiles)
{
<#
.SYNOPSIS
Выполняет удаление указанного сайта включая удаление физически размещенных на нем файлов на указанном IIS-сервере

.DESCRIPTION

.PARAMETER name 
Имя веб-сайта

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER deleteFiles 
Логическое значение. True - означает удалять физически размещенные файлы на сервере.

.EXAMPLE 
RemoveWebSite -iisserver "iis.server.local" -name "Site" -deleteFiles $false

.NOTES
#>
	# $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_WEB_SITE_REMOVING -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[bool]$deleteFiles
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					
					# Получаем директорию, в которой располагаются файлы сайта
					$directory = Get-ItemProperty ("IIS:\Sites\" + $name) -Name physicalPath -ErrorAction Stop;
					
					# Удаляем веб-сайт с IIS-сервера
					$Site = Remove-WebSite -Name $name -Confirm:$false -ErrorAction Stop;

					if($deleteFiles)
					{
						# Удаляем физически размещенные файлы на сервере
						$directory = Remove-Item $directory -Recurse -Force -ErrorAction Stop;
					}
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		
		return $null;
		
	} -ArgumentList $name,$deleteFiles -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_WEB_SITE_REMOVED -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function InstallCMS([string]$iisserver,[string]$cmsName,[string]$siteName)
{
<#
.SYNOPSIS
Выполняет установку заданной CMS на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER cmsName 
Название целевой CMS. Файлы дистрибутива CMS должны находиться в папке с путем: $PATH_TO_CMS\$cmsName

.PARAMETER siteName 
Имя сайта. Директория сайта должна быть пуста на момент установки CMS.

.EXAMPLE 
InstallCMS -iisserver "iis.server.local" -cmsName Joomla -siteName mysite

.NOTES
#>
	# $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_CMS_INSTALLING -f $siteName,$iisserver,$cmsName);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$cmsName,
			[string]$siteName,
			[string]$PATH_TO_CMS
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Получаем директорию, в которой располагаются файлы сайта
					$directory = Get-ItemProperty ("IIS:\Sites\$siteName") -Name physicalPath -ErrorAction Stop;
					
					# Проверяем, пуста ли эта директория
					$CountItems = ( Get-ChildItem $directory | Measure-Object ).Count;
					if($CountItems -eq 0)
					{
						Copy-Item "$PATH_TO_CMS\$cmsName\*" -Destination $directory -Recurse -ErrorAction Stop;
					}
					else
					{
						throw ("Директория сайта не пуста");
					}
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $cmsName,$siteName,$PATH_TO_CMS -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_CMS_INSTALLED -f $siteName,$iisserver,$cmsName) -ForegroundColor Yellow;
	}	
}

function CreateBackup([string]$iisserver,[string]$siteName,[string]$backupCatalog)
{
<#
.SYNOPSIS
Выполняет резервное копирование файлов сайта на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER siteName 
Имя сайта. Директория сайта должна быть пуста на момент установки CMS.

.PARAMETER backupCatalog 
Каталог для резервного копирования

.EXAMPLE 
CreateBackup -iisserver "iis.server.local" -siteName mysite -backupCatalog "C:\MySiteBackup"

.NOTES
#>
	# $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_BACKUP_CREATING -f $siteName,$iisserver,$backupCatalog);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$backupCatalog,
			[string]$siteName
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Получаем директорию, в которой располагаются файлы сайта
					$siteDirectory = Get-ItemProperty ("IIS:\Sites\" + $siteName) -Name physicalPath -ErrorAction Stop;
					$BackupDirectory = Copy-Item $siteDirectory -Destination $BackupDirectory -Recurse -Force -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		return $null;
		
	} -ArgumentList $backupCatalog,$siteName -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_BACKUP_CREATED -f $siteName,$iisserver,$backupCatalog) -ForegroundColor Yellow;
	}
}

function CreateRedirect([string]$iisserver,[string]$siteName,[string]$path,[string]$destination,[bool]$exactDestination,[bool]$childOnly)
{
<#
.SYNOPSIS
Задает перенаправление для адреса на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER siteName 
Имя сайта. Директория сайта должна быть пуста на момент установки CMS.

.PARAMETER path 
Путь к странице, которую необходимо перенаправить

.PARAMETER destination 
Страница, на которую выполняется перенаправление

.PARAMETER exactDestination 
Перенаправление выполняется точно на страницу, вместо относительного перенаправления

.PARAMETER childOnly 
Перенаправление выполняется только для файлов внутри этой директории

.EXAMPLE 
CreateRedirect -iisserver "iis.server.local" -siteName mysite -redirectURL "http://test.local/index.php"

.NOTES
#>
	# $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_REDIRECT_CREATING -f ("$siteName$path"),$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$siteName,
			[string]$path,
			[string]$destination,
			[bool]$exactDestination,
			[bool]$childOnly
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					
					# Устанавливаем перенаправление для страницы
					$redirection = Set-WebConfiguration -Filter system.webServer/httpRedirect -PSPath "IIS:\Sites\$siteName" -Value @{enabled="true";destination=$destination;exactDestination=$exactDestination;childOnly=$childOnly;httpResponseStatus="Found"}-Location $path;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}

		return $null;
		
	} -ArgumentList $siteName,$path,$destination,$exactDestination,$childOnly -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_REDIRECT_CREATED -f ("$siteName$path"),$iisserver) -ForegroundColor Yellow;
	}
}

function DeleteRedirect([string]$iisserver,[string]$siteName,[string]$path)
{
<#
.SYNOPSIS
Удаляет перенаправление для адреса на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER siteName 
Имя сайта. Директория сайта должна быть пуста на момент установки CMS.

.PARAMETER path 
Путь к странице, для которой необходимо удалить перенаправление

.EXAMPLE 
DeleteRedirect -iisserver "iis.server.local" -siteName mysite -redirectURL "http://test.local/index.php"

.NOTES
#>
	# $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_REDIRECT_DELETING -f ("$siteName$path"),$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$siteName,
			[string]$path,
			[string]$destination
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					
					# Устанавливаем перенаправление для страницы
					$redirection = Set-WebConfiguration -Filter system.webServer/httpRedirect -PSPath "IIS:\Sites\$siteName" -Value @{enabled="false";destination="";exactDestination=$false;childOnly=$false;httpResponseStatus="Found"}-Location $path;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}

		return $null;
		
	} -ArgumentList $siteName,$path -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_REDIRECT_DELETED -f ("$siteName$path"),$iisserver) -ForegroundColor Yellow;
	}
}

function CreateException($exInfo)
{
	$ex = New-Object -TypeName $exInfo.ExceptionType -ArgumentList $exInfo.Message;
	return $ex;
}

function SetAppPool($iisserver, $name, $CPUUsage, $RAMSize)
{
<#
.SYNOPSIS
Устанавливает масимальное использование процессора в минуту и масимальный объем оперативной памяти для пула-приложений с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER name 
Имя пула приложений

.PARAMETER CPUUsage 
Масимальное использование процессора в минуту для пула приложений

.PARAMETER RAMSize 
Масимальный объем оперативной памяти для пула приложений

.EXAMPLE 
SetAppPool -iisserver "iis.server.local" -name "DefaultAppPool"

.NOTES
#>
	# $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_APP_POOL_SETTING -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name,
			[string]$CPUUsage,
			[int]$RAMSize
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Устанавливаем масимальную мощность CPU
					$CPUUsageParts = $CPUUsage.Split("/");
					[int]$CPUPercent = $CPUUsageParts[0];
					$CPUInterval = 1;
					if([string]::IsNullOrEmpty($CPUUsageParts[1]) -eq $false)
					{
						[int]$CPUInterval = $CPUUsageParts[1];
					}
					
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name cpu.limit $CPUPercent -ErrorAction Stop;
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name cpu.limit $CPUInterval -ErrorAction Stop;
					
					# Устанавливаем масимальный объем защищенной оперативной памяти для пула приложений
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name recycling.periodicRestart.privateMemory $RAMSize -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}

		return $null;
		
	} -ArgumentList $name,$CPUUsage,$RAMSize -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_SETTED -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function EnableAppPool32Support($iisserver, $name)
{
<#
.SYNOPSIS
Включает поддержку 32-битных приложений для пула-приложений с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER name 
Имя пула приложений

.EXAMPLE 
EnableAppPool32Support -iisserver "iis.server.local" -name "DefaultAppPool"

.NOTES
#>
	# $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_APP_POOL_ENABLING32 -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Включаем поддержку 32-бтных приложений
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name enable32BitAppOnWin64 True -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}
		
		return $null;
		
	} -ArgumentList $name -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_ENABLED32 -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function DisableAppPool32Support($iisserver, $name)
{
<#
.SYNOPSIS
Выключает поддержку 32-битных приложений для пула-приложений с указанным именем на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.PARAMETER name 
Имя пула приложений

.EXAMPLE 
DisableAppPool32Support -iisserver "iis.server.local" -name "DefaultAppPool"

.NOTES
#>
	# $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_APP_POOL_DISABLING32 -f $name,$iisserver);
	$ExitObj = Invoke-Command -ComputerName $iisserver -ScriptBlock {
		param
		(
			[string]$name
		)
		try
		{
			$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
			$state = $mtx.WaitOne(60000);
			if($state)
			{
				try
				{
					if(!(Get-Module WebAdministration -ErrorAction:SilentlyContinue))
					{
						Import-Module WebAdministration
					}
					# Включаем поддержку 32-бтных приложений
					$AppPool = Set-ItemProperty ("IIS:\AppPools\" + $name) -name enable32BitAppOnWin64 False -ErrorAction Stop;
				}
				catch 
				{
					throw $_.Exception;
				}
				finally
				{
					$state = $mtx.ReleaseMutex();
				}
			}
			else
			{
				throw $MSG_CONFIG_FILE_LOCKED;
			}
		}
		catch
		{
			$returnedException = New-Object PSObject;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name Message -Value $_.Exception.Message;
			Add-Member -InputObject $returnedException -MemberType NoteProperty -Name ExceptionType -Value $_.Exception.GetType().FullName;
			return $returnedException;
		}

		return $null;
		
	} -ArgumentList $name -ErrorAction Stop;
	
	if($ExitObj -ne $null) 
	{
		throw (CreateException -exInfo $ExitObj);
	}
	else
	{
		Write-Host ($MSG_APP_POOL_DISABLED32 -f $name,$iisserver) -ForegroundColor Yellow;
	}
}

function ReadPath($server, $configPath, $сatalogPath)
{
<#
.SYNOPSIS
Считывает из файла с расположением $configPath путь к каталогу на указанном IIS-сервере и создает полный путь

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.EXAMPLE 
ReadPath -server 172.21.41.134 -configPath "C:\Backup.config" -сatalogPath "CLIENT-TEST\ot"

.NOTES
#>
	$Root = Invoke-Command -ComputerName $server -ScriptBlock ${function:ReadPathInternal} -ArgumentList $configPath,$сatalogPath;
	return $Root;
}

function ReadPathInternal($configPath, $сatalogPath)
{
	$mtx = New-Object System.Threading.Mutex($false, "IISSyncMutex");
	$state = $mtx.WaitOne(60000);
	if($state)
	{
		try
		{
			$FileExists = Test-Path -Path $configPath;
			$Root = "";
			if($FileExists)
			{
				$Root = Get-Content -Path $configPath -TotalCount 1;
			}
			if([string]::IsNullOrEmpty($Root))
			{
				$Root = "C:";
			}
			
			$ResultPath = "$Root\$сatalogPath";
			
			if(!(Test-Path $ResultPath))
			{
				$Folder = New-Item -Path $ResultPath -ItemType "directory";
			}
		}
		catch 
		{
			throw $_.Exception;
		}
		finally
		{
			$state = $mtx.ReleaseMutex();
		}
	}
	else
	{
		throw $MSG_CONFIG_FILE_LOCKED;
	}
	
	return $ResultPath;
}