Spring til indholdet

Sæt mapperettigheder ud fra metadata med PowerShell

Et script til SharePoint on-premises, der går alle mapper i et bibliotek igennem og giver afdelingens gruppe adgang ud fra en kolonne på mappen.

Opdateret PowerShellAdgangsstyringSharePoint 2013 3 min. læsning

Et dokumentbibliotek med kontrakter, hvor hver mappe hører til en afdeling. Afdelingen står i en kolonne på mappen, og det er afdelingens gruppe, der skal have adgang. Så længe mapperne er få, sættes rettighederne i hånden. Når de bliver mange, og folk retter i metadata, halter rettighederne efter.

Det her script går alle mapperne igennem, nulstiller rettighederne og sætter dem igen ud fra kolonnen Afdeling. Det er skrevet til SharePoint 2013 on-premises og kører på serveren med SharePoint-snap-in’et. Mod SharePoint Online virker det ikke.

Sådan virker det#

  • For hver mappe med en værdi i Afdeling nulstilles arven.
  • Gruppenavnet bygges som præfiks plus afdeling. Findes gruppen, får den læseadgang til mappen. Findes den ikke, skriver scriptet det med rødt.
  • To undtagelser: afdelingen Investering får desuden en særskilt gruppe med bidrage-rettigheder, og mapper med Område = Licens giver IT-gruppen læseadgang.
 1
 2Add-PSSnapin Microsoft.SharePoint.PowerShell
 3################################################################################
 4##
 5## Author:  <forfatter>
 6## Purpose: Set permissions for alle folders in "http://<server>/sites/<websted>/Kontrakter" based on metadata
 7##
 8################################################################################
 9
10# Variables
11$SiteURL = "http://<server>/sites/<websted>/"
12$ListName = "Kontrakter"                
13$GroupName="<Gruppepræfiks> - "
14
15# Get site, List objects and permissionlevels
16$web = Get-SPWeb $SiteURL
17$list = $web.Lists.TryGetList($ListName)
18$roleRead = $web.RoleDefinitions["Læse"]
19$roleContribute = $web.RoleDefinitions["Bidrage"]
20
21if ($list -ne $null)
22{ 
23   $Foldercoll=$List.Folders | Sort-Object Name
24 
25    #Loop through each Item in the List
26    foreach($folder in $Foldercoll)
27    {
28        # If Afdeling is not empty
29        if(($folder['Afdeling'] -ne $null))
30        {
31            #if($folder['Afdeling'] -ne "IT"){
32                $folder.ResetRoleInheritance()
33            #}
34           
35                if($folder.HasUniqueRoleAssignments -eq $false)
36                {
37                   $SPGroupName = $GroupName + $folder['Afdeling']
38                   #Grant Unique Access
39                   if($folder['Afdeling'] -eq "Investering")
40                   {
41                       $group = $web.SiteGroups["<Gruppepræfiks> - Investering - bidrage"]
42                       #Get Contribute permissionlevel
43                        $RoleAssignment = New-Object Microsoft.SharePoint.SPRoleAssignment($group)
44                        $RoleAssignment.RoleDefinitionBindings.Add($roleContribute)
45
46                        $folder.BreakRoleInheritance($true)
47                        $folder.RoleAssignments.Add($RoleAssignment)
48                        $folder.SystemUpdate();
49
50                        Write-Host "Successfully added the permission: Bidrage to the SPGroup: '$SPGroupName' in the folder '$($Folder.Name)'" -foregroundcolor Green
51                   }
52                   if($folder['Område'] -eq "Licens")
53                   {
54                       $group = $web.SiteGroups["<Gruppepræfiks> - IT"]
55                       #Get Contribute permissionlevel
56                        $RoleAssignment = New-Object Microsoft.SharePoint.SPRoleAssignment($group)
57                        $RoleAssignment.RoleDefinitionBindings.Add($roleRead)
58
59                        $folder.BreakRoleInheritance($true)
60                        $folder.RoleAssignments.Add($RoleAssignment)
61                        $folder.SystemUpdate();
62
63                        Write-Host "Successfully added the permission: Må læse to the SPGroup: '$SPGroupName' in the folder '$($Folder.Name)'" -foregroundcolor Green
64                   }
65                        # Get the Group from GroupName Parameter
66                        $group = $web.SiteGroups["$SPGroupName"]
67                        # If Goup Name matches Afdeling
68                        if($group.Name -eq $SPGroupName)
69                        {
70                            #Get Permission Level, such as "Read", "Contribute", etc
71                            $RoleAssignment = New-Object Microsoft.SharePoint.SPRoleAssignment($group)
72                            $RoleAssignment.RoleDefinitionBindings.Add($roleRead)
73                     
74                            #Grant Access to specified Group
75                            $folder.BreakRoleInheritance($true)
76                            $folder.RoleAssignments.Add($RoleAssignment)
77                            $folder.SystemUpdate();
78                            Write-Host "Successfully added the permission: Må læse to the SPGroup: '$SPGroupName' in the folder '$($Folder.Name)'" -foregroundcolor Green
79                        }else
80                        {
81                            Write-Host "Could not add any group to the folder: '$($Folder.Name)'. Group and Afdeling do not match" -foregroundcolor Red
82                            Write-Host "Group.Name: '$($group.Name)'"
83                            Write-Host "SPGroupName: '$SPGroupName'"
84                        }
85                }
86            }
87    }
88}

Det der driller#

  • Rettighedsniveauer slås op på navn, og navnet følger webstedets sprog. På et dansk websted hedder de Læse og Bidrage, ikke Read og Contribute.
  • BreakRoleInheritance($true) lukker ikke mappen ned. $true kopierer de rettigheder, mappen arvede, og gruppen lægges oven i. Mappen kan altså stadig ses af alle, der kan se biblioteket. Skal kun gruppen have adgang, skal det være $false.
  • Undtagelsen for IT er kommenteret ud (#if ... #}), så i den her udgave nulstilles alle mapper med en afdeling, også IT’s.
  • Investering får to grupper. Efter den særlige bidrage-gruppe kører den almindelige blok også, og findes gruppen <præfiks> - Investering, får den læseadgang oveni.
  • SystemUpdate() gemmer ændringen uden at røre Modified og Modified By, så mapperne ikke ser redigerede ud, bare fordi rettighederne blev sat om.

Alle noter