Voici un bel exemple de ce que l'on peut faire avec PowerShell

Merci à Nicolas Schmitt qui m'a transmis cet exemple.

Introduction :

Comme parler à SharePoint via Powershell :

  • Charger la DLL SharePoint :
    • [Void][System.Reflection.Assembly]::LoadWithPartial      Name("Microsoft.SharePoint")
  • Utiliser les API .Net de SharePoint comme si vous étiez en C# (ou VB ou tout autre langage .Net). Par exemple, ouvrir un objet SPSite :
    • $site = New-Object Microsoft.SharePoint.SPSite($siteurl)
  • A la fin du script, ne pas oublier de libérer les objets SharePoint, par exemple :
    • $site.Dispose();

Exemple de script

Pour illustrer ce que l’on peut faire avec PowerShell et SharePoint, voici un script qui permet de créer des groupes et des utilisateurs dans un site SharePoint. La liste des groupes et des utilisateurs est passée en paramètre dans 2 fichiers CSV.

Ceci est assez pratique, en particulier lors des tests d’intégration, lorsque l’on supprime et recrée souvent des collections de sites.

Ce script prend en paramètre :

  • L’url du site où l’on va importer les groupes et utilisateurs
  • Un fichier CSV contenant les groupes

o 3 colonnes : nom du groupe, permission, propriétaire du groupe (si vide, on prend l’utilisateur courant)

  • Un fichier CSV contenant les utilisateurs à importer

o 2 colonnes : login de l’utilisateur, groupe dans lequel positionner l’utilisateur (facultatif)

Exemple d'utilisation :

powershell ./ImportGroupsAndUsers.ps1 http://team –userfile Users.csv

Principales fonctions utilisées :

ipcsv $groupfile | foreach { Write-Host $_.GroupName } : Importe un fichier CSV, et affiche la colonne « GroupName » de chaque ligne

$spuser = $web.EnsureUser($user) : crée un utilisateur dans le site

          $web.SiteGroups.Add($group, $owner, $null, "") : Crée un groupe dans le site

Le script complet est en attachement, ça donne cela :

param (
    [string] $siteurl = "",
    [string] $userfile = "",
    [string] $groupfile = ""
)

if ($siteurl -eq "")
{
    $siteurl = Read-Host "Site url";
}

[Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint");

Write-Host -ForegroundColor green "Opening SharePoint site...";

$site = New-Object Microsoft.SharePoint.SPSite($siteurl)
$web = $site.RootWeb;

if ($groupfile -ne "")
{
    Write-Host -ForegroundColor green "Importing groups from $groupfile";
    ipcsv $groupfile | foreach {
        $group = $_.GroupName;
        $perm = $_.Permissions;
        $owner = $_.Owner;
        if ($owner -eq "") { $owner = $web.CurrentUser.LoginName }
        Write-Host -ForegroundColor green "  $group (owner = $owner, perm = $perm)"
        $exists = $web.SiteGroups | where { $_.Name -eq $group }
        if ($exists -eq $null)
        {
            # Create group
            $web.SiteGroups.Add($group, $web.EnsureUser($owner), $null, "");
            # Give permissions to the group
            $assign = New-Object Microsoft.SharePoint.SPRoleAssignment($web.SiteGroups[$group]);
            $assign.RoleDefinitionBindings.Add($web.RoleDefinitions[$perm])
            $web.RoleAssignments.Add($assign)
        }
        else
        {
            Write-Host -ForegroundColor magenta "    already exist"
        }
    }
}

if ($userfile -ne "")
{
    Write-Host -ForegroundColor green "Importing users from $userfile";
    ipcsv $userfile | foreach {
        $user = $_.User
        $group = $_.Group
        Write-Host -ForegroundColor green "  $user -> $group"
        # Add user to the web
        $spuser = $web.EnsureUser($user);
        # Add user to group
        if ($group -ne "")
        {
            $web.SiteGroups[$group].AddUser($spuser);
        }
    }
}

$site.Dispose();
Write-Host -ForegroundColor green "Done.";