Office 365 - Change the Locale of all OneDrive for Business Sites using PowerShell
The SharePoint Online CSOM package has just been updated to include some additional functionality, which includes the ability to change the regional settings of a Site - further details on the updated release can be found here.
One of my customers based in the UK wanted to change the Locale of all of their OneDrive for Business Sites to use the English (UK) locale, this is to ensure that dates displayed in the correct format, unfortunately this setting cannot be controlled centrally however with the new functionality available in CSOM I was able to create a script that iterates through all OD4B sites and changes the locale to the desired value.
The script can be found below, simply update the highlighted variables and execute, it will then loop through all OD4B sites and update the locale to the desired value (in my case 2057). You may need to grant the user that executes this script access to the OD4B sites prior to running the script, an example of how to do this can be found here.
To capture new OD4B sites that are created you will need to run this regularly, possibly via a Scheduled Task.
#Add references to SharePoint client assemblies and authenticate to Office 365 site - required for CSOM
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"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.UserProfiles.dll"
#Specify tenant admin
$User = "admin@tenant.onmicrosoft.com"
$Password = Read-Host -Prompt "Please enter your password" -AsSecureString
$Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($User,$Password)
#Configure MySite Host URL
$SiteURL = "https://tenant-my.sharepoint.com/"
#Bind to MySite Host Site Collection
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Context.Credentials = $Creds
#Identify users in the Site Collection
$Users = $Context.Web.SiteUsers
$Context.Load($Users)
$Context.ExecuteQuery()
#Create People Manager object to retrieve profile data
$PeopleManager = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($Context)
Foreach ($User in $Users)
{
$UserProfile = $PeopleManager.GetPropertiesFor($User.LoginName)
$Context.Load($UserProfile)
$Context.ExecuteQuery()
If ($UserProfile.Email -ne $null)
{
Write-Host "Updating OD4B site for User:" $User.LoginName -ForegroundColor Green
#Bind to OD4B Site and change locale
$OD4BSiteURL = $UserProfile.PersonalUrl
$Context2 = New-Object Microsoft.SharePoint.Client.ClientContext($OD4BSiteURL)
$Context2.Credentials = $Creds
$Context2.ExecuteQuery()
$Context2.Web.RegionalSettings.LocaleId = "2057"
$Context2.Web.Update()
$Context2.ExecuteQuery()
}
}
Brendan Griffin - @brendankarl
Comments
- Anonymous
July 02, 2015
LocaleID is a read-only property? - Anonymous
July 28, 2015
The comment has been removed - Anonymous
October 19, 2015
Quick question what if I wanted to set the TimezoneID instead of LocaleID how would one specify that in your script?- Anonymous
September 20, 2017
I was searching for the same thing and found this answer.. Add these lines before the Web/Update: $Context2.Load($Context2.Web) $Context2.Load($Context2.Web.RegionalSettings.TimeZone) $Context2.Load($Context2.Web.RegionalSettings.TimeZones) $Context2.ExecuteQuery() $Context2.Web.RegionalSettings.TimeZone=$Context2.Web.RegionalSettings.TimeZones.GetbyID("2");Works for me, so thought it might be helpful for others.
- Anonymous