SharePoint Online Restore Inheritance for all items in the list
Visit our website to find out more useful solutions and services from Chiron IT https://chironit.com
Here is the solution how in SharePoint Online Restore Inheritance for all items in the list or files or documents for a specific list or library in SharePoint online
Requirements
- Installed Management Shell Online
https://www.microsoft.com/en-us/download/details.aspx?id=35588 - Installed SharePoint Online Assemblies
https://www.microsoft.com/en-us/download/details.aspx?id=42038 - Site Collection Admin rights
- For me, there also was a DNS error,
For security reasons DTD is prohibited in this XML document. To enable DTD processing set the DtdProcessing property on XmlReaderSettings to Parse and pass the settings into XmlReader.Create method.
So I reconfigured the IPv4 protocol properties in Adapter Settings to have it like this:
Start Powershell as Admin and launch .ps1 script with the next command:
powershell -ExecutionPolicy ByPass -File script.ps1
Solution #1
#Load SharePoint Online 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" #To call a non-generic method Load Function Invoke-LoadMethod() { param( [Microsoft.SharePoint.Client.ClientObject]$Object = $(throw "Please provide a Client Object"), [string]$PropertyName ) $ctx = $Object.Context $load = [Microsoft.SharePoint.Client.ClientContext].GetMethod("Load") $type = $Object.GetType() $clientLoad = $load.MakeGenericMethod($type) $Parameter = [System.Linq.Expressions.Expression]::Parameter(($type), $type.Name) $Expression = [System.Linq.Expressions.Expression]::Lambda([System.Linq.Expressions.Expression]::Convert([System.Linq.Expressions.Expression]::PropertyOrField($Parameter,$PropertyName),[System.Object] ), $($Parameter)) $ExpressionArray = [System.Array]::CreateInstance($Expression.GetType(), 1) $ExpressionArray.SetValue($Expression, 0) $clientLoad.Invoke($ctx,@($Object,$ExpressionArray)) } ##Variables for Processing $SiteURL = "https://example.sharepoint.com/properties/sdrive" $ListName ="Documents" #Get Credentials to connect $Cred= Get-Credential $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password) #Set up the context $Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl) $Context.Credentials = $Credentials #Get the List $List = $Context.web.Lists.GetByTitle($ListName) $Query = New-Object Microsoft.SharePoint.Client.CamlQuery $Query.ViewXml = "50000" #Batch process list items - to mitigate list threashold issue on larger lists Do { #Get items from the list in batches $ListItems = $List.GetItems($Query) $Context.Load($ListItems) $Context.ExecuteQuery() $Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition #Loop through each List item ForEach($ListItem in $ListItems) { Invoke-LoadMethod -Object $ListItem -PropertyName "HasUniqueRoleAssignments" $Context.ExecuteQuery() if ($ListItem.HasUniqueRoleAssignments -eq $true) { #Reset Permission Inheritance $ListItem.ResetRoleInheritance() Write-host -ForegroundColor Yellow "Inheritence Restored on Item:" $ListItem.ID } } $Context.ExecuteQuery() } While ($Query.ListItemCollectionPosition -ne $null) Write-host "Broken Permissions are Deleted on All Items!" -ForegroundColor Green
Solution #2
function Restore-SPOListAllItemsInheritance { param ( [Parameter(Mandatory=$true,Position=1)] [string]$Username, [Parameter(Mandatory=$true,Position=2)] [string]$Url, [Parameter(Mandatory=$true,Position=3)] [SecureString]$AdminPassword, [Parameter(Mandatory=$true,Position=4)] [string]$ListTitle ) $ctx=New-Object Microsoft.SharePoint.Client.ClientContext($Url) $ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Username, $AdminPassword) $ctx.Load($ctx.Web.Lists) $ctx.Load($ctx.Web) $ctx.Load($ctx.Web.Webs) $ctx.ExecuteQuery() $ll=$ctx.Web.Lists.GetByTitle($ListTitle) $ctx.Load($ll) $ctx.ExecuteQuery() ## View XML $qCommand = @" 5000 "@ ## Page Position $position = $null ## All Items $allItems = @() Do{ $camlQuery = New-Object Microsoft.SharePoint.Client.CamlQuery $camlQuery.ListItemCollectionPosition = $position $camlQuery.ViewXml = $qCommand ## Executing the query $currentCollection = $ll.GetItems($camlQuery) $ctx.Load($currentCollection) $ctx.ExecuteQuery() ## Getting the position of the previous page $position = $currentCollection.ListItemCollectionPosition # Adding current collection to the allItems collection $allItems += $currentCollection Write-Host "Collecting items. Current number of items: " $allItems.Count } while($position -ne $null) Write-Host "Total number of items: " $allItems.Count for($j=0;$j -lt $allItems.Count ;$j++) { Write-Host "Resetting permissions for " $allItems[$j]["Title"] ".." $allItems[$j]["FileRef"] $allItems[$j].ResetRoleInheritance() $ctx.ExecuteQuery() } } # Paths to SDK. Please verify location on your computer. 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" #Enter the data $AdminPassword=Read-Host -Prompt "Enter password" -AsSecureString $username="user@domain.com" $Url="https://example.sharepoint.com/properties/sdrive" $ListTitle="Documents" Restore-SPOListAllItemsInheritance -Username $username -Url $Url -AdminPassword $AdminPassword -ListTitle $ListTitle
Check out the latest articles
Have questions?
Contact Information
I'd love to connect. Here's my calendar link to make finding time easy.
Schedule a call