当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] SharePoint Online:使用 PowerShell 向文件夹中的所有文件授予权限

作者:精品下载站 日期:2024-12-14 21:12:57 浏览:15 分类:玩电脑

SharePoint Online:使用 PowerShell 向文件夹中的所有文件授予权限


要求:授予对 SharePoint Online 文件夹中所有文件的权限。

[玩转系统] SharePoint Online:使用 PowerShell 向文件夹中的所有文件授予权限

PowerShell 设置文件夹中每个文件的权限

管理 SharePoint 中大量文件的权限可能是一项耗时且复杂的任务,尤其是在一次授予或撤消对多个文件的访问权限时。幸运的是,管理员可以使用 PowerShell 脚本来自动化该过程并简化向文件文件夹授予权限的任务。在本教程中,我们将向您展示如何使用 PowerShell 向 SharePoint Online 中的文件夹中的所有文件授予权限。

您是否有一个包含一堆文件的文件夹(或文档库),并且每个文件都有唯一的权限,并且您想一次向所有文件授予权限?当然,这是执行此操作的 PowerShell 脚本:


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\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="[email protected]"
$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 向 SharePoint Online 中文件夹中的所有文件授予权限:

这次,我们借助 PnP PowerShell cmdlet Set-PnPListItemPermission 授予对 SharePoint Online 库中文件夹中所有文件的访问权限。以下是如何向 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 = "[email protected]"
$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)
}

您还可以使用 cmdlet Set-PnPFolderPermission 设置文件夹的权限。要从文件夹中递归获取所有文件,只需使用 Get-PnPFolderItem cmdlet 的“-Recursive”开关即可。

结论

通过使用 PowerShell 脚本,管理员可以自动执行向 SharePoint Online 中的文件授予权限的过程,从而快速轻松地管理大量文件。向文件夹中的所有文件授予权限只需几分钟即可完成,从而节省了管理员时间并降低了手动错误的风险。总之,使用 PowerShell 向 SharePoint Online 中文件夹中的所有文件授予权限是管理用户访问的一种高效且有效的方法。无论您是处理少量文件还是包含数百个文件的大型文件夹,此过程都可以自动化,以便快速轻松地进行批量更改。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯