SharePoint Online: PowerShell to Get All Site Collections and Subsites

Requirement: SharePoint Online PowerShell to get all site collections and subsites.

SharePoint Online PowerShell to list all site collections and subsites

Do you need to get a list of all sites and subsites in your SharePoint Online environment? Manually retrieving a list of all sites and subsites in SharePoint Online can be time-consuming and error-prone, especially if you have a large SharePoint environment with many sites and subsites. PowerShell makes it easy! Using PowerShell, you can quickly and easily retrieve a comprehensive list of all sites and subsites in SharePoint Online.

In this article, we’ll take a look at how to get all site collections and subsites in SharePoint Online using PowerShell from your SharePoint Online tenant. Here is the CSOM PowerShell to list all sites and subsites in SharePoint Online:

Import-Module Microsoft.Online.SharePoint.Powershell

#Config Parameters
$AdminSiteURL="https://crescent-admin.sharepoint.com"

#Get Credentials to connect to SharePoint Admin Center
$Cred = Get-Credential

#Function to get all subsites of a site
Function Get-SPOWeb($WebURL)
{ 
    #Setup credentials to connect
    $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)

    #Get Web information and subsites
    $Context = New-Object Microsoft.SharePoint.Client.ClientContext($webURL)
    $Context.Credentials = $Credentials
    $Web = $context.Web
    $Context.Load($web)
    $Context.Load($web.Webs)
    $Context.executeQuery()
 
    #Iterate through each subsite in the current web
    foreach ($Subweb in $web.Webs)
    {
        #Get the web object
        $Subweb

        #Call the function recursively to process all subsites underneath the current web
        Get-SPOWeb($Subweb.url)
    }
}

#Connect to SharePoint Online Admin Center
Connect-SPOService -Url $AdminSiteURL -Credential $Cred

#Get All site collections
$SiteCollections = Get-SPOSite -Limit All

#Traverse through each site collection and get their subsits
Foreach ($Site in $SiteCollections)
{
    Write-Host $Site.Url     
    $AllWebs = Get-SPOWeb $Site.Url
    $AllWebs | ForEach-Object { Write-Host $_.URL }
}   

This gets you the list of site collections and their subsites. Here is another script:

SharePoint Online: PowerShell to List All Subsites in All Site Collections

Let’s get subsites from all site collections from the tenant. Here is the PowerShell script to get all site collections and subsites in SharePoint Online:

#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

#Function to get each subsite in site collection
Function Get-SPOWebs($SiteURL)
{
    $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)

    #Setup the context
    $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
    $Ctx.Credentials = $Credentials

    #Get the web
    $Web = $Ctx.Web
    $Ctx.Load($Web)
    $Ctx.Load($Web.Webs)
    $Ctx.ExecuteQuery()

    #Do something
    Write-host $Web.Url

    #Loop through each each subsite in site
    Foreach($Web in $web.Webs)
    {
        Get-SPOWebs $Web.Url
    }
}

#Variables
$AdminCenterURL = "https://Crescent-admin.sharepoint.com"

#Setup Credentials to connect
$Cred= Get-Credential
 
#Connect to SharePoint Online
Connect-SPOService -url $AdminCenterURL -Credential ($Cred)

#Get all Site collections
$Sites = Get-SPOSite -Limit All

#Loop through site collections
ForEach($Site in $Sites)
{
    #Call the function to get all sub-sites in site collection
    Get-SPOWebs($Site.URL)
}

SharePoint Administrators can use this PowerShell to quickly get a list of all sites and subsites in their tenant.

PnP PowerShell to Get All Sites and Subsites in SharePoint Online

Let’s see how to get all sites and subsites in SharePoint Online using the PnP PowerShell module. This script retrieves all site collections and their subsites recursively using PnP PowerShell.

#Set Variables
$SiteURL = "https://crescent.sharepoint.com"

#Get Credentials to connect
$Cred = Get-Credential

Try {
    #Connect to PnP Online
    Connect-PnPOnline -Url $SiteURL -Credentials $Cred

    #Get All Site collections  
    $SiteCollections = Get-PnPTenantSite

    #Loop through each site collection
    ForEach($Site in $SiteCollections)
    {  
        Write-host -F Green $Site.Url  
        Try {
            #Connect to site collection
            Connect-PnPOnline -Url $Site.Url -Credentials $Cred

            #Get Sub Sites Of the site collections
            $SubSites = Get-PnPSubWeb -Recurse
            ForEach ($web in $SubSites)
            {
                Write-host `t $Web.URL
            }
        }
        Catch {
            write-host -f Red "`tError:" $_.Exception.Message
        }
    }
}
Catch {
    write-host -f Red "Error:" $_.Exception.Message
}

This script gets all sites and subsites in SharePoint Online using PnP PowerShell.

Make sure you have Site collection Administrator rights on all site collections in the tenant before executing this script. Otherwise, you may get “The remote server returned an error: (401) Unauthorized.” error! PowerShell to Add Site Collection Administrator to All Sites in SharePoint Online

Get Subsites Count in Each Site Collection in SharePoint Online:

In another situation, we wanted to quickly get the number of subsites (recursively in total) for each site collection in the tenant.

#Parameters
$TenantAdminURL = "https://Crescent-Admin.SharePoint.com"

#Connect to Admin Center
$Cred = Get-Credential
Connect-PnPOnline -Url $TenantAdminURL -Credentials $Cred
 
#Get All Site collections - Exclude: Seach Center, Redirect site, Mysite Host, App Catalog, Content Type Hub, eDiscovery and Bot Sites
$SiteCollections = Get-PnPTenantSite | Where -Property Template -NotIn ("SRCHCEN#0","REDIRECTSITE#0", "SPSMSITEHOST#0", "APPCATALOG#0", "POINTPUBLISHINGHUB#0", "EDISC#0", "STS#-1")
 
#Loop through each SharePoint site collection
$SubSitesData = @()
ForEach($Site in $SiteCollections)
{
    #Connect to site collection
    Write-host -f Yellow "Processing site:"$Site.Url    
    Connect-PnPOnline -Url $Site.Url -Credentials $Cred
 
    #Get the SubSites of the site collection
    $Webs = Get-PnPSubWeb -Recurse

    #Collect Subsites count
    $SubSitesData += New-Object PSObject -Property ([ordered]@{
        SiteName = $Site.Title
        URL = $Site.URL
        SubSitesCount = $Webs.Length
    })    
}
$SubSitesData

Export a List of All Sites and Subsites to a CSV

How do I get all SharePoint sites and subsites in PowerShell? Here are the PnP PowerShell cmdlets Get-PnPTenantSite and Get-PnPSubWeb to get all site collections and subsites in your tenant and export them to a CSV file.

#Set Variables
$TenantURL = "https://crescent.sharepoint.com"
$ExportFile = "C:\Temp\SitesandSubsites.csv"

$AllSitesList = @()
Try {
    #Connect to PnP Online
    Connect-PnPOnline -Url $TenantURL -Interactive

    #Get All Site collections - Exclude certain site templates such as personal sites
    $SiteCollections = Get-PnPTenantSite | Where -Property Template -NotIn ("SRCHCEN#0","REDIRECTSITE#0", "SPSMSITEHOST#0", "APPCATALOG#0", "POINTPUBLISHINGHUB#0", "EDISC#0", "STS#-1")
    Write-host "Total Number of site collections:"$SiteCollections.count

    #Loop through each site collection
    ForEach($Site in $SiteCollections)  
    {  
        #Connect to site collection
        Connect-PnPOnline -Url $Site.Url -Interactive

        #Get all Top-level site and Sub Sitess Of the SharePoint Online site collection
        Get-PnPSubWeb -Recurse -IncludeRootWeb -Includes ParentWeb | ForEach-Object {
            $AllSitesList += New-Object PSObject -property $([ordered]@{
                SiteName  = $_.Title            
                SiteURL = $_.Url
                IsSubSite = If($_.ParentWeb.Title -eq $null) {$False} Else {$True}
            })
        }
    }
}
Catch {
    Write-host -f Red "Error:" $_.Exception.Message
}
#get all sites and subsites in sharepoint online
$AllSitesList

#Export All sites and Subsites list to a CSV list
$AllSitesList | Export-CSV -Path $ExportFile -NoTypeInformation -Encoding UTF8
get all sites and subsites sharepoint online powershell

In summary, we have discussed how to get all sites and subsites in SharePoint using PowerShell. Using the scripts in this guide, you can quickly and easily retrieve a list of all sites and subsites in your SharePoint Online environment.

How do I enable subsites in SharePoint Online?

To enable subsites in SharePoint Online, Login to SharePoint Online Admin Center >> Click on Settings >> Click on the “Classic settings page” link. On the settings page, under the “Subsite creation” section, set the option to “Enable subsite creation for all sites”.
More info: Enable Subsites in SharePoint Online

How many subsites can be created in SharePoint Online?

2,000 subsites per site collection! However, having a large number of subsites can have implications for the performance and manageability of your SharePoint environment!

How do I give permission to subsite in SharePoint Online?

Assuming you have a subsite with unique permissions, follow these steps to grant access to a subsite:
1. Navigate to the SharePoint Online site where you want to give subsite permission.
2. Click on the gear icon in the top-right corner of the page and select “Site Settings.”
3. Under the “Users and Permissions” section, click on “Site permissions.”
4. Click on “Grant Permissions” in the ribbon at the top of the page.
5. Enter the email address or group name of the subsite user or group you want to give permission to.
6. Choose the permission level you want to give to the subsite user or group. The available permission levels are Full Control, Design, Edit, Contribute, Read, and Limited Access.
7. Click “Share” to give permission to the subsite user or group.
The subsite user or group will receive an email notification with a link to the subsite. They will need to click on the link and sign in with their Microsoft account to access the subsite.

Related Posts:

Salaudeen Rajack

Salaudeen Rajack - Information Technology Expert with Two-decades of hands-on experience, specializing in SharePoint, PowerShell, Microsoft 365, and related products. He has held various positions including SharePoint Architect, Administrator, Developer and consultant, has helped many organizations to implement and optimize SharePoint solutions. Known for his deep technical expertise, He's passionate about sharing the knowledge and insights to help others, through the real-world articles!

6 thoughts on “SharePoint Online: PowerShell to Get All Site Collections and Subsites

  • Great article! How would you enhance the script to return additional details about each site/subsite (e.g. date site created, file count, page view count, storage used, last activity date)?

    Reply
  • This is great article Rajack . In the first script “SharePoint Online PowerShell to list all site collections and subsites” can you advise how to export all Sites & Subsites in to CSV file ?

    Reply
    • Use the PSObject array to collect the data and then Export-CSV to export the data to CSV.

      Reply
    • thank you can you share the updated script please ?

      Reply
  • https://www.sharepointdiary.com/2017/05/get-all-site-collections-and-subsites-in-sharepoint-online-powershell.html

    In the last script to generate CSV file there is a error in line 15:

    ForEach($Site in $SitesCollection). Should be ForEach($Site in $SiteCollections).

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *