Mise à jour de masse de niveau de permission (SPRoleDefinition)

March 09, 2012

J’ai été confronté à la demande suivante : sur un ensemble de site (des mysites en l’occurrence), un niveau d’autorisation personnalisé est défini par code lors de la création (Mysite Owner).

Une évolution a nécessité la modification de ce niveau d’autorisation pour ajouter la possibilité de créer des groupes.

La mise à jour du code créant le mysite est triviale, il aura suffi d’ajouter la permission. Mais qu’en est-il des sites déjà créés ?

La solution est assez simple. Le script Powershell suivant remplira ce rôle :

Param(
    [Parameter(Mandatory=$true)]
    [string]$url
    )

Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0

$mySites = Get-SPSite -WebApplication $url -Limit All | ? { $_.RootWeb.WebTemplate -Match "SPSPERS" }

$mySites | % {
    $site = new-object Microsoft.SharePoint.SPSite($_.Url)
    $web = $site.OpenWeb()
    $perm = $web.RoleDefinitions["MySite owner"]
    $current = [Microsoft.SharePoint.SPBasePermissions]$perm.BasePermissions
    if($perm.BasePermissions -Band [Microsoft.SharePoint.SPBasePermissions]::CreateGroups)
    {
        Write-Host "Not required for $_"
    }
    else {
        $perm.BasePermissions = $current -Bor [Microsoft.SharePoint.SPBasePermissions]::CreateGroups
        $perm.Update()
        Write-Host "Permission added for $_" -Foreground Green
    }

    $web.Dispose()
    $site.Dispose()
}

Write-Host "Press any key to exit" -NoNewLine
Read-Host

Ce script attend en entrée l’url de l’application Web hébergeant les sites mysites. Il va ensuite énumérer les collections de site de type mysite (template SPSPERS).

Il ajoute enfin, si nécessaire, la nouvelle permission.