Modules/SharePoint.2013.Toolbox/SharePoint.2013.Toolbox.psm1

function Set-SP2013SuiteBarText{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true,Position=1)] [string]$WebApp,
        [Parameter(Mandatory = $true,Position=2)] [string]$Text,
        [Parameter(Mandatory = $false,Position=3)] [string]$Link = $null
    )
    Try {
        $ver = $host | select version
        if ($ver.Version.Major -gt 1) {$host.Runspace.ThreadOptions = "ReuseThread"} 
        if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction Stop) -eq $null) {
            Write-Verbose "Adding SharePoint PowerShell Snapin"
            Add-PSSnapin "Microsoft.SharePoint.PowerShell"
        }
    }
    Catch [System.Exception]{
        Write-Warning "SharePoint PowerShell Snapin is not found"
    }
    
    $spWebapp = Get-SPWebApplication -Identity $WebApp 
    if ($Link -ne $null)
    {
        $spWebapp.SuiteBarBrandingElementHtml = '<div class="ms-core-brandingText" style="font-size: 15px !important; padding-left: 10px;"><a href="'+$Link+'" class="ms-core-suiteLink-a"><span>'+$Text+'</span></a></div>'
    }
    else
    {
        $webspWebappApp.SuiteBarBrandingElementHtml = '<div class="ms-core-brandingText">'+$Text+'</div>'
    }    
    $spWebapp.Update()
}

function Set-SP2013SiteLogo{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$True,Position=1)] [string]$SiteURL,
        [Parameter(Mandatory=$False,Position=2)] [string]$SiteLogoUrl = "",
        [Parameter(Mandatory=$False,Position=3)] [string]$SiteLogoDescription = ""
    )
    Try {
        $ver = $host | select version
        if ($ver.Version.Major -gt 1) {$host.Runspace.ThreadOptions = "ReuseThread"} 
        if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction Stop) -eq $null) {
            Write-Verbose "Adding SharePoint PowerShell Snapin"
            Add-PSSnapin "Microsoft.SharePoint.PowerShell"
        }
    }
    Catch [System.Exception]{
        Write-Warning "SharePoint PowerShell Snapin is not found"
    }
    
    $SPSite = Get-SPSite $SiteURL
    $SPSite.AllWebs | foreach { $_.SiteLogoUrl = $SiteLogoUrl; $_.SiteLogoDescription = $SiteLogoDescription; $_.Update() }
}

function Set-SP2013PoralLink{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$True,Position=1)] [string]$SiteURL,
        [Parameter(Mandatory=$True,Position=2)] [string]$PortalUrl,
        [Parameter(Mandatory=$True,Position=3)] [string]$PortalName
    )
    Try {
        $ver = $host | select version
        if ($ver.Version.Major -gt 1) {$host.Runspace.ThreadOptions = "ReuseThread"} 
        if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction Stop) -eq $null) {
            Write-Verbose "Adding SharePoint PowerShell Snapin"
            Add-PSSnapin "Microsoft.SharePoint.PowerShell"
        }
    }
    Catch [System.Exception]{
        Write-Warning "SharePoint PowerShell Snapin is not found"
    }
    
    $SPSite = Get-SPSite $SiteURL
    $SPSite.PortalName = $PortalName 
    $SPSite.PortalUrl = $PortalUrl
}

function Start-SP2013Farm{
    $Host.Runspace.ThreadOptions = "ReuseThread"
    Start-SPAssignment -Global
    $SPWebApps = Get-SPWebApplication -IncludeCentralAdministration
    foreach ($SPWebApp in $SPWebApps){
        foreach ($SPSite in $SPWebApp.Sites) { 
            foreach ($spWeb in $SPSite.AllWebs) {
                Write-Host -NoNewline "Warming up "$spWeb.url
                Try{
                    $r = Invoke-WebRequest -URI $spWeb.url -UseDefaultCredentials
                    if ($r.StatusCode -ne 200) { throw [System.IO.FileNotFoundException] $spWeb.Url + "Status Code is" + $r.StatusCode }
                    Write-Host -ForegroundColor Green " .....Done!"
                } Catch {
                    Write-Host -ForegroundColor Red " .....Error!"
                }
            }
        }
    }
    Stop-SPAssignment -Global
}

function Backup-SP2013Farm{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$True,Position=1)]
        [string]$Path,
        [Parameter(Mandatory=$True,Position=2)]
        [int]$RetentionDays
    )
    Function Backup-SPSiteCollection {
        Param(
            [Parameter(Position=0, Mandatory=$true)][string]$Location,
            [Parameter(Position=0, Mandatory=$true)][string]$URL,
            [Parameter(Position=0, Mandatory=$true)][string]$SiteTitle
        )
        Try {
            Write-Host -NoNewline "Backing up Site Collection $SiteTitle"
            Backup-SPSite $URL -Path $Location
            Write-Host -ForegroundColor Green ".....Done!"
            Write-Host -ForegroundColor Yellow "Backup file located at $Location"
        }
        Catch {

        }
    }
    Start-SPAssignment -Global
    $SPWebApps = Get-SPWebApplication
    $BackupRetentionDate = (Get-Date).AddDays(-$RetentionDays)
    $currentDate = Get-Date
    $bkDate = $currentDate.Year.ToString("0000") + $currentDate.Month.ToString("00") + $currentDate.Day.ToString("00")
    foreach ($SPWebApp in $SPWebApps){
        Write-Host -ForegroundColor Yellow "Starting Backup of Site Collections in "$SPWebApp.URL
        $spWebAppBackupFolder = $SPWebApp.URL.Replace("http://","").Replace("https://","").Replace(".","-").Replace("/","\")
        $bkLocation = $Path + '\' + $spWebAppBackupFolder
        if(!(Test-Path -Path $bkLocation )){ New-Item -ItemType directory -Path $bkLocation | Out-Null }
        Get-ChildItem -Path $bkLocation -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $BackupRetentionDate } | Remove-Item -Force
        foreach ($SPSite in $SPWebApp.Sites) { 
        if ($SPSite.ServerRelativeUrl -eq "/") { $bkFileName = $bkDate + "-root.bak" }
        else { $bkFileName = $bkDate + $SPSite.ServerRelativeUrl.Replace(".","-").Replace("/","-").Replace(" ","-") + ".bak" }
        $bkFile = $bkLocation + $bkFileName
        Backup-SPSiteCollection -Location $bkFile -URL $SPSite.URL -SiteTitle $SPSite.RootWeb.Title
        $SPSite.Dispose()        
        }
        Write-Host "Backup of Site Collections in "$SPWebApp.URL" Completed"
    }
}

function Set-SP2013MaintenanceMode {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$false)][switch]$Online
    )
    Function Create-OfflinePage() {
        Param(
            [Parameter(Position=0, Mandatory=$true)][string]$Location
        )
        $file = $Location+"\app_offline.htm"
        Out-File -FilePath "\app_offline.htm"
        $html = "<html><head><title>SharePoint is currently offline</title></head>"
        $html += "<body><h1 style='text-align:center'>SharePoint is currently undergoing maintenance</h1></body>"
        $html += "</html>"
        Add-Content -Path $file -Value $html
    }

    Start-SPAssignment -Global
    $spWebApplications = Get-SPWebApplication
    if ($Online) {
        foreach ($spWebApplication in $spWebApplications){
            try {
                Write-Host -NoNewline "Putting"$spWebApplication.url"back online"
                $IISSettings = $spWebApplication.IisSettings[[Microsoft.SharePoint.Administration.SPUrlZone]::Default]
                $file = $IISSettings.Path.FullName+"\app_offline.htm"
                Remove-Item $file
                Write-Host -ForegroundColor Green ".....Done!"
            }
            catch {
                Write-Host -ForegroundColor Red ".....Error!"
            }
        }
        Start-SP2013Farm
    }
    else {
        foreach ($spWebApplication in $spWebApplications){
            try {
                Write-Host -NoNewline "Taking"$spWebApplication.url"offline"
                $IISSettings = $spWebApplication.IisSettings[[Microsoft.SharePoint.Administration.SPUrlZone]::Default]
                Create-OfflinePage $IISSettings.Path.FullName
                Write-Host -ForegroundColor Green " .....Done!"
            }
            catch {
                Write-Host -ForegroundColor Red ".....Error!"
            }
        }
    }
    Stop-SPAssignment -Global
}

Export-ModuleMember -Function *