Búsqueda de sitios web

SharePoint Online: eliminar permisos únicos para todos los elementos de una lista mediante PowerShell


Requisito: Restablecer todos los permisos personalizados en todos los documentos de una biblioteca de documentos de SharePoint Online.

De forma predeterminada, los permisos se heredan de sus padres en todos los niveles de SharePoint. Por ejemplo, los subsitios heredan permisos de su colección de sitios principal (o sitio principal), las listas y bibliotecas heredan permisos del sitio y los elementos de la lista heredan permisos de la lista. Por lo tanto, si realiza algún cambio en los permisos a nivel principal, cualquier hijo que se encuentre debajo hereda automáticamente los cambios de permisos que realizó en el nivel principal, a menos que el hijo esté usando sus propios permisos únicos.

En ocasiones, es posible que tengas que configurar permisos únicos a nivel granular y, por supuesto, es posible que también tengas que restablecer los permisos rotos.

¿Cómo eliminar permisos únicos en SharePoint?

Para restablecer permisos personalizados en documentos o elementos de lista de SharePoint, siga estos pasos:

  1. Navegue hasta la biblioteca de SharePoint donde se almacenan sus documentos.
  2. Haga clic derecho en el documento y elija "Administrar acceso" en el menú.

  3. Haga clic en el enlace "Avanzado" en la parte inferior del panel "Administrar acceso" >> y haga clic en el botón "Eliminar permisos únicos" de la cinta. ¡Confirma el mensaje una vez!

Muy bien, ahora los permisos están configurados en Heredado de la biblioteca principal del documento. Pero espera, seleccionar cada documento individual y repetir estos pasos para eliminar permisos únicos es tedioso, ¿no te parece? Entonces, escribí este script de PowerShell para restablecer la herencia rota en todos los elementos de una lista de SharePoint.

¿Cómo me deshago del acceso limitado en SharePoint online?
Acceso limitado significa que el usuario tiene acceso a un objeto subyacente. P.ej. Si proporciona un permiso único a un documento, en el nivel de la biblioteca de documentos, el usuario específico tendrá "Acceso limitado". Proporciona al usuario un permiso limitado para acceder al elemento al que tiene acceso. Si desea eliminar el acceso limitado, debe eliminar el permiso único sobre los elementos a los que tiene acceso el usuario.

PowerShell para eliminar permisos únicos de un elemento de lista de SharePoint Online:

Necesita el SDK de cliente de SharePoint Online instalado en su máquina cliente para usar este código: https://www.microsoft.com/en-us/download/details.aspx?id=42038. Aquí se explica cómo eliminar todos los permisos únicos en el elemento de la lista de SharePoint Online


#Load SharePoint CSOM 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"

#Function to remove unique permissions and inherit from the parent
Function Remove-ListItemUniquePermissions
{
param
    (
        [Parameter(Mandatory=$true)] [string] $SiteURL,
        [Parameter(Mandatory=$true)] [string] $ListName,
        [Parameter(Mandatory=$true)] [string] $ItemID        
    )

    Try {
        $Cred= Get-Credential
        $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)

        #Setup the context
        $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
        $Ctx.Credentials = $Credentials

        #Remove unique permissions and reset inheritance
        $List=$Ctx.Web.Lists.GetByTitle($ListName)
        $ListItem=$List.GetItemByID($ItemID)
        $ListItem.ResetRoleInheritance()
        $Ctx.ExecuteQuery()

        Write-Host "Unique Permissions are removed and inherited from the Parent!" -ForegroundColor Green
    }

    Catch {
        write-host -f Red "Error Deleting Unique Permissions!" $_.Exception.Message
    } 
}

#Parameters
$SiteURL="https://crescent.sharepoint.com"
$ListName="Projects"
$ItemID="25"

#Call the function to remove unique permissions from a list
Remove-ListItemUniquePermissions -SiteURL $SiteURL -ListName $ListName -ItemID $ItemID 

Secuencia de comandos de PowerShell para eliminar permisos únicos para todos los elementos de la lista en SharePoint Online

Aquí está SharePoint Online PowerShell para restablecer permisos únicos:


#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"
  
##Variables for Processing
$SiteUrl = "https://crescent.sharepoint.com/sites/Sales/"
$ListName= "Documents"
$UserName= "Salaudeen@crescent.com"
$Password ="Password goes here"
 
#Setup Credentials to connect
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName,(ConvertTo-SecureString $Password -AsPlainText -Force))
 
#Set up the context
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl) 
$Context.Credentials = $credentials
  
#Get the List
$List = $Context.web.Lists.GetByTitle($ListName)
 
#Get All List Items
$Query = New-Object Microsoft.SharePoint.Client.CamlQuery
$ListItems = $List.GetItems($Query)
$Context.Load($ListItems)
$Context.ExecuteQuery()

Write-host "Total Items Found:"$ListItems.Count
#Iterate through each list item
 $ListItems |  foreach {
    #Delete Unique Permission
    $_.ResetRoleInheritance()
 }
$Context.ExecuteQuery()

Write-host "Broken Permissions are Deleted on All Items!" -ForegroundColor Green

Podemos hacer dos mejoras al script anterior:

  1. El script anterior no maneja listas grandes con > 5000 elementos.
  2. El script anterior simplemente restablece la herencia sin verificar si el elemento de la lista tiene permisos únicos.

Entonces, resolvamos los problemas anteriores y aquí está el script actualizado:

Eliminar permisos únicos en SharePoint Online usando PowerShell

Aquí está el PowerShell para restablecer permisos únicos en listas grandes o bibliotecas de documentos (¡con más de 5000 elementos!)


#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"

##Variables for Processing
$SiteUrl = "https://crescent.sharepoint.com"
$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 = "<View Scope='RecursiveAll'><RowLimit>2000</RowLimit></View>"

#Batch process list items - to mitigate list threshold 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)
    {
        $ListItem.Retrieve("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

PnP PowerShell para eliminar permisos únicos de todos los elementos de una lista

Para restablecer los permisos en un elemento de la lista, podemos usar el cmdlet Set-PnPListItemPermission con el modificador "InheritPermissions".


#Set Variables
$SiteURL = "https://crescent.sharepoint.com/sites/Marketing"
$ListName = "Documents"
 
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)

#Get all list items in batches
$ListItems = Get-PnPListItem -List $ListName -PageSize 500

#Iterate through each list item
ForEach($ListItem in $ListItems)
{
    #Check if the Item has unique permissions
    $HasUniquePermissions = Get-PnPProperty -ClientObject $ListItem -Property "HasUniqueRoleAssignments"
    If($HasUniquePermissions)
    {        
        $Msg = "Deleting Unique Permissions on {0} '{1}' at {2} " -f $ListItem.FileSystemObjectType,$ListItem.FieldValues["FileLeafRef"],$ListItem.FieldValues["FileRef"]
        Write-host $Msg
        #Delete unique permissions on the list item
        Set-PnPListItemPermission -List $ListName -Identity $ListItem.ID -InheritPermissions 
    }
}

Restablecer permisos únicos para todos los archivos en una carpeta usando PnP PowerShell

Esta vez, usemos PnP PowerShell para restablecer permisos únicos en todos los archivos almacenados en una carpeta de SharePoint Online:


#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/Marketing"
$FolderServerRelativeURL = "/sites/Marketing/Branding/2018"

#Connect to the site
Connect-PnPOnline -Url $SiteURL -Interactive

#Get the Folder from given URL
$Folder = Get-PnPFolder -Url $FolderServerRelativeURL -Includes ListItemAllFields.ParentList
$ParentList = $Folder.ListItemAllFields.ParentList.Title

#Get All Files from the Folder
$Files = Get-PnPListItem -List $ParentList -FolderServerRelativeUrl $Folder.ServerRelativeUrl | Where {$_.FileSystemObjectType -eq "File"}

#Traverse through each file in the folder
ForEach ($File in $Files)
{
    #Check If File has Unique Permissions
    $HasUniquePermissions = Get-PnPProperty -ClientObject $File -Property HasUniqueRoleAssignments
    If($HasUniquePermissions)
    {
        #Reset Broken Inheritance
        $File.ResetRoleInheritance()
        $File.update()
        Invoke-PnPQuery
        Write-Host "Reset Unique Permissions on File $($File.FieldValues["FileRef"])" -ForegroundColor Green
    }
}

De manera similar, puede restablecer permisos únicos en sitios, listas y carpetas de SharePoint Online con PowerShell como:

  • SharePoint Online: eliminar permisos únicos de una lista o biblioteca de documentos mediante PowerShell
  • SharePoint Online: eliminar permisos únicos de todas las carpetas de una biblioteca de documentos mediante PowerShell
  • SharePoint Online: restablecer todos los permisos únicos de una colección de sitios mediante PowerShell

Artículos relacionados