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.
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
Afdelingnulstilles 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æseogBidrage, ikkeReadogContribute. BreakRoleInheritance($true)lukker ikke mappen ned.$truekopierer 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.