Multi Tenancy SharePoint 2013 Farm mit PowerShell konfigurieren
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 <# Creates UPA Service Application & Proxy, and User Profile Service Instance If omitted, -ProfileSyncDBServer, -SocialDBServer & -ProfileDBServer are the SharePoint Default DB Server If omitted, -SyncInstanceMachine is the local machine #> Write-Host "Creating $upaName Application & 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.