It is quite easy to enumerate all site collections via PowerShell for on-premise Sharepoint (see e.g. Set search settings in all site collections of Sharepoint web application via PowerShell), but for Sharepoint Online it is more tricky. C# solution which uses client object model was posted in the following article: Get list of site collections using CSOM in Office365. Let’s try to do the same in PowerShell. We will need Microsoft.Online.SharePoint.Client.Tenant.dll library which can be obtained from nuget.
Here is the script:
1: param(
2: [string]$adminWebAppUrl,
3: [string]$login,
4: [string]$password
5: )
6:
7: $currentDir = Convert-Path(Get-Location)
8: $dllsDir = resolve-path($currentDir + "\dlls")
9:
10: [System.Reflection.Assembly]::LoadFile([System.IO.Path]::Combine($dllsDir,
11: "Microsoft.SharePoint.Client.dll"))
12: [System.Reflection.Assembly]::LoadFile([System.IO.Path]::Combine($dllsDir,
13: "Microsoft.SharePoint.Client.Runtime.dll"))
14: [System.Reflection.Assembly]::LoadFile([System.IO.Path]::Combine($dllsDir,
15: "Microsoft.SharePoint.Client.Taxonomy.dll"))
16: [System.Reflection.Assembly]::LoadFile([System.IO.Path]::Combine($dllsDir,
17: "Microsoft.Online.SharePoint.Client.Tenant.dll"))
18:
19: if (-not $adminWebAppUrl)
20: {
21: Write-Host "Specify admin web app url in adminWebAppUrl parameter"
22: -foregroundcolor red
23: return
24: }
25:
26: if (-not $login)
27: {
28: Write-Host "Specify user name in login parameter" -foregroundcolor red
29: return
30: }
31:
32: if (-not $password)
33: {
34: Write-Host "Specify user password in password parameter" -foregroundcolor red
35: return
36: }
37:
38: function Do-Something($url)
39: {
40: Write-Host "Working with $url" -foregroundColor green
41: # ... add your logic here
42: }
43:
44: # initialize client context
45: $clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)
46: $clientContext.RequestTimeOut = 1000 * 60 * 10;
47: $clientContext.AuthenticationMode =
48: [Microsoft.SharePoint.Client.ClientAuthenticationMode]::Default
49: $securePassword = ConvertTo-SecureString $password -AsPlainText -Force
50: $credentials =
51: New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username,
52: $securePassword)
53: $clientContext.Credentials = $credentials
54: $web = $clientContext.Web
55: $site = $clientContext.Site
56: $clientContext.Load($web)
57: $clientContext.Load($site)
58: $clientContext.ExecuteQuery()
59:
60: # enumerate all site collections
61: $web = $clientContext.Web
62: $tenant = New-Object "Microsoft.Online.SharePoint.TenantAdministration.Tenant"
63: -ArgumentList $clientContext
64: $props = $tenant.GetSiteProperties(0, $true)
65: $clientContext.Load($props)
66: $clientContext.ExecuteQuery()
67:
68: foreach($sp in $props)
69: {
70: Do-Something $sp.Url
71: }
The important moment is that we need to provide Sharepoint admin center URL as parameter for this script, not URL of any real site collection. In script we initialize client context (lines 45-58), enumerate site collections using Tenant class from Microsoft.Online.SharePoint.Client.Tenant.dll (lines 61-71) and for each site collection call our custom function. Hope that it will be helpful.
it is retrieving 300 site collections only, how can we get all site collections.
ReplyDelete