Partner
Platinum Sponsor
Setting up SharePoint 2013: Tips and Tricks and PowerShell Scripts
Michael Noel
USA
1
2Michael Noel Author of SAMS Publishing titles “SharePoint 2013 Unleashed,” “Exchange Server
2013 Unleashed”, “Windows Server 2012 Unleashed,” and over fifteen other titles with worldwide circulation of over a quarter million in 20 languages worldwide
Partner at Convergent Computing (www.cco.com / +1(510)444-5700) – San Francisco, U.S.A. based Infrastructure/Security specialists for SharePoint, AD, Exchange, Security
3
What we will cover
What’s new in Infrastructure in SharePoint 2013?
SharePoint Architecture FundamentalsSharePoint Virtualization OptionsVirtualized Template Server CreationInstallation of the SharePoint 2013 BinariesPowerShell Scripting Installation Options
What’s New in Infrastructure for SharePoint 2013
Outlining Changes and new Requirements for Installation
4
Windows Server 2008 R2 SP1 or Windows Server 2012 (Preferred)
SQL Server 2008 R2 w/SP1 or SQL Server 2012 (Preferred)
Type Memory Processor
Dev/Stage/Test server 8GB RAM 4 CPU
‘All-in-one’ DB/Web/SA 24GB RAM 4 CPU
Web/SA Server 12GB RAM 4 CPU
DB Server (medium environments) 16GB RAM 8 CPU
DB Server (small environments) 8GB RAM 4 CPU
What’s new in Infrastructure for SharePoint 2013
Software/Hardware Requirements
Office Web Apps is no longer a service applicationWeb Analytics is no longer service application, it’s part of
searchNew service applications available and improvements on
existing ones App Management Service – Used to manage the new SharePoint
app store from the Office Marketplace or the Application Catalog SharePoint Translation Services – provides for language
translation of Word, XLIFF, and PPT files to HTML Work Management Service – manages tasks across SharePoint,
MS Exchange and Project. Access Services App (2013) – Replaces 2010 version of Access
Services
What’s new in Infrastructure for SharePoint 2013
Changes in Service Applications and New Service Applications
App Management Service – Used to manage the new SharePoint app store from the Office Marketplace or the Application Catalog
SharePoint Translation Services – provides for language translation of Word, XLIFF, and PPT files to HTML
Work Management Service – manages tasks across SharePoint, MS Exchange and Project.
Access Services App (2013) – Replaces 2010 version of Access Services
What’s new in Infrastructure for SharePoint 2013
New Service Applications
A new Windows service – the Distributed Cache Service – is installed on each server in the farm when SharePoint is installed
It is managed via the Services on Server page in central admin as the Distributed Cache service
The config DB keeps track of
which machines in the farm
are running the cache service
What’s new in Infrastructure for SharePoint 2013
Distributed Cache Service
The purpose of the Request Management feature is to give SharePoint knowledge of and more control over incoming requests
Having knowledge over the nature of incoming requests – for example, the user agent, requested URL, or source IP – allows SharePoint to customize the response to each request
RM is applied per web app, just like throttling is done in SharePoint 2010
What’s new in Infrastructure for SharePoint 2013
Request Management (RM)
Option 1: Simple one-way Sync (a la SharePoint 2007)Option 2: Two-way, possible write-back to AD options
using small FIM service on UPA server (a la 2010)Option 3: Full Forefront Identity Manager (FIM)
Synchronization, allows for complex scenarios – Larger clients will appreciate this
What’s new in Infrastructure for SharePoint 2013
User Profile Sync – Three Options for Deployment
SharePoint 2013 continues to offer support for both claims and classic authentication modes
However claims authentication is THE default authentication option nowClassic authentication mode is still there, but can only
be managed in PowerShell – it’s gone from the UI Support for classic mode is deprecated and will go away
in a future releaseThere also a new process to migrate accounts from Windows classic to Windows claims – the Convert-SPWebApplication cmdlet
What’s new in Infrastructure for SharePoint 2013
Claims-based Authentication - Default
Stores new versions of documents as ‘shredded BLOBs that are deltas of the changes
Promises to reduce storage size significantly
What’s new in Infrastructure for SharePoint 2013
Shredded Storage
Documents are stored in SharePointEmails are stored in ExchangeTeam Folders can receive emails and have their own email address
Easy access to both from Outlook and SharePoint
Unified compliance policy applies to both
What’s new in Infrastructure for SharePoint 2013
Team Mailboxes – Exchange 2013 Integration
New Search architecture (FAST based) with one unified search
Personalized search results based on search history
Rich contextual previews
What’s new in Infrastructure for SharePoint 2013
Search – FAST Search now included
Classic and Contemporary views for mobile browsers
Automatic Mobile Browser Redirection
Target different designs based on user agent string
Office Mobile Web Apps Excel PowerPoint Word
Push notifications
What’s new in Infrastructure for SharePoint 2013
Mobile Device Improvements
Architecting the FarmDeciding the Ideal Farm Architecture Prior to Installation
16
Web
Service Apps
Data
Architecting the Farm
Three Layers of SharePoint Infrastructure
‘All-in-One’ (Avoid)
DB and SP Roles Separate
Architecting the Farm
Small Farm Models
2 SharePoint Servers running Web and Service Apps
2 Database Servers (AlwaysOn FCI or AlwaysOn Availability Groups)
1 or 2 Index Partitions with equivalent query components
Smallest farm size that is fully highly available
Architecting the Farm
Smallest Highly Available Farm
2 Dedicated Web Servers (NLB)
2 Service Application Servers
2 Database Servers (Clustered or Mirrored)
1 or 2 Index Partitions with equivalent query components
Architecting the Farm
Best Practice ‘Six Server Farm’
• Separate farm for Service Applications
• One or more farms dedicated to content
• Service Apps are consumed cross-farm
• Isolates ‘cranky’ service apps like User Profile Sync and allows for patching in isolation
Architecting the Farm
Ideal – Separate Service App Farm + Content Farm(s)
• Multiple Dedicated Web Servers
• Multiple Dedicated Service App Servers
• Multiple Dedicated Query Servers
• Multiple Dedicated Crawl Servers, with multiple Crawl DBs to increase parallelization of the crawl process
• Multiple distributed Index partitions (max of 10 million items per index partition)
• Two query components for each Index partition, spread among servers
Architecting the Farm
Large SharePoint Farms
Best Practice Information Governance Architecture - Distribute
Architecting the Farm
SharePoint VirtualizationNew Options for SharePoint Installation
24
Allows organizations that wouldn’t normally be able to have a test environment to run one
Allows for separation of the database role onto a dedicated server Can be more easily scaled out in the future
Sample 1: Single Server Environment
SP Server Virtualization
High-Availability across Hosts
All components Virtualized
Uses only two Windows Virt Licenses
Sample 2: Two Server Highly Available Farm
SP Server Virtualization
Highest transaction servers are physical
Multiple farm support, with DBs for all farms on the SQL cluster
Sample 3: Mix of Physical and Virtual Servers
SP Server Virtualization
Scaling to Large Virtual Environments
SP Server Virtualization
Processor (Host Only) <60% Utilization = Good 60%-90% = Caution >90% = Trouble
Available Memory 50% and above = Good 10%-50% = OK <10% = Trouble
Disk – Avg. Disk sec/Read or Avg. Disk sec/Write Up to 15ms = fine 15ms-25ms = Caution >25ms = Trouble
• Network Bandwidth – Bytes Total/sec– <40% Utilization = Good– 41%-64% = Caution– >65% = Trouble
• Network Latency - Output Queue Length– 0 = Good– 1-2= OK– >2 = Trouble
Virtualization of SharePoint ServersVirtualization Performance Monitoring
Quick SP2013 Farm Provisioning with VMM 2012
1. Create new Virtual Guest (Windows Server 2008 R2)
2. Install SP2013 Binaries. Stop before running Config Wizard
3. Turn Virtual Guest into Template, modify template to allow it to be added into domain
4. Add PowerShell script to run on first login, allowing SP to be added into farm or to create new farm
Installation of SharePointAutomating and Customizing the Installation Experience
31
32
Installation of the SP Binaries
Always, ALWAYS choose Complete for any production builds!
Stand-alone installs SQL Server Express
33
Installation of the SP Binaries
Choose the Index location during the install process…it will save you the trouble of moving it later
Be sure to allocate sufficient space!
34
Installation of the SP Binaries
Uncheck the box to run the Configuration Wizard
Preferable to use PowerShell instead of the Wizard!
PowerShell InstallationNearly the entire process can be scripted and
automatedAllows for the creation of standardized database
names (no GUIDs)Exception is User Profile Synch Service, which
could be automated, but can be very tricky (requires special process) so is generally recommended to be done manually
Sample install scripts written for our ‘SharePoint Unleashed’ book are available on Toni Frankola’s blog at http://tinyurl.com/SPFarm-Config
35
Sample Script (http://tinyurl.com/SPFarm-Config) $configType = read-host "Do you wish to create a new farm? (Y/N)" if ($ConfigType -eq "N") { $DatabaseServer = read-host "Preparing to join existing farm. Please specify the name of your SQL Server"; $ConfigDB = read-host "Next, specify the name of your Farm Configuration Database"; $Passphrase = read-host "Finally, please enter your Farm passphrase" -assecurestring } else { $DatabaseServer = read-host "Preparing to create a new Farm. Please specify the name of your SQL
Server (ex SERVER or SERVER\INSTANCE[,PORT])"; $FarmName = read-host "Please specify a name for your Farm (ex. SP2013Dev)"; $ConfigDB = $FarmName+"_ConfigDB"; $AdminContentDB = $FarmName+"_CentralAdminContent"; Write-Host "Please enter the credentials for your Farm Account (ex. COMPANYABC\SP_Farm)"; $FarmAcct = Get-Credential; $Passphrase = read-host "Enter a secure Farm passphrase (must meet password complexity requirements)"
-assecurestring; $Port = read-host "Enter a port number for the Central Administration Web App"; $Authentication = read-host "Finally, specify your authentication provider (NTLM/Kerberos)"; } if ($ConfigType -eq "N") { if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) { Add-PSSnapin Microsoft.SharePoint.PowerShell; }
Connect-SPConfigurationDatabase -DatabaseName $ConfigDB -DatabaseServer $DatabaseServer -Passphrase $Passphrase
} else { if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) { Add-PSSnapin Microsoft.SharePoint.PowerShell; } Write-Host "Your SharePoint Farm is being configured..." New-SPConfigurationDatabase -DatabaseName $ConfigDB -DatabaseServer $DatabaseServer -
AdministrationContentDatabaseName $AdminContentDB -Passphrase $Passphrase -FarmCredentials $FarmAcct
} Initialize-SPResourceSecurity Install-SPService Install-SPFeature -AllExistingFeatures New-SPCentralAdministration -Port $Port -WindowsAuthProvider $Authentication Install-SPHelpCollection -All Install-SPApplicationContent Write-Host "Your SharePoint 2013 Farm has been created!" if ($ConfigType -eq "Y") { $WebAppCreation = read-host "Would you like to provision a Web Application using the default Team Site
Template? (Y/N)"; if ($WebAppCreation -eq "Y") { $HostHeaderQ = read-host "Would you like to specify a host header? (Y/N)"; if ($HostHeaderQ -eq "Y") { $HostHeader = read-host "Please specify a host header for your Web Application (ex.
intranet.contoso.com)"; $URL = "http://"+$HostHeader; } else { $URL = "http://"+$env:COMPUTERNAME; } Write-Host "Creating your Web Application..."; $ap = New-SPAuthenticationProvider New-SPWebApplication -Name "SharePoint 2013 Team Site" -Port 80 -Url $URL -
ApplicationPool "Content_AppPool" -ApplicationPoolAccount (Get-SPManagedAccount $FarmAcct.UserName) -DatabaseServer $DatabaseServer -DatabaseName ($FarmName + "_TeamSite_ContentDB_01") -AuthenticationProvider $ap;
New-SPSite $URL -OwnerAlias $FarmAcct.UserName -Language 1033 -Template "STS#0" -Name "Team Site";
Write-Host "Configuration completed."; } else { Write-Host "Configuration completed."; } }
$serviceAppsConfig = read-host "Do you wish to configure Service Applications? (Y/N)"
if($serviceAppsConfig -eq "Y") { PowerShell -File "Configure-ServiceApps.ps1" $FarmName } else { Write-Host "Press any key to continue..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") }
36
Sample Script – Service Apps (http://tinyurl.com/SPFarm-Config) cls Remove-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) { Add-PSSnapin Microsoft.SharePoint.PowerShell; }
function Start-SPService($ServiceInstanceTypeName) { $ServiceInstance = (Get-SPServiceInstance | Where {$_.TypeName -eq $ServiceInstanceTypeName}) if($ServiceInstance -ne $null -and $ServiceInstance.Status -ne "Online" -and $ServiceInstance.Status -ne
"Provisioning") { $ServiceInstance | Start-SPServiceInstance } $i = 0; while(-not ($ServiceInstance.Status -eq "Online") -and $i -lt 10) { Write-Host -ForegroundColor Yellow "Waiting for the $ServiceInstanceTypeName service
to provision..."; sleep 100; $ServiceInstance = (Get-SPServiceInstance | Where {$_.TypeName -eq
$ServiceInstanceTypeName}) $i += 1; if($i -eq 10) { $continue = Read-Host "Service $ServiceInstanceTypeName has not yet
been provisioned. Would you like to wait? (Y/N)" if($continue -eq "Y") { $i = 0; } } } }
Function Configure-SPSearch { PARAM($AppPool, $FarmName, $SearchServiceAccount)
$searchServiceInstance = Get-SPEnterpriseSearchServiceInstance -local Start-SPEnterpriseSearchServiceInstance -Identity $searchServiceInstance $dbName = $FarmName + "_SearchServiceApplication" $searchApplication = New-SPEnterpriseSearchServiceApplication -Name "$FarmName Search Service
Application" -ApplicationPool $AppPool -DatabaseName $dbName $searchApplicationProxy = New-SPEnterpriseSearchServiceApplicationProxy -name "$FarmName Search
Service Application Proxy" -SearchApplication $searchApplication Set-SPEnterpriseSearchAdministrationComponent -SearchApplication $searchApplication -
SearchServiceInstance $searchServiceInstance $crawlTopology = New-SPEnterpriseSearchCrawlTopology -SearchApplication $searchApplication $crawlDatabase = Get-SPEnterpriseSearchCrawlDatabase -SearchApplication $searchApplication New-SPEnterpriseSearchCrawlComponent -CrawlTopology $crawlTopology -CrawlDatabase
$crawlDatabase -SearchServiceInstance $searchServiceInstance while($crawlTopology.State -ne "Active") { $crawlTopology | Set-SPEnterpriseSearchCrawlTopology -Active -ErrorAction
SilentlyContinue if ($crawlTopology.State -ne "Active") { Start-Sleep -Seconds 10 } } $queryTopology = New-SPenterpriseSEarchQueryTopology -SearchApplication $searchApplication -
partitions 1 $searchIndexPartition = Get-SPEnterpriseSearchIndexPartition -QueryTopology $queryTopology New-SPEnterpriseSearchQueryComponent -indexpartition $searchIndexPartition -QueryTopology
$queryTopology -SearchServiceInstance $searchServiceInstance $propertyDB = Get-SPEnterpriseSearchPropertyDatabase -SearchApplication $searchApplication Set-SPEnterpriseSearchIndexPartition $searchIndexPartition -PropertyDatabase $propertyDB while ($queryTopology.State -ne "Active") { $queryTopology | Set-SPEnterpriseSearchQueryTopology -Active -ErrorAction
SilentlyContinue if ($queryTopology.State -ne "Active") { Start-Sleep -Seconds 10 } } }
function Start-SPTimer { $spTimerService = Get-Service "SPTimerV4" if($spTimerService.Status -ne "Running") { Write-Host -ForegroundColor Yellow "SharePoint 2013 Timer Service is not running.
Atempting to start the timer." Start-Service "SPTimerV4" $spTimerService = Get-Service "SPTimerV4" while($spTimerService.Status -ne "Running") { Start-Sleep -Seconds 10 Start-Service "SPTimerV4" $spTimerService = Get-Service "SPTimerV4" } Write-Host -ForegroundColor Green "SharePoint 2013 Timer Service is running." } else { Write-Host -ForegroundColor Green "SharePoint 2013 Timer Service is running." } }
Function Get-SPServiceApplicationPoolByName($SPApplicationPoolName, $ManagedAccount) {
$appPool = Get-SPServiceApplicationPool | Where {$_.Name -eq $SPApplicationPoolName} if($appPool -eq $null) { $appPool = New-SPServiceApplicationPool -Name $SPApplicationPoolName -Account
$ManagedAccount } Return $appPool }
Function Get-SPManagedAccountByName($AccountName) { $managedAccount = Get-SPManagedAccount | Where {$_.Username -eq $AccountName}
if($managedAccount -eq $null) { Write-Host "Please enter the credentials for your Managed Account ($AccountName)"; $managedAccountCredential = Get-Credential; $managedAccount = New-SPManagedAccount $managedAccountCredential } Return $managedAccount }
Function Get-SPServiceApplicationByType($TypeName) { $serviceApplications = Get-SPServiceApplication | Where {$_.TypeName -eq $TypeName} if($serviceApplications -ne $null) { $true; } else { $false; } }
Function New-SPUsageApplicationAndProxy($FarmName) { Write-Host -ForegroundColor Yellow "Configuring Usage and Health Data Collection Service..." $dbName = $FarmName + "_UsageandHealthDataCollectionService" New-SPUsageApplication "$FarmName Usage and Health Data Collection Service" -DatabaseName
$dbName $usageApplicationProxy = Get-SPServiceApplicationProxy | where{$_.Name -eq "$FarmName Usage and
Health Data Collection Service"}
if($usageApplicationProxy.Status -eq "Disabled") { $usageApplicationProxy.Status = "Online"; $usageApplicationProxy.Update(); } Write-Host -ForegroundColor Green "Installing Usage and Health Data Collection Service installed." }
Function New-SPStateServiceApplicationGroup($FarmName){ $dbName = $FarmName + "_StateService" Write-Host -ForegroundColor Yellow "Installing State Service Application..." New-SPStateServiceDatabase $dbName | New-SPStateServiceApplication -Name
"$FarmName State Service Application" | New-SPStateServiceApplicationProxy -Name "$FarmName State Service Application Proxy" -DefaultProxyGroup
sleep 10; Write-Host -ForegroundColor Green "State Service Application installed..." }
#arguments from Config-Farm script $FarmName=$args[0];
# Starting SP Timer Service Start-SPTimer
if($appPoolName -eq $null -or $appPoolName -eq "") { $appPoolName = Read-Host "Please specify a name for the ServiceApp Application Pool (eg.
ServiceAppPool)" }
if($managedAccountName -eq $null -or $managedAccountName -eq "") { $managedAccountName = Read-Host "Please enter service account (eg. CompanyABC\sp_serviceapps)" }
if($FarmName -eq $null -or $FarmName -eq "") { $FarmName = Read-Host "Please enter your farm name"; }
$managedAccount = Get-SPManagedAccountByName $managedAccountName $appPool = Get-SPServiceApplicationPoolByName $appPoolName $managedAccount
$decision = read-host "Would you like to install State Service Application? (Y/N)" if ($decision -eq "Y") { New-SPStateServiceApplicationGroup $FarmName }
$decision = read-host "Would you like to install Access Services 2010? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Access Service 2010 Service Installation" -Status "Stating Access Database
Service 2010 Service" Start-SPService("Access Database Service 2010") Write-Progress -Activity "Access Service 2010 Service Installation" -Status "Creating Access Service 2010
Application" New-SPAccessServiceApplication -Name "$FarmName Access Service 2010" -ApplicationPool $appPool -
Default Write-Progress -Activity "Access Service 2010 Service Installation" -Status "Completed" -Completed $true }
$decision = read-host "Would you like to install Business Data Connectivity Service? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Business Data Connectivity Service Installation" -Status "Starting Business Data
Connectivity Service" Start-SPService("Business Data Connectivity Service") $dbName = $FarmName + "_BusinessDataConnectivityService" Write-Progress -Activity "Business Data Connectivity Service Installation" -Status "Creating Business Data
Connectivity Service Application" New-SPBusinessDataCatalogServiceApplication -Name "$FarmName Business Data Connectivity Service"
-ApplicationPool $appPool -databaseName $dbName Write-Progress -Activity "Business Data Connectivity Service Installation" -Status "Completed" -Completed
$true }
$decision = read-host "Would you like to configure Usage and Health Data Collection Service? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Usage and Health Data Collection Service Configuration" -Status "Configuring
Usage and Health Data Collection Service" New-SPUsageApplicationAndProxy $FarmName Write-Progress -Activity "Usage and Health Data Collection Service Configuration" -Status "Completed" -
Completed $true }
$decision = read-host "Would you like to install Excel Services? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Excel Services Installation" -Status "Starting Excel Calculation Services" Start-SPService("Excel Calculation Services") Write-Progress -Activity "Excel Services Installation" -Status "Creating Excel Service Application" New-SPExcelServiceApplication -Name "$FarmName Excel Service" -ApplicationPool $appPool -Default Write-Host -ForegroundColor Green "Excel Services installed." Write-Progress -Activity "Excel Services Installation" -Status "Completed" -Completed $true }
$decision = read-host "Would you like to install Managed Metadata Service? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Managed Metadata Service Application Installation" -Status "Starting Managed
Metadata Web Service" Start-SPService("Managed Metadata Web Service") $dbName = $FarmName + "_ManagedMetadataService"
Write-Progress -Activity "Managed Metadata Service Application Installation" -Status "Creating Managed Metadata Service Application"
$MetaDataServiceApp = New-SPMetadataServiceApplication -Name "$FarmName Managed Metadata Service" -ApplicationPool $appPool -DatabaseName $dbName
$MetaDataServiceAppProxy = New-SPMetadataServiceApplicationProxy -Name "$FarmName Managed Metadata Service Proxy" -ServiceApplication $MetaDataServiceApp -DefaultProxyGroup
Write-Progress -Activity "Managed Metadata Service Application Installation" -Status "Completed" -
Completed $true }
$decision = read-host "Would you like to install Secure Store Service? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Secure Store Service Application Installation" -Status "Starting Secure Store
Service" Start-SPService("Secure Store Service") $dbName = $FarmName + "_SecureStore" Write-Progress -Activity "Secure Store Service Application Installation" -Status "Creating Secure Store
Service Application" $secureStoreServiceApp = New-SPSecureStoreServiceApplication -Name "$FarmName Secure Store
Service Application" -ApplicationPool $appPool -DatabaseName $dbName -AuditingEnabled:$true New-SPSecureStoreServiceApplicationProxy -ServiceApplication $secureStoreServiceApp -Name
"$FarmName Secure Store Service Application Proxy" -DefaultProxyGroup Write-Progress -Activity "Secure Store Service Application Installation" -Status "Completed" -Completed
$true }
$decision = read-host "Would you like to install Visio Graphics Service? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Visio Graphics Service Application Installation" -Status "Starting Visio Graphics
Service" Start-SPService("Visio Graphics Service") Write-Progress -Activity "Visio Graphics Service Application Installation" -Status "Creating Visio Graphics
Service Application" New-SPVisioServiceApplication -Name "$FarmName Visio Graphics Service" -ApplicationPool $appPool Write-Progress -Activity "Visio Graphics Service Application Installation" -Status "Creating Visio Graphics
Service Application Proxy" New-SPVisioServiceApplicationProxy -Name "$FarmName Visio Graphics Service Proxy" -
ServiceApplication "$FarmName Visio Graphics Service" Write-Progress -Activity "Visio Graphics Service Application Installation" -Status "Completed" -Completed
$true }
$decision = read-host "Would you like to install Word Automation Services? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Word Automation Services Application Installation" -Status "Starting Word
Automation Services" Start-SPService("Word Automation Services") $dbName = $FarmName + "_WordAutomationService" Write-Progress -Activity "Word Automation Services Application Installation" -Status "Creating Word
Automation Service Application" New-SPWordConversionServiceApplication -Name "$FarmName Word Automation Service" -
ApplicationPool $appPool -DatabaseName $dbName -Default
Write-Progress -Activity "Word Automation Services Application Installation" -Status "Completed" -Completed $true
}
$decision = read-host "Would you like to install Machine Translation Service Application? (Y/N)" if ($decision -eq "Y") { $dbName = $FarmName + "_MachineTranslationService"
Write-Progress -Activity "Machine Translation Service Application Installation" -Status "Starting Machine Translation Service"
Start-SPService("Machine Translation Service") Write-Progress -Activity "Machine Translation Service Application Installation" -Status "Creating Machine
Translation Service Application" New-SPTranslationServiceApplication -Name "$FarmName Machine Translation Service" -ApplicationPool
$appPool -DatabaseName $dbName Write-Progress -Activity "Machine Translation Service Application Installation" -Status "Completed" -
Completed $true }
$decision = read-host "Would you like to install PerformancePoint Service Application? (Y/N)" if ($decision -eq "Y") { $dbName = $FarmName + "_PerformancePoint"
Write-Progress -Activity "PerformancePoint Service Application Installation" -Status "Starting PerformancePoint Service"
Start-SPService("PerformancePoint Service") Write-Progress -Activity "PerformancePoint Service Application Installation" -Status "Creating
PerformancePoint Service Service Application" New-SPPerformancePointServiceApplication -Name "$FarmName PerformancePoint Service" -
ApplicationPool $appPool -DatabaseName $dbName Write-Progress -Activity "PerformancePoint Service Application Installation" -Status "Completed" -
Completed $true }
$decision = read-host "Would you like to install Work Management Service Application? (Y/N)" if ($decision -eq "Y") { $dbName = $FarmName + "_WorkManagement"
Write-Progress -Activity "Work Management Service Application Installation" -Status "Starting Work Management Service"
Start-SPService("Work Management Service") Write-Progress -Activity "Work Management Service Application Installation" -Status "Creating Work
Management Service Service Application" New-SPWorkManagementServiceApplication –Name "$FarmName Work Management Service" –
ApplicationPool $appPool Write-Progress -Activity "Work Management Service Application Installation" -Status "Completed" -
Completed $true }
$decision = read-host "Would you like to install Search Service? (Y/N)" if ($decision -eq "Y") { Write-Progress -Activity "Search Service Application Installation" -Status "Starting Search Service
Application"
$hostname = (Get-ChildItem env:computername).Value Start-SPEnterpriseSearchServiceInstance $hostname Start-SPEnterpriseSearchQueryAndSiteSettingsServiceInstance $hostname $dbName = $FarmName + "_SearchService"
Write-Progress -Activity "Search Service Application Installation" -Status "Creating Search Service Application"
$SearchServiceApp = New-SPEnterpriseSearchServiceApplication -Name "$FarmName Search Service Application" -ApplicationPool $appPool -DatabaseName $dbName
$SearchServiceAppProxy = New-SPEnterpriseSearchServiceApplicationProxy -Name "$FarmName Search Service Proxy" -ServiceApplication $SearchServiceApp -DefaultProxyGroup
Write-Progress -Activity "Search Service Application Installation" -Status "Configuring 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() Write-Progress -Activity "Search Service Application Installation" -Status "Completed" -Completed $true }
iisreset
Write-Host -ForegroundColor Green "Installation completed."
Post-InstallationAdd additional farm members (via templates if
possible)Configure Request Management for large farms
(configurable via PowerShell)Put a hardware load balancer in front of
SharePoint web front-ends (F5, A10, Kemp, etc.)Configure Backup, iFilters, any third-party web
partsCreate a SQL Maintenance Plan!Configure Security!
38
• Infrastructure Security and Best practices Physical Security Best Practice Service Account Setup Kerberos Authentication
• Data Security Role Based Access Control (RBAC) Transparent Data Encryption (TDE) of SQL Databases
• Transport Security Secure Sockets Layer (SSL) from Server to Client IPSec from Server to Server
• Edge Security Inbound Internet Security (Forefront UAG/TMG)
• Rights Management
Five Layers of SharePoint Security
Post Installation: Configure Security
• Implement SQL Maintenance Plans!• Include DBCC (Check Consistency) and either
Reorganize Indexes or Rebuild Indexes, but not both!
Post InstallationCreate SQL Maintenance Plans
• Add backups into the maintenance plan if they don’t exist already
• Be sure to truncate transaction logs with a T-SQL Script (after full backups have run…)
• Document all key settings in IIS, SharePoint, after installation• Consider monitoring for changes after installation for Config
Mgmt.• Fantastic tool for this is the SPDocKit - can be found at
http://tinyurl.com/spdockit
Post-Installation – Document SharePoint
42Thank you to our sponsors
Thanks for attending!Questions?
Michael Noel
Twitter: @MichaelTNoel
www.cco.com
Slides: slideshare.net/michaeltnoel
Travel blog: sharingtheglobe.com
Session Eval: http://tinyurl.com/spcsea