On SharePoint, we usually create site collections using the path-based route. This approach aligns very well with the SharePoint online/Office 365 site structure recommendations. With SharePoint 2013, we can create a site collection using a host-named site which allows us to assign a unique DNS name to our site collections. This enables us to deploy multiple sites with different DNS names in the same web application.
Path-named vs Host-named
Site Collection Structure | Example |
Path-named | ozkary.com/sites/demosite1 |
Host-based | demosite1.ozkary.com |
In order to deploy a host-named site, we need to create a DNS entry that points to the SharePoint host server/farm. We then need to write some code using PowerShell as this feature is not available from the Admin Central.
To create the site collection, we run this custom function from PowerShell with elevated permissions.
#
# Name: createHostNamedSite
#
# Description: Creates a host-named site collection
# Usage
# createSite web-app-name, dns-entry site-name site-description admin-account-name site-template content-database
#
createHostNamedSite "ozkary.com" "https://demosite1.ozkary.com" "Demo Site 1" "Demo Site 1 Description" "admin-account" "STS#0" "WSS_Content_DB"
Parameter Information
Parameters | Description |
Web-app-name | Main SharePoint web app name where site collections are hosted |
Dns-entry | The unique DNS entry for the site |
Site-name | The name for the site collection |
Site-description | The site description |
Admin-account-name | The site collection owner usually the admin |
Site-template | A site template like team site, document center Click here to see more templates |
Content-database | The content database for this site collection |
createHostNameSite Function
Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue
#
# Name: createHostNameSite
#
# Description: create a host-named site collection
#
# Params:
# $webAppName
# $siteUrl
# $siteName
# $description
# $owner
# $template
# $contentDatabase
#
function createHostNameSite($webAppName, $siteUrl, $siteName, $description, $owner,$template, $contentDatabase)
{
write-host "Creating site with parameters " $webAppName, $siteUrl, $siteName, $description, $owner,$template, $contentDatabase , $mapUrl
$continue = Read-Host -Prompt "Do you want to continue (y/n)"
if ($continue -eq "y")
{
write-host "Provisioning Site...."
New-SPSite $siteUrl -Name $siteName -Description $description -OwnerAlias $owner -Template $template -ContentDatabase $contentDatabase -HostHeaderWebApplication (Get-SPWebApplication $webAppName)
}else{
write-host "Process cancelled"
}
}
On the code , we first include the SharePoint plug-in which enables us to use the New-SPSite cmdlet that handles all the hard work for us. Another area to notice is that there is the HostHeaderWebApplication parameter for which we pass the SharePoint web application reference by using the Get-SPWebApplication cmdlet. This is what enables us to create the host-named site.
After the site is created, we should be able to type the DNS name, and if it is already created and propagated in your network, the request should be able to be sent to SharePoint which can load the corresponding site properly.
I hope this is helpful and enjoy your site creation automation (DevOps) with PowerShell.