Script to mass disable sync for Office 365 Groups

Silver Contributor

A customer of mine wants to disable sync for all Groups doclibs.

AFAIK there is not a global setting for this.

I know that it is possible to do it manually for every single doclib in the advanced library settings, but such approach is impractical for hundreds of Groups.

Can someone point me to an existing script for doing it for all Groups in a tenant?

TIA.

cc @Juan Carlos González Martín @Santhosh Balakrishnan @Tony Redmond

30 Replies

Nevertheless, my question still remains unanswered...

I will try to be more clear.

 

We know the following facts:

  1. In every Group we have a main "user" document library (with template ID 101). In Italian it is called: Documenti.
  2. In every Group we also have what I would call "system" document libraries (with template ID 101). In Italian they are called: Modelli di modulo, Raccolta stili, Risorse del sito.
  3. In every Group we can create other "user" document libraries (with template ID 101).

 

All this said, if we want to hide the sync button in all "user" libraries by means of a script, and we select the libraries on the basis of template ID 101, we will (try to) hide the sync button also in the "system" document libraries (point 2) and not only in the "user" document libraries (point 1 and point 3).

My question is: is this safe?

 

(Of course in the script I can select the "user" document libraries "by name", but while this is easily feasible for the "main" one (point 1 above), it is instead difficult for the others (point 3 above))...

I guess I need more context. I do not think that the "system" document libraries are used by Office 365 Groups - unless someone can shed more light on this topic. If that is the case, then it might not be important if synchronization was disabled for these libraries. Do users ever synchronize them anyway?

My feeling is that it is not important if synchronization is disabled for these "system" libraries (and anyway users never synchronize them, I think), but I would like to have an "authoritative" answer... Smiley Very Happy

I can't think of why a user would want or attempt to synchronize these libraries...

 

:) Users some times want to do unexpected things...@Salvatore if the template ID approach does not work for you, use the document library name instead and read the document libraries names for every group form a CSV you have created beforehand

Should that comment be "users sometimes do silly things"?

 

Never mind...

Hi Juan,

 

I have read the posts here a few times, but are still not sure that this will solve what i am trying to do.

 

I am basicly looking for a scriptet solution that does the same as opening site settings for a single SPO site or O365 group, going into "Search and offline availability" and select no to "Specify whether this site should be available for offline clients".

 

Can i use your Csom script for this ?

The scripts discussed here are for document libraries. For the setting you want to disable (basically you want to mark a site as not searchable) you need a script (I don't recall If I have one for this scenario that uses CSOM) that does this at the site level

I took a stab at this using the scripts already created by @Juan Carlos González Martín and @Brent Ellis along with the site iteration scripts here.  This will set the Offline Client Availability at the web level initially for the site you enter and give you the option to do all subsites (I edited the original to include all levels of subsites based on this super handy script here and not just level 1).  I tested this on Group and Classic sites.  It certainly could be cleaned up a bit and be enhanced to support things like .csv input and probably overall more optimized.  

Add-Type -Path "C:\temp\microsoft.sharepointonline.csom.16.1.6008.1200\lib\net45\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\temp\microsoft.sharepointonline.csom.16.1.6008.1200\lib\net45\Microsoft.SharePoint.Client.runtime.dll"

$siteUrl = Read-Host -Prompt "Enter Site Collection URL"
$username = Read-Host -Prompt “Enter username”
$password = Read-Host -Prompt “Enter password” -AsSecureString
$subwebcheck = Read-Host -Prompt "Do you want to process subsites? (Y/N)"

# Generate ClientContext function so we can reuse
function GetClientContext($siteurl, $username, $password) {
     $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteurl) 
     $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $password) 
     $ctx.Credentials = $credentials
     return $ctx
}

$ctx = GetClientContext $siteurl $username $password

if ($ctx.ServerObjectIsNull.Value) { 
    Write-Host "Unable to connect to: '$siteUrl'" -ForegroundColor Red
} else {
    Write-Host "Connected to: '$($siteUrl)'" -ForegroundColor Green 

    $rootWeb = $ctx.Web
    $ctx.Load($rootWeb)
    $ctx.ExecuteQuery()

    # update root site
    Write-Host $rootWeb.Url "is being updated to exclude from offline clients"
    $rootWeb.ExcludeFromOfflineClient=$true
    $rootWeb.Update()
    $ctx.Load($rootWeb)
    $ctx.ExecuteQuery()
    Write-Host "ExcludeFromOfflineClient is now" $rootWeb.ExcludeFromOfflineClient "for the site:" $rootWeb.Url -ForegroundColor Green
       
    if ($subwebcheck -eq "Y") {
        
        # work with subsites
        Write-Host "Processing subsites..." -ForegroundColor Yellow
        $childWebs = $rootWeb.Webs
        $ctx.Load($childWebs)
        $ctx.ExecuteQuery()
        foreach ($childWeb in $childWebs)
        {
            processsubsites $childWeb.url
        }
    }

    # function to loop through subsites and setting values
    function processsubsites ($siteurl){
        $ctx = GetClientContext $siteurl $username $password
        $rootWeb = $ctx.Web
        $childWebs = $rootWeb.Webs
        $ctx.Load($rootWeb)
        $ctx.Load($childWebs)
        $ctx.ExecuteQuery()

        # perform update
        if($rootWeb.WebTemplate -ne "APP"){
            Write-Host $rootWeb.Url "is being updated to exclude from offline clients"
            $rootWeb.ExcludeFromOfflineClient=$true
            $rootWeb.Update()
            $ctx.Load($rootWeb)
            $ctx.ExecuteQuery()
            Write-Host "ExcludeFromOfflineClient is now" $rootWeb.ExcludeFromOfflineClient "for the site:" $rootWeb.Url -ForegroundColor Green
        }

        # loop subsites of subsites
        foreach ($childWeb in $childWebs)
        {           
            processsubsites $childWeb.url
        }
    }


}

To note, Setting this property to true does not disable synchronization. Instead, it represents a recommendation to the client not to attempt synchronization. This info is pulled from here

 

Thankyou so much Drew. This was spot on what i was looking for. Saved my day. Again, thanks a lot.

this script works very well for existing groups. But is it also possible to disable syncronization when creating a group? Otherwise you always have to switch something off afterwards