Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
In SharePoint OnPremise, it is very easy to enumerate all the sub webs [SPWeb] of a site collection [SPSite]. This is exposed as the AllWebs property under the SPSite object – See here.
However, this is not exposed in SharePoint Online via CSOM. So in order to touch all the SPWeb objects via CSOM, we need to use recursion – and the below code sample can assist in achieving that.
# replace these details (also consider using Get-Credential to enter password securely as script runs)
$username
=
"administrator@domain.onmicrosoft.com"
$password
=
"pwd"
#Provide site collection URL here. Alternatively, you can enumerate all site collections using get-sposite and process each.
#The SPSite will be constructed based on this URL.
$url
=
"https://domain.sharepoint.com/"
$securePassword
=
ConvertTo-SecureString
$Password
-AsPlainText
-Force
#Install SharePoint Online Client SDK on the machine you are running this script to load these DLLs.
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SharePoint.Client')
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SharePoint.Client.Runtime')
# connect/authenticate to SharePoint Online and get ClientContext object
$clientContext
=
New-Object
Microsoft.SharePoint.Client.ClientContext($url)
$credentials
=
New-Object
Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword)
$clientContext.Credentials = $credentials
if (!$clientContext.ServerObjectIsNull.Value)
{
Write-Host
"Connected to SharePoint Online site: '$Url'"
-ForegroundColor
Green
}
function
processWeb($web)
{
if($urls
-notcontains
$web.url)
{
$urls
+=
$web.url
}
function
getchildcount($web)
{
$web.Context.Load($web.webs)
$web.Context.ExecuteQuery()
return
$web.Webs.Count
}
if((getchildcount($web)) -gt
0)
{
$ch
=
$web.Webs
foreach($c
in
$ch)
{
$WEB.Context.Load($C)
$web.Context.ExecuteQuery()
processWeb($c)
}
}
return
$urls
}
$rootweb
=
$clientContext.Web
$clientContext.Load($rootweb)
$clientContext.ExecuteQuery()
#This command may take some time to complete – can be monitored using a tracing tool like Fiddler.
$subwebURLs
=
processWeb($rootweb)
#Displaying the list of SPWeb URLs as a result.
$subwebURLs