Das Aufsetzen einer SharePoint Multi Tenancy Farm ist auch mit SharePoint 2013 nur via PowerShell möglich. Spencer Harbar hat auf seinem Blog eine sehr ausführliche Anleitung geschrieben, wie eine Multi Tenancy Farm mit SharePoint 2013 installiert werden kann. Daher verzichte ich in diesem Artikel darauf.

Im Rahmen eines Workshops hatte ich die Aufgabe, eine Multi-Mandanten-fähige Single Server Farm aufzubauen. Das gestaltete sich in der Praxis jedoch nicht ganz so trivial. Als Basis diente mir das Multi Tenancy Script von Spencer Harbar. Für meine Bedürfnisse fehlten einerseits verschiedene Einstellungen, andererseits tauchten bei einigen Aktionen Fehler auf, die korrigiert werden mussten. Weiter mussten die Feature Packs für SharePoint 2013 extrahiert und erstellt werden.
Weil die Erstellung der User Profile Service Application eine etwas delikate Angelegenheit ist, habe ich die Provisionierung der User Profile Service Application in eine zweite Datei ausgelagert. Die Idee ist, dass aus dem eigentlichen Setup Script mit dem Farm Admin User die Provisionierung gestartet wird, was dazu führt, dass in den DBs der Farm Admin User und nicht der Setup User als Database Owner eingetragen wird. So wird die Wahrscheinlichkeit einer erfolgreichen UPA Provisionierung erhöht.

Es wird dringend empfohlen, den Code vor dem produktiven Einsatz ausführlich zu testen. Jegliche Haftung wird abgelehnt. Dieses angepasste Script habe ich online gestellt, weil es dabei helfen kann, eine Multi Tenancy Farm mit SharePoint 2013 in Betrieb zu nehmen.

Voraussetzungen

  • Die SharePoint 2013 Pre-Requisites und RTM Binaries sind auf dem Server installiert.
  • Der SharePoint Configuration Wizard wurde nicht ausgeführt.
  • Der Setup User und der Farm Admin User sind in der lokalen Administratorengruppe.
  • Der Setup User hat auf der SQL Instanz mindestens Security Admin und DB Creator Rechte.
  • Die beiden Dateien MT2013Setup.ps1 und CreateUPA.ps1 müssen sich im gleichen Verzeichnis befinden.

Ergebnis

  • Es steht ein Central Administration für den Hoster zur Verfügung.
  • Die Service Applications werden erstellt, konfiguriert und partitioniert (wo möglich).
  • Die Suche wird konfiguriert und auf den jeweiligen Mandanten eingeschränkt.
  • Der User Profile Sync wird eingerichtet und auf die OU des Mandanten eingeschränkt.
  • Der People Picker wird auf die OU des Mandanten eingeschränkt.
  • Für jeden Kunden werden eine Site Collection, MySites, ein Content Type Hub und eine Central Administration eingerichtet.
  • Es stehen zwei Feature Packs mit den Funktionen aus SharePoint Foundation 2013 und SharePoint Server 2013 zur Verfügung.

Die beiden benötigten Scripts stehen hier zum Download bereit:
MT2013Setup.ps1, CreateUPA.ps1

Die Dateiendungen müssen auf *.ps1 umbenannt werden. Die Dateien müssen sich im gleichen Verzeichnis befinden. Überall dort wo #Change here steht, müssen farmspezifische Angaben gemacht werden.

Nachfolgender Code als MT2013Setup.ps1 speichern und unter dem Setup User mit administrativen Rechten ausführen.

# Script originally created by Spencer Harbar [harbar.net]
# Sources: http://www.harbar.net/articles/sp2010mt1.aspx, http://www.harbar.net/articles/sp2013mt.aspx, http://autospinstaller.codeplex.com
# Modified by Roger Haueter [TechTask.com // SharePoint Community Blog]
# This script applies to SharePoint Server 2013

Add-PSSnapin Microsoft.SharePoint.Powershell -EA 0

# Change here
# Settings
$databaseAlias = "Set-Your-SQL-Alias"
$databaseServer = "servername\instance"
$databasePrefix = "Set-Your-Database-Prefix"
$configDatabase = "Config"
$configDatabaseName = $databasePrefix + "_" + $configDatabase
$adminContentDB = "Content_Admin"
$adminContentDBName = $databasePrefix + "_" + $adminContentDB
$passphrase = "Set-Your-Passphrase"
$farmAccountName = "DOMAIN\SP-FarmAdmin"
  
$farmAccount = Get-Credential $farmAccountName
$passphrase = (ConvertTo-SecureString $passphrase -AsPlainText -force)

# Prepare Server for installation
# Disable User Account Control (UAC)
Function DisableUAC()
{
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system" -Name EnableLUA -Value 0
    Write-Host -ForegroundColor White "User Account Control (UAC) disabled"
}
DisableUAC;

# Create SQL Alias, dynamically determine port
Function AddSQLAlias()
{
    $serverAliasConnection = "DBMSSOCN,$databaseServer"
    New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo" -Name $databaseAlias -Value $serverAliasConnection -PropertyType "String" -Force -ErrorAction SilentlyContinue
}
AddSQLAlias;

# Disable Loopback Check and Services
Function DisableLoopbackCheck()
{
    $lsaPath = "HKLM:\System\CurrentControlSet\Control\Lsa"
    $lsaPathValue = Get-ItemProperty -path $lsaPath
    If (-not ($lsaPathValue.DisableLoopbackCheck -eq "1"))
    {
        New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name "DisableLoopbackCheck" -value "1" -PropertyType dword -Force | Out-Null
    }
    Write-Host -ForegroundColor White "Loopback Check disabled"
}
DisableLoopbackCheck;

# Trust Source Path
# Source: autospinstaller.codeplex.com
Function AddSourcePathToLocalIntranetZone()
{
    # Ensure that if we're running from a UNC path, the host portion is added to the Local Intranet zone so we don't get the "Open File - Security Warning"
    If ($env:dp0 -like "\\*")
    {
        WriteLine
        $safeHost = ($env:dp0 -split "\\")[2]
        Write-Host -ForegroundColor White " - Adding `"$safeHost`" to local Intranet security zone..."
        New-Item -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains" -Name $safeHost -ItemType Leaf -Force | Out-Null
        New-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\$safeHost" -Name "file" -value "1" -PropertyType dword -Force | Out-Null
        WriteLine
    }
}
AddSourcePathToLocalIntranetZone;

# Remove IE Enhanced Security
# Source: autospinstaller.codeplex.com
Function RemoveIEEnhancedSecurity()
{
    Write-Host -ForegroundColor White "Disabling IE Enhanced Security"
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" -Name isinstalled -Value 0
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" -Name isinstalled -Value 0
    Rundll32 iesetup.dll, IEHardenLMSettings,1,True
    Rundll32 iesetup.dll, IEHardenUser,1,True
    Rundll32 iesetup.dll, IEHardenAdmin,1,True
    If (Test-Path "HKCU:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}") 
    {
        Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
    }
    If (Test-Path "HKCU:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}")
    {
        Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}"
    }
        
    #This doesn't always exist
    Remove-ItemProperty "HKCU:\SOFTWARE\Microsoft\Internet Explorer\Main" "First Home Page" -ErrorAction SilentlyContinue
}
RemoveIEEnhancedSecurity;

# Disable Unused Services or set status to Manual
# Source: autospinstaller.codeplex.com
Function DisableServices()
{        
    Write-Host -ForegroundColor White " - Setting services Spooler, AudioSrv and TabletInputService to Manual..."

    $servicesToSetManual = "Spooler","AudioSrv","TabletInputService"
    ForEach ($svcName in $servicesToSetManual)
    {
        $svc = get-wmiobject win32_service | where-object {$_.Name -eq $svcName} 
        $svcStartMode = $svc.StartMode
        $svcState = $svc.State
        If (($svcState -eq "Running") -and ($svcStartMode -eq "Auto"))
        {
            Stop-Service -Name $svcName
            Set-Service -name $svcName -StartupType Manual
            Write-Host -ForegroundColor White " - Service $svcName is now set to Manual start"
        }
        Else 
        {
            Write-Host -ForegroundColor White " - $svcName is already stopped and set Manual, no action required."
        }
    }
        
    Write-Host -ForegroundColor White " - Setting unused services WerSvc to Disabled..."
    $servicesToDisable = "WerSvc"
    ForEach ($svcName in $servicesToDisable) 
    {
        $svc = get-wmiobject win32_service | where-object {$_.Name -eq $svcName} 
        $svcStartMode = $svc.StartMode
        $svcState = $svc.State
        If (($svcState -eq "Running") -and (($svcStartMode -eq "Auto") -or ($svcStartMode -eq "Manual")))
        {
            Stop-Service -Name $svcName
            Set-Service -name $svcName -StartupType Disabled
            Write-Host -ForegroundColor White " - Service $svcName is now stopped and disabled."
        }
        Else 
        {
            Write-Host -ForegroundColor White " - $svcName is already stopped and disabled, no action required."
        }
    }
    Write-Host -ForegroundColor White " - Finished disabling services."    
}
DisableServices;

# SharePoint Configuration
# will error, but fix the regkey...
# we do this to prevent an error if the machine state registry key is not correctly set,
# which will prevent the next command from completing.
psconfig.exe -cmd upgrade
 
Write-Host "Creating Configuration Database and Central Admin Content Database..."
New-SPConfigurationDatabase -DatabaseServer $databaseServer -DatabaseName $configDatabaseName `
    -AdministrationContentDatabaseName $adminContentDBName `
    -Passphrase $passphrase -FarmCredentials $farmAccount
    
$spfarm = Get-SPFarm -ErrorAction SilentlyContinue -ErrorVariable err        
if ($spfarm -eq $null -or $err) {
   throw "Unable to verify farm creation."
}

Write-Host "ACLing SharePoint Resources..."
Initialize-SPResourceSecurity
Write-Host "Installing Services ..."
Install-SPService   
Write-Host "Installing Features..."
Install-SPFeature -AllExistingFeatures

Write-Host "Creating Central Administration..."              
New-SPCentralAdministration -Port 11111 -WindowsAuthProvider NTLM

Write-Host "Installing Help..."
Install-SPHelpCollection -All        
Write-Host "Installing Application Content..."
Install-SPApplicationContent

Write-Host "Farm Creation Done!"

# Change here
# App Pools
$saAppPoolName = "SharePoint Web Services Default"
$saAppPoolUserName = "DOMAIN\SP-ServicesAccount"
$waAppPoolName = "SharePoint Content"
$waAppPoolUserName = "DOMAIN\SP-WebAppAccount"

# Change here
# Service Application and DB names
$stateName = "State Service Application"
$stateDB = "StateService"
$stateDBName = $databasePrefix + "_" + $stateDB
$usageName = "Usage and Health Data Collection Service Application"
$usageDB = "Usage"
$usageDBName = $databasePrefix + "_" + $usageDB
$subsInstanceName = "SPSubscriptionSettingsServiceInstance"
$subsName = "Subscription Settings"
$subsDB = "SubscriptionSettings"
$subsDBName = $databasePrefix + "_" + $subsDB

# Change here
# Web App details
$WebAppSSL = "False"
$hostingMainURL = "http://multitenant.domain.com"
$webAppName = "SharePoint Hosting"
$contentDB = "Content_Hosting"
$contentDBName = $databasePrefix + "_" + $contentDB

# Change here
# Root Site Collection details
$ownerEmail = "sharepoint@domain.com"
$ownerAlias = "DOMAIN\SP-SetupAccount"

# Create Managed Accounts and Application Pools
# Service Apps
Write-Host "Please supply the password for the $saAppPoolUserName Account..."
$appPoolCred = Get-Credential $saAppPoolUserName
$saAppPoolAccount = New-SPManagedAccount -Credential $appPoolCred
$saAppPool = New-SPServiceApplicationPool -Name $saAppPoolName -Account $saAppPoolAccount

# Web app
Write-Host "Please supply the password for the $waAppPoolUserName Account..."
$appPoolCred = Get-Credential $waAppPoolUserName
$waAppPoolAccount = New-SPManagedAccount -Credential $appPoolCred

# Create State Service Application and Proxy
Write-Host "Creating $stateName Application and Proxy..."
$NewStateDB = New-SPStateServiceDatabase -Name $stateDBName
$state = New-SPStateServiceApplication -Name $stateName -Database $NewStateDB
New-SPStateServiceApplicationProxy -Name "$stateName Proxy" -ServiceApplication $state -DefaultProxyGroup

# Setup the Usage Service App
Write-Host "Creating $usageName Application and Proxy..."
$serviceInstance = Get-SPUsageService
New-SPUsageApplication -Name $usageName -DatabaseName $usageDBName -UsageService $serviceInstance

# Setup the Subscription Settings Service Application & Proxy and start the service instance
Write-Host "Creating $subsName Application and Proxy..."
$subs = New-SPSubscriptionSettingsServiceApplication –ApplicationPool $saAppPool –Name $subsName –DatabaseName $subsDBName
$proxy = New-SPSubscriptionSettingsServiceApplicationProxy –ServiceApplication $subs 
Write-Host "Starting subsInstanceName..."
Get-SPServiceInstance | where{$_.GetType().Name -eq $subsInstanceName} | Start-SPServiceInstance

# Create a new Web App using Claims (Windows (NTLM))
$authProvider = New-SPAuthenticationProvider
if ($WebAppSSL -eq "true")
{
    $webApp = New-SPWebApplication -ApplicationPool $waAppPoolName -ApplicationPoolAccount $waAppPoolAccount -Name $webAppName -URL $hostingMainURL -Port 443 -SecureSocketsLayer -AuthenticationProvider $authProvider -DatabaseName $contentDBName
}
else
{
    $webApp = New-SPWebApplication -ApplicationPool $waAppPoolName -ApplicationPoolAccount $waAppPoolAccount -Name $webAppName -URL $hostingMainURL -Port 80 -AuthenticationProvider $authProvider -DatabaseName $contentDBName
}

# Set sensible content db limits
Set-SPContentDatabase $contentDBName  -MaxSiteCount 50 -WarningSiteCount 30

# we could create more cdbs for the webapp here
<# Create Site Collection at root
        This wont ever be accessed by users
        It is required in order to enable self service site creation, and good practice to have a SC at the root.
        We do NOT need to create a site from a template, we are creating an Empty site
#>
New-SPSite -Url $hostingMainURL -owneralias $ownerAlias -ownerEmail $ownerEmail

# Enable Self Service Site Creation -there is no powershell cmdlet for this yet
stsadm -o enablessc -url $hostingMainURL

# Enable Self Service Site Creation 
$webApp.SelfServiceSiteCreationEnabled = $true
$webApp.RequireContactForSelfServiceSiteCreation = $false
$webApp.Update()

# Create the required Managed Paths
Remove-SPManagedPath "sites" -WebApplication $webApp -Confirm:$false
New-SPManagedPath "admin" -HostHeader -Explicit #tenant admin
New-SPManagedPath "cthub" -HostHeader -Explicit #content type gallery
New-SPManagedPath "mysites" -HostHeader -Explicit #mysite host
New-SPManagedPath "mysites/personal" -HostHeader #mysites
Write-Host "Initial SAs and Hosting WebApp Done!"

# CERTIFICATES
# Source: AutoSPInstaller.codeplex.com
# Disable Certificate Revocation List checks
Function DisableCRLCheck()
    {
        Write-Host -ForegroundColor White " - Disabling Certificate Revocation List (CRL) check..."
        ForEach($bitsize in ("","64")) 
        {           
            $xml = [xml](Get-Content $env:windir\Microsoft.NET\Framework$bitsize\v2.0.50727\CONFIG\Machine.config)
            If (!$xml.DocumentElement.SelectSingleNode("runtime")) { 
                $runtime = $xml.CreateElement("runtime")
                $xml.DocumentElement.AppendChild($runtime) | Out-Null
            }
            If (!$xml.DocumentElement.SelectSingleNode("runtime/generatePublisherEvidence")) {
                $gpe = $xml.CreateElement("generatePublisherEvidence")
                $xml.DocumentElement.SelectSingleNode("runtime").AppendChild($gpe)  | Out-Null
            }
            $xml.DocumentElement.SelectSingleNode("runtime/generatePublisherEvidence").SetAttribute("enabled","false")  | Out-Null
            $xml.Save("$env:windir\Microsoft.NET\Framework$bitsize\v2.0.50727\CONFIG\Machine.config")
        }
}

DisableCRLCheck;

Function ImportRootCert()
{
    #Export SharePoint Root Certificate and Import it into Trusted Root Certification Authorities
    $RootCertPath = "C:\SPRoot.cer"
    $RootCert = (Get-SPCertificateAuthority).RootCertificate
    $RootCert.Export("Cer") | Set-Content $RootCertPath –Encoding Byte

    # Source: http://jorgequestforknowledge.wordpress.com/2012/02/10/managing-certificates-on-a-windows-computer-with-powershell/
    $CertToImport = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $RootCertPath
    $CertStoreScope = "LocalMachine"
    $CertStoreName = "Root"
    $CertStore = New-Object System.Security.Cryptography.X509Certificates.X509Store $CertStoreName, $CertStoreScope
    $CertStore.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
    $CertStore.Add($CertToImport)
    $CertStore.Close()
    Write-Host -ForegroundColor White "SharePoint Root Certificate imported"
}

ImportRootCert;

# SERVICE APPLICATIONS

# Change here
# app pool
$saAppPoolName = "SharePoint Web Services Default"
$appPoolUserName = "DOMAIN\SP-ServicesAccount"

# Gets app pool or quits
Write-Host "Getting Application Pool..."
$saAppPool = Get-SPServiceApplicationPool -Identity $saAppPoolName -EA 0
if($saAppPool -eq $null)
{
    Write-Host "Cannot find the Application Pool $appPoolName, please ensure it exists before continuing."
    Exit -1	
}

# App Management Specifics
$appsInstanceName = "AppManagementServiceInstance"
$appsName = "App Management Service"
$appsDB = "AppManagement"
$appsDBName = $databasePrefix + "_" + $appsDB

# Grab the Appplication Pool for Service Application Endpoint
$saAppPool = Get-SPServiceApplicationPool $saAppPoolName

# Setup the App Management Service Application & Proxy and start the service instance
Write-Host "Creating $appsName Application and Proxy..."
Get-SPServiceInstance | where{$_.GetType().Name -eq $appsInstanceName} | Start-SPServiceInstance
$appAppSvc = New-SPAppManagementServiceApplication -ApplicationPool $saAppPool -Name $appsName -DatabaseName $appsDBName
$proxyAppSvc = New-SPAppManagementServiceApplicationProxy -ServiceApplication $appAppSvc -Name "$appsName Proxy"
Write-Host "App Management Done!"

# App Pools
$saAppPoolName = "SharePoint Web Services Default"

# MMS specifics
$tsInstanceName = "Machine Translation Service"
$tsName = "Translation Service Application"
$tsDB = "Translation"
$tsDBName = $databasePrefix + "_" + $tsDB

# Grab the Appplication Pool for Service Application Endpoint
$saAppPool = Get-SPServiceApplicationPool $saAppPoolName


# Sets up Machine Translation service instance & service app and proxy 
Write-Host "Starting the $tsInstanceName..."
Get-SPServiceInstance | ? {$_.GetType().Name -eq $tsInstanceName} | Start-SPServiceInstance

Write-Host "Creating $tsName Application & proxy..."
$ts = New-SPTranslationServiceApplication -PartitionMode -Name $tsName -ApplicationPool $saAppPoolName -DatabaseName $tsDBName
Get-SPServiceApplicationProxy | ? {$_.TypeName -eq "Machine Translation Service Proxy"} | Remove-SPServiceApplicationProxy -Confirm:$false
$proxy = New-SPTranslationServiceApplicationProxy -PartitionMode -Name "$tsName Proxy" -ServiceApplication $ts -DefaultProxyGroup
Write-Host "MTS Done!"

# MMS specifics
$mmsInstanceName = "MetadataWebServiceInstance"
$mmsName = "Managed Metadata Service Application"
$mmsDB = "Metadata"
$mmsDBName = $databasePrefix + "_" + $mmsDB

# Sets up Managed Metadata service instance & service app and proxy 
Write-Host "Creating $mmsName Application & proxy..."
$mms = New-SPMetadataServiceApplication -PartitionMode -Name $mmsName -ApplicationPool $saAppPoolName -DatabaseName $mmsDBName
$proxy = New-SPMetadataServiceApplicationProxy -PartitionMode -Name "$mmsName Proxy" -ServiceApplication $mms -DefaultProxyGroup
Write-Host "Starting the $mmsInstanceName..."
Get-SPServiceInstance | where{$_.GetType().Name -eq $mmsInstanceName} | Start-SPServiceInstance
Write-Host "MMS Done!"

# BDC specifics
$bdcInstanceName = "Business Data Connectivity Service"
$bdcName = "Business Data Connectivity Service Application"
$bdcDB = "BDC"
$bdcDBName = $databasePrefix + "_" + $bdcDB

# Sets up Business Data Connectivity Service Application and Proxy and Service Instance
Write-Host "Creating $bdcInstanceName Application and Proxy..."
$bdc = New-SPBusinessDataCatalogServiceApplication -PartitionMode -Name $bdcName -ApplicationPool $saAppPoolName -DatabaseName $bdcDBName
Write-Host "Starting the $bdcInstanceName Instance..."
Get-SPServiceInstance | where-object {$_.TypeName -eq $bdcInstanceName} | Start-SPServiceInstance
Write-Host "BDC Done!"

# SSS Specifics
$sssInstanceName = "Secure Store Service"
$sssName = "Secure Store Service Application"
$sssDB = "SecureStore"
$sssDBName = $databasePrefix + "_" + $sssDB

# Sets up Secure Store Service Application & Proxy and Service Instance
Write-Host "Creating $sssName Application & Proxy..."
$sss = New-SPSecureStoreServiceApplication -PartitionMode -Name $sssName -ApplicationPool $saAppPoolName -DatabaseName $sssDBName -auditingEnabled:$true -auditlogmaxsize 30 -Sharing:$false
$proxy = New-SPSecureStoreServiceApplicationProxy -Name "$sssName Proxy" -ServiceApplication $sss -DefaultProxyGroup
Write-Host "Starting the $sssInstanceName Instance..."
$sssInstance = Get-SPServiceInstance | where-object{$_.TypeName -eq $sssInstanceName} | Start-SPServiceInstance
Write-Host "SSS Done!"

# WAS specifics
$wasInstanceName = "Word Automation Services"
$wasName = "Word Automation Service Application"
$wasDB = "WordAutomation"
$wasDBName = $databasePrefix + "_" + $wasDB

# Sets up Word Automation Service Application and Proxy and Service Instance
Write-Host "Creating $wasName Application & Proxy..."
$was = New-SPWordConversionServiceApplication -PartitionMode -Name $wasName -ApplicationPool $saAppPool -DatabaseName $wasDBName -Default
Write-Host "Starting the $wasInstanceName Instance..."
Get-SPServiceInstance | where-object {$_.TypeName -eq $wasInstanceName} | Start-SPServiceInstance
Write-Host "WAS Done!"

# Wait 15 seconds...
Start-Sleep -s 15

# App Pool
$saAppPoolName = "SharePoint Web Services Default"

# Change here
# Search Specifics, we are single server farm
$searchServerName = "localhost" 
$serviceAppName = "Search Service Application"
$searchDB = "Search"
$searchDBName = $databasePrefix + "_" + $searchDB
$defaultContentAccess = "DOMAIN\SP-ContentAccessAccount"
$defaultContentAccessPW = "password"

# Grab the Appplication Pool for Service Application Endpoint
$saAppPool = Get-SPServiceApplicationPool $saAppPoolName

# Start Search Service Instances
Write-Host "Starting Search Service Instances..."
Start-SPEnterpriseSearchServiceInstance $searchServerName
Start-SPEnterpriseSearchQueryAndSiteSettingsServiceInstance $searchServerName

# Create the Search Service Application and Proxy
Write-Host "Creating Search Service Application and Proxy..."
$searchServiceApp = New-SPEnterpriseSearchServiceApplication -Partitioned -Name $serviceAppName -ApplicationPool $saAppPoolName -DatabaseName $searchDBName
$searchProxy = New-SPEnterpriseSearchServiceApplicationProxy -Partitioned -Name "$serviceAppName Proxy" -SearchApplication $searchServiceApp

# Clone the default Topology (which is empty) and create a new one and then activate it
Write-Host "Configuring Search Component Topology..."
$clone = $searchServiceApp.ActiveTopology.Clone()
$searchServiceInstance = Get-SPEnterpriseSearchServiceInstance
New-SPEnterpriseSearchAdminComponent –SearchTopology $clone -SearchServiceInstance $searchServiceInstance
New-SPEnterpriseSearchContentProcessingComponent –SearchTopology $clone -SearchServiceInstance $searchServiceInstance
New-SPEnterpriseSearchAnalyticsProcessingComponent –SearchTopology $clone -SearchServiceInstance $searchServiceInstance 
New-SPEnterpriseSearchCrawlComponent –SearchTopology $clone -SearchServiceInstance $searchServiceInstance 
New-SPEnterpriseSearchIndexComponent –SearchTopology $clone -SearchServiceInstance $searchServiceInstance
New-SPEnterpriseSearchQueryProcessingComponent –SearchTopology $clone -SearchServiceInstance $searchServiceInstance
$clone.Activate()

# Change default content access account
$defaultContentAccessCred = New-Object System.Management.Automation.PSCredential $defaultContentAccess,(ConvertTo-SecureString $defaultContentAccessPW -AsPlainText -Force) 
Set-SPEnterpriseSearchServiceApplication -Identity $serviceAppName -DefaultContentAccessAccountName $defaultContentAccessCred.UserName -DefaultContentAccessAccountPassword $defaultContentAccessCred.Password
Write-Host "Search Done!"

# UPA specifics
$upaInstanceName = "User Profile Service"
$upsInstanceName = "User Profile Synchronization Service"
$upaName = "User Profile Service Application"  
$ScriptFile = ".\CreateUPA.ps1"

# Change here
# Configure FIM Services
$FIMservice = gwmi win32_service -filter "name='FIMService'"
$FIMservice.change($null,$null,$null,$null,$null,$null,$farmAccountName,"password")

# Change here
$FIMSservice = gwmi win32_service -filter "name='FIMSynchronizationService'"
$FIMSservice.change($null,$null,$null,$null,$null,$null,$farmAccountName,"password")

Set-Service -Name FIMService -StartupType Automatic
Set-Service -Name FIMSynchronizationService -StartupType Automatic

# Get the Farm Account Creds
$farmAcct = (Get-SPFarm).DefaultServiceAccount
$cred = Get-Credential $farmAcct.Name

# Create a new process with UAC elevation
Start-Process $PSHOME\powershell.exe -Credential $cred -ArgumentList "-Command Start-Process $PSHOME\powershell.exe -ArgumentList `"'$scriptfile'`" -Verb Runas" -Wait

# Wait 60 seconds (quick fix for Set-Your-Database-Prefix because the "wait" command doesn't work as expected)
Start-Sleep -s 60

# Change here
# 2nd part
# App Pools
$saAppPoolName = "SharePoint Web Services Default"

# Change here
# we need these to start the UPS Service Instance
$farmAccount = "DOMAIN\SP-FarmAdmin"
$farmPassword = "password"

# Grab the Appplication Pool for Service Application Endpoint
$saAppPool = Get-SPServiceApplicationPool $saAppPoolName

# ALL NEW
# Start User Profile Service in SharePoint Services
Get-SPServiceInstance | Where-Object { $_.typename -eq "User Profile Service" } | Start-SPServiceInstance

# Change here
$portalAppPoolAcct = "DOMAIN\SP-WebAppAccount"
$mySiteAppPoolAcct = "DOMAIN\SP-MySiteWebAppAccount"
$contentAccessAcct = "DOMAIN\SP-ContentAccessAccount"
$userProfileServiceName = "User Profile Service Application"
$profileServiceApp = Get-SPServiceApplication |?{$_.DisplayName -eq $userProfileServiceName}

Write-Host -ForegroundColor White " - Granting rights to $userProfileServiceName..."
# Create a variable that contains the guid for the User Profile service for which you want to delegate permissions
$serviceAppIDToSecure = Get-SPServiceApplication $($profileServiceApp.Id)

# Create a variable that contains the list of administrators for the service application 
$profileServiceAppSecurity = Get-SPServiceApplicationSecurity $serviceAppIDToSecure -Admin
# Create a variable that contains the permissions for the service application
$profileServiceAppPermissions = Get-SPServiceApplicationSecurity $serviceAppIDToSecure

# Create variables that contains the claims principals for current (Setup) user, MySite App Pool, Portal App Pool and Content Access accounts
$currentUserAcctPrincipal = New-SPClaimsPrincipal -Identity $env:USERDOMAIN\$env:USERNAME -IdentityType WindowsSamAccountName
If ($mySiteAppPoolAcct) {$mySiteAppPoolAcctPrincipal = New-SPClaimsPrincipal -Identity $mySiteAppPoolAcct -IdentityType WindowsSamAccountName}
If ($portalAppPoolAcct) {$portalAppPoolAcctPrincipal = New-SPClaimsPrincipal -Identity $portalAppPoolAcct -IdentityType WindowsSamAccountName}
If ($contentAccessAcct) {$contentAccessAcctPrincipal = New-SPClaimsPrincipal -Identity $contentAccessAcct -IdentityType WindowsSamAccountName}

# Give 'Full Control' permissions to the current (Setup) user, MySite App Pool and Portal App Pool account claims principals
Grant-SPObjectSecurity $profileServiceAppSecurity -Principal $currentUserAcctPrincipal -Rights "Full Control"
Grant-SPObjectSecurity $profileServiceAppPermissions -Principal $currentUserAcctPrincipal -Rights "Full Control"
If ($mySiteAppPoolAcct) {Grant-SPObjectSecurity $profileServiceAppSecurity -Principal $mySiteAppPoolAcctPrincipal -Rights "Full Control"}
If ($portalAppPoolAcct) {Grant-SPObjectSecurity $profileServiceAppSecurity -Principal $portalAppPoolAcctPrincipal -Rights "Full Control"}
# Give 'Retrieve People Data for Search Crawlers' permissions to the Content Access claims principal
If ($contentAccessAcct) {Grant-SPObjectSecurity $profileServiceAppSecurity -Principal $contentAccessAcctPrincipal -Rights "Retrieve People Data for Search Crawlers"}

# Apply the changes to the User Profile service application
Set-SPServiceApplicationSecurity $serviceAppIDToSecure -objectSecurity $profileServiceAppSecurity -Admin
Set-SPServiceApplicationSecurity $serviceAppIDToSecure -objectSecurity $profileServiceAppPermissions

Write-Host "Restarting SPTimerV4..."
restart-service SPTimerV4

Write-Host "Starting the $upsInstanceName Instance..."
$upa = Get-SPServiceApplication | where-object {$_.Name -eq $upaName}
Get-SPServiceInstance | where-object {$_.TypeName -eq $upsInstanceName} | % {
    $_.Status = [Microsoft.SharePoint.Administration.SPObjectStatus]::Provisioning
    $_.IsProvisioned = $false
    $_.UserProfileApplicationGuid = $upa.Id
    $_.Update()
    $upa.SetSynchronizationMachine($_.Server.Address, $_.Id, $farmAccount, $farmPassword) # this causes update conflicts
    Start-SPServiceInstance $_
}

Write-Host "Waiting on $upsInstanceName to provision..."
Write-Host "Baseline time is 600 seconds"
[int]$time = 0
$ups = Get-SPServiceInstance | where-object {$_.TypeName -eq $upsInstanceName}
while(-not ($ups.Status -eq "Online")){
   	sleep 10;
    Write-Host "Still waiting... ($time seconds elapsed)"
    $ups = Get-SPServiceInstance | where-object {$_.TypeName -eq $upsInstanceName}
    $time = $time + 10
  }
  $time = $time - 10
Write-Host "$upsInstanceName provisioned, it took $time seconds, resetting IIS..."
iisreset
Write-Host "UPS Done!"
Write-Host "Don't forget to remove the Farm Account from local admins!"

# FEATURE PACKS
#validate pre-reqs 
$app = Get-SPServiceApplication |? {$_.TypeName -eq "Microsoft SharePoint Foundation Subscription Settings Service Application"} 
if($app -eq $null){ 
 "Settings Service Application must already exist" 
 exit; 
} 

#Create an alias for Add-SPSiteSubscriptionFeaturePackMember
Set-Alias AddFeature Add-SPSiteSubscriptionFeaturePackMember

#SharePoint Foundation Feature Pack
$ffp = New-SPSiteSubscriptionFeaturePack

AddFeature -identity $ffp -FeatureDefinition AccessRequests -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AdminLinks -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AdminReportCore -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AdminReportCorePushdown -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AnnouncementsList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AppLockdown -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AppRegistration -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AppRequestsList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AutohostedAppLicensing -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition AutohostedAppLicensingStapling -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition BasicWebParts -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition BcsEvents -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition BlogContent -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition BlogHomePage -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition BlogSiteTemplate -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition CallTrackList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition CirculationList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ContactsList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ContentLightup -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ContentTypeSettings -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition CorporateCatalog -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition CorporateCuratedGallerySettings -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition CTypes -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition CustomList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition DataSourceLibrary -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition Developer -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition DiscussionsList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition DocumentLibrary -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition DownloadFromOfficeDotCom -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition EmailTemplates -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition EnableAppSideLoading -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition EventsList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ExcelServerEdit -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ExternalList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ExternalSubscription -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition FacilityList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition FCGroupsList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition Fields -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition GanttTasksList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition GBWProvision -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition GBWWebParts -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition GettingStarted -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition GettingStartedWithAppCatalogSite -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition GridList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition GroupWork -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition HelpLibrary -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition HierarchyTasksList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition HolidaysList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition IfeDependentApps -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition IMEDicList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition IssuesList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition IssueTrackingWorkflow -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition LinksList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition MaintenanceLogs -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition MBrowserRedirect -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition MBrowserRedirectStapling -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition MDSFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition MobilityRedirect -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition MonitoredApps -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition MpsWebParts -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition NoCodeWorkflowLibrary -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ObaProfilePages -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ObaProfilePagesTenantStapling -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ObaSimpleSolution -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ObaStaple -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OfficeExtensionCatalog -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OfficeWebApps -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OnenoteServerViewing -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OpenInClient -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSearchBasicFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSearchCentralAdminLinks -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSearchEnhancedFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSearchHealthReportsPushdown -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSearchPortalAdminLinks -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OsrvLinks -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OssNavigation -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSSSearchEndUserHelpFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSSSearchSearchCenterUrlFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition OSSSearchSearchCenterUrlSiteFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition PhonePNSubscriber -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition PictureLibrary -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition PremiumSearchVerticals -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition PromotedLinksList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ReportAndDataSearch -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ScheduleList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchAdminWebParts -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchCenterFiles -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchCenterLiteFiles -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchCenterLiteUpgrade -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchCenterUpgrade -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchConfigContentType -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchConfigFields -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchConfigList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchConfigListTemplate -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchConfigTenantStapler -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchMaster -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchServerWizardFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchTaxonomyRefinementWebParts -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchTaxonomyRefinementWebPartsHtml -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchWebParts -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SearchWebPartsStapler -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SharedServices -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ShareWithEveryone -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition ShareWithEveryoneStapling -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SiteAssets -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SiteHelp -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SiteNotebook -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SiteSettings -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SiteStatusBar -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SiteUpgrade -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SPAppAnalyticsUploaderJob -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SPSearchFeature -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SSSvcAdmin -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition SurveysList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TasksList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TeamCollab -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TenantAdminBDC -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TenantAdminBDCStapling -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TenantAdminLinks -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TenantAdminSecureStore -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TenantAdminSecureStoreStapling -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TenantSearchAdmin -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TenantSearchAdminStapling -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition TimeCardList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition WebPageLibrary -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition WhatsNewList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition WhereaboutsList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition WikiPageHomePage -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition WikiWelcome -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition WordServerViewing -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition WorkflowHistoryList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition workflowProcessList -ea SilentlyContinue
AddFeature -identity $ffp -FeatureDefinition XmlFormLibrary -ea SilentlyContinue

#SharePoint Server Feature Pack 
$sfp = New-SPSiteSubscriptionFeaturePack 
AddFeature -identity $sfp -FeatureDefinition AbuseReportsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccessRequests -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvApplication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvMSysAso -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvRestrictedList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvShell -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvSolutionGallery -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvSolutionGalleryStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvUserTemplate -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSrvUSysAppLog -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSvcAddAccessApp -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSvcAddAccessAppStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSvcApplication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AccSvcShell -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AddDashboard -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AdminLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AdminReportCore -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AdminReportCorePushdown -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AnnouncementsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AppLockdown -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AppRegistration -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AppRequestsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AssetLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AutohostedAppLicensing -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition AutohostedAppLicensingStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BaseSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BaseSiteStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BaseWeb -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BaseWebApplication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BasicWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BcsEvents -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BDR -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterDashboardsLib -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterDataConnections -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterDataconnectionsLib -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterDataConnectionsListInstance -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterFeatureStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterPPSContentPages -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterPPSNavigationLink -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterPPSWorkspaceListInstance -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BICenterSampleData -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BizAppsCTypes -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BizAppsFields -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BizAppsListTemplates -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BizAppsSiteTemplates -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BlogContent -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BlogHomePage -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BlogSiteTemplate -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BulkWorkflow -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition BulkWorkflowTimerJob -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CallTrackList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CategoriesList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CirculationList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CmisProducer -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CollaborationMailbox -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CollaborationMailboxFarm -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CommunityPortal -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CommunitySite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContactsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentDeploymentSource -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentFollowing -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentFollowingList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentFollowingStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentLightup -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentTypeHub -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentTypePublish -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentTypeSettings -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ContentTypeSyndication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CorporateCatalog -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CorporateCuratedGallerySettings -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CrossFarmSitePermissions -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CrossSiteCollectionPublishing -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CTypes -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition CustomList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DataConnectionLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DataConnectionLibraryStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DataSourceLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DeploymentLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Developer -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DiscussionsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DMContentTypeSettings -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DocId -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition docmarketplace -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition docmarketplacesafecontrols -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition docmarketplacesampledata -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DocumentLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DocumentManagement -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DocumentRouting -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DocumentRoutingResources -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DocumentSet -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition DownloadFromOfficeDotCom -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EDiscoveryCaseResources -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EDiscoveryConsole -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduAdminLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduAdminPages -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduCommunity -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduCommunityCustomSiteActions -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduCommunitySite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduCourseCommunity -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduCourseCommunitySite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduDashboard -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduFarmWebApplication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduInstitutionAdmin -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduInstitutionSiteCollection -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduMembershipUI -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduMySiteCommunity -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduMySiteHost -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduSearchDisplayTemplates -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduShared -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduStudyGroupCommunity -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduUserCache -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EduWebApplication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EMailRouting -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EmailTemplates -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EnableAppSideLoading -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EnhancedHtmlEditing -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EnhancedTheming -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EnterpriseWiki -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EnterpriseWikiLayouts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition EventsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExcelServer -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExcelServerEdit -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExcelServerSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExcelServerWebPart -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExcelServerWebPartStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExchangeSync -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExchangeSyncSiteSubscription -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExpirationWorkflow -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExternalList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ExternalSubscription -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition FacilityList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition FastCentralAdminHelpCollection -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition FastEndUserHelpCollection -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition FCGroupsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition FeaturePushdown -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Fields -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition FollowingContent -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GanttTasksList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GBWProvision -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GBWWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GettingStarted -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GettingStartedWithAppCatalogSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GlobalWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GridList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition GroupWork -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition HelpLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition HierarchyTasksList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Hold -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition HolidaysList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition HtmlDesign -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IfeDependentApps -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IMEDicList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition InPlaceRecords -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ipfsAdminLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IPFSAdminWeb -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IPFSSiteFeatures -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IPFSTenantFormsConfig -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IPFSTenantWebProxyConfig -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IPFSWebFeatures -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IssuesList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition IssueTrackingWorkflow -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ItemFormRecommendations -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition LegacyDocumentLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition LegacyWorkflows -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition LinksList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ListTargeting -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition LocalSiteDirectoryControl -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition LocalSiteDirectoryMetaData -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition LocalSiteDirectorySettingsLink -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition LocationBasedPolicy -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MaintenanceLogs -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ManageUserProfileServiceApplication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MasterSiteDirectoryControl -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MBrowserRedirect -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MBrowserRedirectStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MDSFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MediaWebPart -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MembershipList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MetaDataNav -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MobileEwaFarm -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MobileExcelWebAccess -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MobilityRedirect -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MonitoredApps -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MonitoredAppsUI -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MossChart -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MpsWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MruDocsWebPart -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteBlog -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteCleanup -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteDocumentLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteHost -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteHostPictureLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteInstantiationQueues -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteLayouts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteMaster -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteMicroBlog -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteMicroBlogCtrl -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteNavigation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySitePersonalSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteQuickLaunch -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteSocialDeployment -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteStorageDeployment -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteUnifiedNavigation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MySiteUnifiedQuickLaunch -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MyTasksDashboard -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MyTasksDashboardCustomRedirect -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition MyTasksDashboardStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Navigation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition NavigationProperties -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition NoCodeWorkflowLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ObaProfilePages -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ObaProfilePagesTenantStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ObaSimpleSolution -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ObaStaple -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OfficeExtensionCatalog -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OfficeWebApps -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OffWFCommon -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OnenoteServerViewing -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OpenInClient -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OrganizationsClaimHierarchyProvider -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSearchBasicFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSearchCentralAdminLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSearchEnhancedFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSearchHealthReportsPushdown -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSearchPortalAdminLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OsrvLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OssNavigation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSSSearchEndUserHelpFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSSSearchSearchCenterUrlFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition OSSSearchSearchCenterUrlSiteFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PageConverters -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PersonalizationSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PhonePNSubscriber -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PictureLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PortalLayouts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSDatasourceLib -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSMonDatasourceCtype -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSRibbon -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSSiteCollectionMaster -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSSiteMaster -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSSiteStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSWorkspaceCtype -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PPSWorkspaceList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PremiumSearchVerticals -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PremiumSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PremiumSiteStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PremiumWeb -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PremiumWebApplication -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Preservation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ProductCatalogListTemplate -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ProductCatalogResources -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ProfileSynch -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ProjectBasedPolicy -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ProjectDiscovery -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ProjectFunctionality -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PromotedLinksList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Publishing -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingLayouts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingMobile -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingPrerequisites -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingResources -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingTimerJobs -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition PublishingWeb -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition QueryBasedPreservation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Ratings -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RecordResources -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RecordsCenter -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RecordsManagement -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RecordsManagementTenantAdmin -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RecordsManagementTenantAdminStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RedirectPageContentTypeBinding -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RelatedLinksScopeSettingsLink -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReportAndDataSearch -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReportCenterSampleData -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Reporting -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReportListTemplate -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReportsAndDataCTypes -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReportsAndDataFields -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReportsAndDataListTemplates -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReviewPublishingSPD -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReviewPublishingSPD1033 -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReviewWorkflows -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReviewWorkflowsSPD -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ReviewWorkflowsSPD1033 -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RollupPageLayouts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition RollupPages -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ScheduleList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchAdminWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchAndProcess -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchCenterFiles -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchCenterLiteFiles -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchCenterLiteUpgrade -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchCenterUpgrade -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchConfigContentType -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchConfigFields -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchConfigList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchConfigListTemplate -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchConfigTenantStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchDrivenContent -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchEngineOptimization -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchExtensions -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchMaster -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchServerWizardFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchTaxonomyRefinementWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchTaxonomyRefinementWebPartsHtml -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchTemplatesandResources -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchWebParts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SearchWebPartsStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SharedServices -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ShareWithEveryone -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ShareWithEveryoneStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SignaturesWorkflow -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SignaturesWorkflowSPD -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SignaturesWorkflowSPD1033 -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteAssets -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteFeed -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteFeedController -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteFeedStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteHelp -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteNotebook -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteServicesAddins -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteSettings -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SitesList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteStatusBar -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SiteUpgrade -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SkuUpgradeLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SlideLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SlideLibraryActivation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SmallBusinessWebsite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SocialDataStore -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SocialRibbonControl -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SocialSite -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SPAppAnalyticsUploaderJob -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SpellChecking -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SPSBlog -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SPSBlogStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SPSDisco -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SPSearchFeature -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SRPProfileAdmin -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SSSvcAdmin -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition StapledWorkflows -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition SurveysList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TaskListNewsFeed -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TasksList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TaxonomyFeatureStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TaxonomyFieldAdded -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TaxonomyTenantAdmin -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TaxonomyTenantAdminStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TaxonomyTimerJobs -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TeamCollab -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TemplateDiscovery -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantAdminBDC -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantAdminBDCStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantAdminDeploymentLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantAdminLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantAdminSecureStore -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantAdminSecureStoreStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantProfileAdmin -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantProfileAdminStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantSearchAdmin -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TenantSearchAdminStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TimeCardList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TopicPageLayouts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TopicPages -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Translation -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TranslationTimerJobs -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TranslationWorkflow -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TransMgmtFunc -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition TransMgmtLib -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition UPAClaimProvider -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition UpgradeOnlyFile -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition UserMigrator -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition UserProfileUserSettingsProvider -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition V2VPublishedLinks -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition V2VPublishingLayouts -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VideoAndRichMedia -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition ViewFormPagesLockDown -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VisioProcessRepository -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VisioProcessRepositoryContentTypes -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VisioProcessRepositoryContentTypesUs -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VisioProcessRepositoryFeatureStapling -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VisioProcessRepositoryUs -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VisioServer -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition VisioWebAccess -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WAWhatsPopularWebPart -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WebPageLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WebPartAdderGroups -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WhatsNewList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WhereaboutsList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WikiPageHomePage -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WikiWelcome -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WordServerViewing -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WorkflowAppOnlyPolicyManager -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WorkflowHistoryList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition workflowProcessList -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition Workflows -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WorkflowServiceStapler -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WorkflowServiceStore -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition WorkflowTask -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition XmlFormLibrary -ea SilentlyContinue
AddFeature -identity $sfp -FeatureDefinition XmlSitemap -ea SilentlyContinue
 
$out = "SharePointFoundationFeatures = "+$ffp.ID  
$out = $out + "SharePointServerFeatures = "+$sfp.ID 
$out | out-File "FeaturePacks.txt"

# Change here
# farm details - update to reflect environment
$hostingMainURL = "http://multitenant.domain.com"
$upaProxyName = "User Profile Service Application Proxy"
$mmsProxyName = "Managed Metadata Service Application Proxy"

# feature packs - update after creating them
$foundationFeatures = $ffp.ID
$enterpriseFeatures = $sfp.ID

Write-Host "Resetting IIS..."
iisreset

function ProvisionTenant($customerName, $customerTenantAdmin, $customerTenantAdminEmail, $customerFeatures, $hostingMainURL, $upaProxyName, $mmsProxyName, $foundationFeatures)
{
    Write-Host "Provisioning Tenant..."
    Write-Host "Name: $customerName"
    Write-Host "Admin: $customerTenantAdmin"
    Write-Host "Email: $customerTenantAdminEmail"
    Write-Host "Features: $customerFeatures"
    Write-Host "Foundation: $foundationFeatures"

    # grab the web app
    $webApp = Get-SPWebApplication $hostingMainURL

    # create new Site Subscription
    Write-Host "Creating Site Subcription..."
    $sub = New-SPSiteSubscription
	
    # Change here
	# assign feature pack and configure the OU to use in the People Picker for the Subscription
    Write-Host "Assiging Feature Pack and configuring People Picker..."
    Set-SPSiteSubscriptionConfig –id $sub -FeaturePack $customerFeatures -UserAccountDirectoryPath "OU=$customerName,OU=Tenants,DC=domain,DC=com"
	
    # Change here
	# create the "main" member site (we need a site at the root to use Host Headers and Managed Paths in the following cmdlets)
    Write-Host "Creating Member Site..."
    New-SPSite -url "http://sp.$customerName.domain.com" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template sts#0

    # Change here
    # create Tenant Admin site 
    Write-Host "Creating Tenant Admin site..."
    New-SPSite -url "http://sp.$customerName.domain.com/admin" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template tenantadmin#0 -AdministrationSiteType TenantAdministration
	
	# everything else needs standard
    if (!($customerFeatures -eq $foundationFeatures))
    {
        Write-Host "Tenant has SharePoint Server features"
        
        # Change here
        # create a mysite host
        Write-Host "Creating My Site Host..."
        New-SPSite -url "http://sp.$customerName.domain.com/mysites" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template SPSMSITEHOST#0
		
        # Change here
		# configure the MySites host, MySites path, Naming Resolution and Profile Sync OU for the Subscription
        Write-Host "Configuring Tenant Profile Config..."
        $upaProxy = Get-SPServiceApplicationProxy | where-object {$_.DisplayName -eq $upaProxyName}
        Add-SPSiteSubscriptionProfileConfig -id $sub -SynchronizationOU $customerName -MySiteHostLocation "http://sp.$customerName.domain.com/mysites" -MySiteManagedPath "/mysites/personal" -SiteNamingConflictResolution "None" -ProfileServiceApplicationProxy $upaProxy

        # Change here
        # create a site for the Content Type Gallery
        Write-Host "Creating Content Type Gallery..."
        New-SPSite -url "http://sp.$customerName.domain.com/cthub" -SiteSubscription $sub -HostHeaderWebApplication $webApp -owneralias $customerTenantAdmin -owneremail $customerTenantAdminEmail -template sts#0

        # configure the Content Type Gallery for the Subscription
        Write-Host "Configuring Tenant Content Type Gallery..."
        $mmsProxy = Get-SPServiceApplicationProxy | where-object {$_.DisplayName -eq $mmsProxyName}
        
        # Change here
        # ContentTypeHub feature activation may fail - if so activate manually
        Set-SPSiteSubscriptionMetadataConfig -identity $sub -serviceProxy $mmsProxy -huburi "http://sp.$customerName.domain.com/cthub" -SyndicationErrorReportEnabled
        Write-Host "Activating Content Type Hub..."
        Enable-SPFeature -Identity ContentTypeHub -url "http://sp.$customerName.domain.com/cthub"
        
    }
    Write-Host "Tenant Provisioned!"
    return $sub;
}

# Change here
# customer details - do this for each tenant
# Tenant 1
$customerName = "Customer1"
$customerTenantAdmin = "DOMAIN\customer1user"
$customerTenantAdminEmail = "customer1user@domain.com"
$customerFeatures = $enterpriseFeatures
ProvisionTenant $customerName $customerTenantAdmin $customerTenantAdminEmail $customerFeatures $hostingMainURL $upaProxyName $mmsProxyName $foundationFeatures

# Change here
# Tenant 2
$customerName = "Customer2"
$customerTenantAdmin = "DOMAIN\customer2user"
$customerTenantAdminEmail = "customer2user@domain.com"
$customerFeatures = $enterpriseFeatures
ProvisionTenant $customerName $customerTenantAdmin $customerTenantAdminEmail $customerFeatures $hostingMainURL $upaProxyName $mmsProxyName $foundationFeatures

Nachfolgender Code muss als CreateUPA.ps1 gespeichert und im gleichen Ordner wie MT2013Setup.ps1 abgelegt werden. Diese Datei wird via MT2013Setup.ps1 aufgerufen und muss deshalb nicht manuell ausgeführt werden.

Add-PSSnapin Microsoft.SharePoint.PowerShell

# Change here
# App Pools
$saAppPoolName = "SharePoint Web Services Default"

# Change here
# UPA specifics
$upaInstanceName = "User Profile Service"
$upsInstanceName = "User Profile Synchronization Service"
$upaName = "User Profile Service Application"
$databasePrefix = "Set-Your-Database-Prefix"
$upaProfileDB = "Profile"
$upaProfileDBName = $databasePrefix + "_" + $upaProfileDB
$upaSocialDB = "Social"
$upaSocialDBName = $databasePrefix + "_" + $upaSocialDB
$upaSyncDB = "Sync"
$upaSyncDBName = $databasePrefix + "_" + $upaSyncDB

# Grab the Appplication Pool for Service Application Endpoint
$saAppPool = Get-SPServiceApplicationPool $saAppPoolName

&lt;# Creates UPA Service Application &amp; Proxy, and User Profile Service Instance If omitted, -ProfileSyncDBServer, -SocialDBServer &amp; -ProfileDBServer are the SharePoint Default DB Server If omitted, -SyncInstanceMachine is the local machine #&gt;
Write-Host "Creating $upaName Application &amp; Proxy..."
$upa = New-SPProfileServiceApplication -PartitionMode -Name $upaName -ApplicationPool $saAppPoolName -ProfileDBName $upaProfileDBName -SocialDBName $upaSocialDBName -ProfileSyncDBName $upaSyncDBName
New-SPProfileServiceApplicationProxy -PartitionMode -Name "$upaName Proxy" -ServiceApplication $upa -DefaultProxyGroup

# Check it worked
Get-SPServiceApplication | ? {$_.TypeName -eq "User Profile Service Application"}

Sollte ich aus versehen eine Quellangabe vergessen haben, kann mir dies via Kontaktformular mitgeteilt werden. Ich werde diese dann gerne ergänzen. Wer will, kann den Code unter Angabe der Quellen frei verändern und verschönern.