
function RegistryPathNotFoundExceptionHandler()
{
    param ($exceptionObject, $registryPath)
    Write-Host 'Было вызвано исключение: '$_.Exception.Message -ForegroundColor: Red
    Exit
}

function getLocaleFromLCID()
{
	param ($sharepointLanguage)
	return [System.Globalization.Cultureinfo]::GetCultureInfo([System.Convert]::ToInt32($sharepointLanguage)) | Select-Object -ExpandProperty DisplayName
}

function CheckSharePoint()
{
	$SharePointProducts = @{"B7D84C2B-0754-49E4-B7BE-7EE321DCE0A9"= "SharePoint Server 2013 Enterprise"; "C5D855EE-F32B-4A1C-97A8-F0A28CE02F9C"= "SharePoint Server 2013"; "9FF54EBC-8C12-47D7-854F-3865D4BE8118"= "SharePoint Foundation 2013"}
	$SharePointProductsRegistryPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\15.0\WSS\InstalledProducts\'
	try
    {
        $SKUProperties = Get-Item -Path Registry::$SharePointProductsRegistryPath -ErrorAction stop
    }
    catch [Exception]
    {
        RegistryPathNotFoundExceptionHandler $_.Exception $SharePointProductsRegistryPath
    }
    
	$sharepointSKUInfo = Get-ItemProperty -Path Registry::$SharePointProductsRegistryPath | Select-Object -ExpandProperty $SKUProperties.Property[0]
	$sharepointEdition = $SharePointProducts[$sharepointSKUInfo]
	Write-Host "Текущая редакция Sharepoint:"$sharepointEdition  -ForegroundColor: Green
	if($sharepointEdition -ne "SharePoint Foundation 2013")			
	{
	    Write-Host "На данном сервере не установлен SharePoint Foundation 2013" -ForegroundColor: Red
	    Exit
	}

    Write-Host 'Выполняется проверка доступа к коллекции узлов '$SiteUrl -ForegroundColor: Green
    try
    {
        $site = Get-SPSite $SiteUrl -ErrorAction stop
        Write-Host 'Коллекция узлов '$SiteUrl' доступна' -ForegroundColor: Green
    }
    catch [Exception]
    {
        Write-Host 'Не удалось подключиться к коллекции узлов: '$_.Exception.Message -ForegroundColor: Red
        Exit       
    }
    
    $web = $site.RootWeb
    if($site.ServerRelativeUrl -ne '/')
    {
        Write-Host 'Установка СДЦ. Типовой портал не поддерживается для коллекций сайтов с данным относительным адресом:'$site.ServerRelativeUrl
        Exit
    }

    $ca = [Microsoft.SharePoint.Administration.SPWebService]::AdministrationService.WebApplications | Select -First 1
    $root = $ca.Sites["/"].RootWeb
    $grp = $root.SiteGroups["Farm Administrators"]

    if(!$grp.ContainsCurrentUser -and $site.SystemAccount.ID -eq $web.CurrentUser.ID)
    {
        Write-Host "Текущая учётная запись не является системной учётной записью. Войдите на сервер под одной из следующих учётных записей:" -ForegroundColor: Red
        foreach($user in $grp.Users)
        { 
            Write-Host $user.DisplayName -ForegroundColor: Red
        }
        Exit
    }

    Write-Host "Текущая язык SharePoint:"(getLocaleFromLCID $web.Language) -ForegroundColor: Green
    if($web.Language -ne 1049)
	{
	    Write-Host "Требуется русская версия SharePoint." -ForegroundColor: Red
	    Exit
	}
}

function CheckWindowsVersion()
{
    $os = (Get-WmiObject win32_operatingsystem)
    Write-Host "Текущая версия ОС:"$os.Version -ForegroundColor: Green
    if(!($os.Version -eq "6.2.9200"))
    {
	    Write-Host "Данная версия ОС Windows не поддерживается. Требуется ОС Windows Server 2012 (версия 6.2.9200)" -ForegroundColor: Red
	    Exit
    }
    if(!($os.ProductType -eq 3))
    {
        Write-Host "Данная версия ОС Windows не является серверной. Требуется ОС Windows Server 2012" -ForegroundColor: Red
	    Exit
    }
}

function CheckMSSQLServer()
{	
	$msSqlServerNotFoundExcmessage = 'Не удаётся найти необходимые записи реестра. Возможно MS SQL Server не был установлен.'
    $msSqlInstancesPropertyPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL'
    Try
    {    
        $msSqlInstancesProperty = Get-Item -Path Registry::$msSqlInstancesPropertyPath -ErrorAction stop
    }
    Catch [Exception]
    {
		Write-Host $msSqlServerNotFoundExcmessage -ForegroundColor: Red
        RegistryPathNotFoundExceptionHandler $_.Exception $msSqlInstancesPropertyPath
    }
	
    $msSqlInstancesPropertyWithValue = Get-ItemProperty -Path Registry::$msSqlInstancesPropertyPath
    $value = $msSqlInstancesPropertyWithValue | Select-Object -ExpandProperty $msSqlInstancesProperty.Property[0]
	if([system.String]::IsNullOrWhiteSpace($value))
	{
		Write-Host 'На данном компьютере не обнаружено ни одного экземпляра Microsoft SQL Server' -ForegroundColor: Red
		Exit
	}
    $msServerInfoPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\' + $value + '\Setup'
    Try
    {
        $msServerInfo = Get-ItemProperty -Path Registry::$msServerInfoPath -ErrorAction stop
    }
    Catch [Exception]
    {
		Write-Host $msSqlServerNotFoundExcmessage -ForegroundColor: Red
        RegistryPathNotFoundExceptionHandler $_.Exception $msServerInfoPath
    }
	
	if([system.String]::IsNullOrWhiteSpace($msServerInfo.Version))
	{
		Write-Host 'Не удалось получить информацию о версии Microsoft SQL Server' -ForegroundColor: Red
		Exit
	}
	
	if([system.String]::IsNullOrWhiteSpace($msServerInfo.EditionType))
	{
		Write-Host 'Не удалось получить информацию о редакции Microsoft SQL Server' -ForegroundColor: Red
		Exit
	}

    Write-Host 'Текущая редакция MS SQL Server:'$msServerInfo.EditionType -ForegroundColor: Green
    if($msServerInfo.EditionType -ne 'Express Edition')
    {
        Write-Host 'Данная редакция Microsoft SQL Server не поддерживается. Требуется редакция Express Edition' -ForegroundColor: Red
	    Exit 
    }
    Write-Host 'Текущая версия MS SQL Server:'$msServerInfo.Version -ForegroundColor: Green
    $versionInfo = $msServerInfo.Version.Split('.')
    if(($versionInfo[0] -ne 10) -or ($versionInfo[1] -lt 50))
    {
        Write-Host 'Данная версия Microsoft SQL Server не поддерживается. Требуется MS SQL Server 2008 R2 (версия 10.50)' -ForegroundColor: Red
	    Exit 
    }
    $computerName = Get-WmiObject -Class Win32_ComputerSystem | Select-Object -ExpandProperty PSComputerName
    $sqlServerInstancePath = $computerName+'\' + $msSqlInstancesProperty.Property[0]
    Write-Host 'Выполняется попытка подключиться к Microsoft SQL Server'$sqlServerInstancePath
    try
    {
        Invoke-Sqlcmd -ServerInstance $sqlServerInstancePath -Query 'SELECT @@VERSION;' -QueryTimeout 5 -ErrorAction stop | Out-Null 
        Write-Host 'Подключение выполнено успешно'
    }
    catch [Exception]
    {
        Write-Host 'Не удалось подключиться к Microsoft SQL Server:' -ForegroundColor: Red
        Write-Host $_.Exception.Message -ForegroundColor: Red
	    Exit 
    }
}

function CheckInstallRequirements()
{
	param ($siteUrl)
	if ([system.String]::IsNullOrWhiteSpace($SiteUrl))
	{   
		Write-Host "Не задан адрес коллекции сайтов" -ForegroundColor: Red
		Exit
	}

	#checkRunning as Administrator
	if(!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
	{
		Write-Host 'Запустите PowerShell c правами администратора' -ForegroundColor: Red
		Exit
	}

	CheckSharePoint
	CheckMSSQLServer
	CheckWindowsVersion
}