Búsqueda de sitios web

SharePoint Online: conceder permiso a todos los archivos de una carpeta mediante PowerShell


Requisito: Conceder permiso a todos los archivos de una carpeta en SharePoint Online.

PowerShell para establecer permisos para cada archivo en una carpeta

Administrar los permisos de una gran cantidad de archivos en SharePoint puede ser una tarea compleja y que requiere mucho tiempo, especialmente cuando se trata de otorgar o revocar el acceso a varios archivos a la vez. Afortunadamente, los administradores pueden utilizar scripts de PowerShell para automatizar el proceso y simplificar la tarea de otorgar permisos a una carpeta de archivos. En este tutorial, le mostraremos cómo otorgar permisos a todos los archivos en una carpeta en SharePoint Online usando PowerShell.

¿Tiene una carpeta (o biblioteca de documentos) con varios archivos y cada archivo tiene permisos únicos y desea otorgar permiso a todos los archivos a la vez? Claro, aquí está el script de PowerShell para hacer eso:


#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 Grant-ListItemPermission
{
    param
    (   
        [Parameter(Mandatory=$true)] [string]$ItemID
    )
    Try {       
        #Get the List and Item
        $List = $Ctx.Web.Lists.GetByTitle($ListName)
        $ListItem=$List.GetItemByID($ItemID)
        $Ctx.Load($List)
        $Ctx.Load($ListItem)
        $Ctx.ExecuteQuery()
 
        #Check if Item has unique permission already
        $ListItem.Retrieve("HasUniqueRoleAssignments")
        $Ctx.ExecuteQuery()
 
        #Break Item's permission Inheritance, if its inheriting permissions from the parent
        if (-not $ListItem.HasUniqueRoleAssignments)
        {
            $ListItem.BreakRoleInheritance($True, $false) #keep the existing permissions: Yes -  Clear listitems permissions: No
            $ctx.ExecuteQuery()
        }
 
        #Get the User
        $User = $Ctx.Web.EnsureUser($UserID)
        $Ctx.load($User)
        $Ctx.ExecuteQuery()
 
        #Get the role 
        $Role = $Ctx.web.RoleDefinitions.GetByName($PermissionLevel)
        $RoleDB = New-Object Microsoft.SharePoint.Client.RoleDefinitionBindingCollection($Ctx)
        $RoleDB.Add($Role)
          
        #Assign permissions
        $UserPermissions = $ListItem.RoleAssignments.Add($User,$RoleDB)
        $ListItem.Update()
        $Ctx.ExecuteQuery()
     
        Write-host -f Green "Permission granted to List Item successfully!"
    }
    Catch {
        Write-host -f Red "Error granting permission to List Item!" $_.Exception.Message
    }
}

Function Get-AllFilesFromFolder
{
    param
    (   
        [Parameter(Mandatory=$true)] [string]$FolderRelativeURL
    )
   Try {     
        #Get the Folder and Files
        $Folder=$Ctx.Web.GetFolderByServerRelativeUrl($FolderRelativeURL)
        $Ctx.Load($Folder)
        $Ctx.Load($Folder.Folders)
        $Ctx.Load($Folder.Files)
        $Ctx.ExecuteQuery()
 
        #Iterate through each File in the folder
        Foreach($File in $Folder.Files)
        {
            #Get Name for each File
            Write-Host ("Granting '{0}' Permission to User {1} on {2} at {3}" -f $PermissionLevel, $UserID, $File.Name, $File.ServerRelativeUrl)
            
            #Get the Properties of the File
            $Ctx.Load($File.ListItemAllFields)
            $Ctx.ExecuteQuery()
 
            #Call the function to grant permission to file
            Grant-ListItemPermission -ItemID $File.ListItemAllFields.Id
        }
        #Recursively process sub-folders
        ForEach($SubFolder in $Folder.Folders | Where{($_.Name -ne "Forms") -and (-Not($_.Name.StartsWith("_")))})
        {
           Get-AllFilesFromFolder $SubFolder.ServerRelativeUrl
        }
    }
    Catch {
        write-host -f Red "Error Getting Files from Folder!" $_.Exception.Message
    }
}

#Set parameter values
$SiteURL="https://crescent.sharepoint.com/Sites/Marketing"
$ListName = "Documents"
$FolderRelativeURL = "/Sites/Marketing/Shared Documents"
$UserID="salaudeen@crescent.com"
$PermissionLevel="Edit"

#Get Credentials to connect
$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

#Call the function to process all files in a folder
Get-AllFilesFromFolder -FolderRelativeURL $FolderRelativeURL

PnP PowerShell para otorgar permiso a todos los archivos en una carpeta en SharePoint Online:

Esta vez, otorguemos acceso a todos los archivos de una carpeta en la biblioteca de SharePoint Online con la ayuda del cmdlet PnP PowerShell Set-PnPListItemPermission. A continuación se explica cómo otorgar permiso único a una carpeta en SharePoint Online:


#Set Variables
$SiteURL = "https://crescent.sharepoint.com/sites/Marketing"
$ListName="Documents"
$ParentFolderURL = "/Shared Documents/2018" #Site Relative Path of the document Library
$UserAccount = "Salaudeen@crescent.com"
$Role = "Edit"
 
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)

#Get all Files from the Folder
$AllFiles = Get-PnPFolderItem -ItemType File -FolderSiteRelativeUrl $ParentFolderURL

#Iterate through each File in the Folder
ForEach($File in $AllFiles)
{
    #Grant permissions to the File
    Set-PnPListItemPermission -List $ListName -Identity $File.ListItemAllFields -User $UserAccount -AddRole $Role
    Write-host ("Granted Permission to '{0}' at {1} " -f $File.Name,$File.ServerRelativeUrl)
}

También puede utilizar el cmdlet Set-PnPFolderPermission para establecer permisos en una carpeta. Para obtener todos los archivos de forma recursiva de la carpeta, simplemente use el interruptor "-Recursive" en el cmdlet Get-PnPFolderItem.

Conclusión

Al utilizar scripts de PowerShell, los administradores pueden automatizar el proceso de concesión de permisos a archivos en SharePoint Online, lo que hace que administrar grandes cantidades de archivos sea rápido y sencillo. Se pueden otorgar permisos a todos los archivos de una carpeta en cuestión de minutos, lo que ahorra tiempo a los administradores y reduce el riesgo de errores manuales. En conclusión, usar PowerShell para otorgar permisos a todos los archivos en una carpeta en SharePoint Online es una forma eficiente y efectiva de administrar el acceso de los usuarios. Ya sea que se trate de una pequeña cantidad de archivos o de una carpeta grande con cientos de archivos, este proceso se puede automatizar para realizar cambios masivos de forma rápida y sencilla.

Artículos relacionados