2013-04-11

Finally I managed to get some time to have a look into the SharePoint 2013 features in depth (in DEV mode Hurray!!!!). To keep things interesting I thought I will create a script to provision a SP2013 Search Service application in a Single server farm and ended up with the below script. I have tested it on my VM and my plan is to extend this script to set up other search Features like Crawl option, Content Sources and a Example site so the full search features in the SP2013.

Please feel free to comment on this and I will amend it accordingly.

Summary:

  • Creates a Search account user in the domain.
  • Creates a Managed account for it.
  • Set up a new Search Service application and its components.
Add-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue
$domainName = "SP"
$searchServiceAdminAppPoolUserName = "SearchServiceAdmin"
$searchServiceAdminAppPoolUserFullName = "$domainName\$searchServiceAdminAppPoolUserName"
$IndexFolder = "c:\SP2013\SearchIndex"
$SearchAppPoolName = "SP2013 Application Pool"
$SearchServiceApplicationName = "Search Application"
$SearchServiceApplicationProxyName = "Search Application Proxy"
$SearchServer = "WIN-2J3IDCDEUH6"
$DBServer = "WIN-2J3IDCDEUH6\DEFAULTDB"
$SearchServiceDBName = "SP2013 Search"
#------------------------------------------------------------------------------------------------------------------------
# How to configure SharePoint Search Service application.
# http://technet.microsoft.com/en-us/library/gg502597.aspx
#------------------------------------------------------------------------------------------------------------------------
#------------------------------------------------------------------------------------------------------------------------
#1. Create this user in the domain.
#------------------------------------------------------------------------------------------------------------------------
if(get-aduser -identity "CN=$searchServiceAdminAppPoolUserName,CN=Users,DC=$domainName,DC=Local")
{
Write-Host "User $searchServiceAdminAppPoolUserFullName already exist in the domain $domainName"
}
else
{
New-ADUser -Name "$searchServiceAdminAppPoolUserName" -AccountPassword (ConvertTo-SecureString -AsPlainText "ytrewq1!" -Force) -Enabled $true -PasswordNeverExpires $true -Path "CN=Users,DC=$domainName,DC=Local"
}
#------------------------------------------------------------------------------------------------------------------------
#2. Create a Managed account.
#------------------------------------------------------------------------------------------------------------------------
if(Get-SPManagedAccount | Where-Object { $_.UserName -eq $searchServiceAdminAppPoolUserFullName })
{
Write-Host "Search Service Admin AppPool User Account : $searchServiceAdminAppPoolUserFullName already exist"
}
else
{
$searchServiceAdminAppPoolUserCredential = Get-Credential $searchServiceAdminAppPoolUserFullName
New-SPManagedAccount -Credential $searchServiceAdminAppPoolUserCredential
}
#------------------------------------------------------------------------------------------------------------------------
#3. Create a new Search Service application.
#------------------------------------------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------------------------------
# Start the local Enterprise Search service.
#----------------------------------------------------------------------------------------------------------------------
$SearchServiceInstance = Get-SPEnterpriseSearchServiceInstance -local
#Start-SPEnterpriseSearchServiceInstance -Identity $SearchServiceInstance 
#------------------------------------------------------------------------------------------------------------------------
#3a. Create a Search Application Pool.
#------------------------------------------------------------------------------------------------------------------------
$SearchAppPoolInstance = Get-SPServiceApplicationPool -Identity $SearchAppPoolName -ErrorAction SilentlyContinue
if($SearchAppPoolInstance)
{
Write-Host "Search Application Pool : $SearchAppPoolName already exist."
}
else
{
$SearchAppPoolInstance = New-SPServiceApplicationPool -Name $SearchAppPoolName -Account $searchServiceAdminAppPoolUserFullName -verbose
}
#------------------------------------------------------------------------------------------------------------------------
#3b. Create a Search Application Instance.
#------------------------------------------------------------------------------------------------------------------------
$SearchServiceApplication = Get-SPEnterpriseSearchServiceApplication -Identity $SearchServiceApplicationName -ErrorAction SilentlyContinue
if($SearchServiceApplication)
{
Write-Host "Search Service Application : $SearchServiceApplicationName already exist."
# Removes the configured Search application, Databases and the Index
Remove-SPServiceApplication $SearchServiceApplication -RemoveData
}
# Set the Search Service default index location...
# If the default index location is null, creating a New-SPEnterpriseSearchServiceApplication will throw the following error.
# New-SPEnterpriseSearchServiceApplication : Value cannot be null.
# Parameter name: indexLocation
$SearchServer | % {
$svcInst = (Get-SPServer -Identity $_).serviceinstances | ? { $_.GetType().FullName -eq "Microsoft.Office.Server.Search.Administration.SearchServiceInstance" }
$svcInst.DefaultIndexLocation = $defaultIndexLocation
$svcInst.Update()
$svcInst.Provision()
}
$SearchServiceApplication = New-SPEnterpriseSearchServiceApplication -Name $SearchServiceApplicationName -ApplicationPool $SearchAppPoolInstance.Name -DatabaseServer $DBServer -DatabaseName $SearchServiceDBName
# This creates the following Database.
# 1. $SearchServiceDBName (ex: SP2013 Search)
# 2. $SearchServiceDBName_AnalyticsReporting (ex: SP2013 Search_AnalyticsReporting)
# 3. $SearchServiceDBName_CrawlStore
# 4. $SearchServiceDBName_LinkStore
#------------------------------------------------------------------------------------------------------------------------
#3c. Create a Search Application Proxy for the above Search Service Application instance.
#------------------------------------------------------------------------------------------------------------------------
$SearchServiceApplicationProxy = Get-SPEnterpriseSearchServiceApplicationProxy -Identity $SearchServiceProxyName -ErrorAction SilentlyContinue
if ($SearchServiceApplicationProxy)
{
Write-Host "Search Service Application Proxy : $SearchServiceApplicationProxy already exist."
}
else
{
$SearchServiceApplicationProxy = New-SPEnterpriseSearchServiceApplicationProxy -Name $SearchServiceProxyName -SearchApplication $SearchServiceApplication
}
#------------------------------------------------------------------------------------------------------------------------
# Configure Search components in SP2013
# http://technet.microsoft.com/en-us/library/jj862356.aspx
#------------------------------------------------------------------------------------------------------------------------
$CurrentSearchTopology = Get-SPEnterpriseSearchTopology -SearchApplication $SearchServiceApplication -Active
$NewSearchTopology = New-SPEnterpriseSearchTopology -SearchApplication $SearchServiceApplication
New-SPEnterpriseSearchAnalyticsProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $SearchServiceInstance
New-SPEnterpriseSearchContentProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $SearchServiceInstance
New-SPEnterpriseSearchQueryProcessingComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $SearchServiceInstance
New-SPEnterpriseSearchCrawlComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $SearchServiceInstance
New-SPEnterpriseSearchAdminComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $SearchServiceInstance
Set-SPEnterpriseSearchAdministrationComponent -SearchApplication $SearchServiceApplication -SearchServiceInstance $SearchServiceInstance
Remove-Item -Recurse -Force -LiteralPath $IndexFolder -ErrorAction SilentlyContinue
MKdir -Path $IndexFolder -Force
New-SPEnterpriseSearchIndexComponent -SearchTopology $NewSearchTopology -SearchServiceInstance $SearchServiceInstance -RootDirectory $IndexFolder
$NewSearchTopology.Activate()
Remove-SPEnterpriseSearchTopology -Identity $CurrentSearchTopology -Confirm:$false

 

About the author 

Balamurugan Kailasam