Import des photos dans les profils SharePoint 2010

SharePoint 2010 comme 2007 d’ailleurs permet d’identifier les utilisateurs grâce à une photo. Celle-ci est inscrite dans le profil de l’utilisateur.

Beaucoup d’entreprises disposent d’une base de photos des utilisateurs. Il est donc intéressant de pouvoir faire un import en masse de ces photos dans les profils SharePoint.

Le but de cet article, vous l’aurez compris, sera de mettre à jour les profils des utilisateurs via un script.

Alors c’est parti !

Créer un fichier texte mais avec l’extension .ps1 (Powershell)

Copier/coller le texte ci-dessous dans votre fichier. Vous pouvez également télécharger le script depuis le lien fourni en bas de page.

#---------------------------------------------------------------------------------
# Default Values
#---------------------------------------------------------------------------------
$spNotFoundMsg = "Unable to connect to SharePoint.  Please verify that the site '$PortalURL' is hosted on the local machine.";
#-----------------------------------------------------# Load Assemblies
#-----------------------------------------------------
if ([Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") -eq $null)		{ throw $spNotFoundMsg; }
if ([Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server") -eq $null)	{ throw $spNotFoundMsg; }#-----------------------------------------------------

# Functions
#-----------------------------------------------------
function ToSimpleString([string]$value, [bool]$trim = $true, [bool]$removeSpaces = $true, [bool]$toLower = $true)
{
	if ($value -eq $null) {
		return [System.String]::Empty; }
	if ($trim)
	{
		$value = $value.Trim();
	}
	if ($removeSpaces)
	{
		$value = $value.Replace(" ", "");
	}
	if ($toLower)
	{
		$value = $value.ToLower();
	}
	return $value;
}

function GetSPSite($url)
{
	[Microsoft.SharePoint.SPSite]$site = New-Object "Microsoft.SharePoint.SPSite" -ArgumentList $url
	return $site;
}

function GetSpContext($url)
{
	[Microsoft.SharePoint.SPSite]$site = GetSPSite -url $url
	return [Microsoft.Office.Server.ServerContext]::GetContext($site);
}

function GetProfileManager($url)
{
	[Microsoft.Office.Server.ServerContext]$ctx = GetSpContext -url $url
	[Microsoft.Office.Server.UserProfiles.UserProfileManager]$upm = New-Object "Microsoft.Office.Server.UserProfiles.UserProfileManager" -ArgumentList $ctx
	return $upm;
}
function GetProfilePropertyName($userProfileManager, $propertyName)
{
	$propertyName = (ToSimpleString -value $propertyName);
	$propertyName = $propertyName.Replace("sps-", "");
	foreach($prop in $userProfileManager.Properties)
	{
		[string]$n = (ToSimpleString -value $prop.DisplayName);
		$n = $n.Replace("sps-", "");
		if ($propertyName -eq $n) {
			return $prop.Name.ToString(); }
		$n = (ToSimpleString -value $prop.Name);
		$n = $n.Replace("sps-", "");
		if ($propertyName -eq $n) {
			return $prop.Name.ToString(); }
	}
	return $null;
}

function Set-UserPictures([string] $PortalURL, [string] $UserFile, [string] $Domain )
{
	Import-Csv $UserFile | foreach-object {
		$upm = GetProfileManager -url $PortalURL;
		$name=$Domain + "\" + $_.LoginName;
		Write-Host $name;
		$up = $upm.GetUserProfile($name);
		$picturePropertyName = GetProfilePropertyName -UserProfileManager $upm -PropertyName "PictureUrl";

		if (-not [System.String]::IsNullOrEmpty($picturePropertyName))

		{
			$PortraitUrl = $PortalURL + $_.Picture;
			Write-Host $PortraitUrl;
			$up[$picturePropertyName].Value = $PortraitUrl;
			$up.Commit();
		}
	}
}

Le principe du script est relativement simple, à partir d’un fichier CSV contenant le login de l’utilisateur et le nom de la photo correspondante, le script va chercher la fiche profil de l’utilisateur.
Puis récupérer la propriété correspondant à l’image du profil.
Enfin, il écrit le chemin où se trouve les photos dans la propriété de profil.
Le tour est joué.

Donc vous allez avoir besoin d’un fichier CSV de la forme :

 LoginName,Picture
 dnoblet,dnoblet.jpg
 cdurand,cdurand.jpg
 

Il est nécessaire de stocker toutes les images dans un lieu accessible du serveur SharePoint.
Quoi de mieux me direz vous, qu’une bibliothèque d’images !

Ajouter l’ensemble de vos images dans cette bibliothèque, le stockage est temporaire.

Maintenant l’appel à la fonction, cette ligne est à ajouter à la fin du fichier.

Set-UserPictures "http://sharepoint/PublishingImages/" "users.csv" "DOMAIN"

3 arguments :

  • Le chemin de la bibliothèque où se trouve les images.
  • Le nom du fichier CSV (chemin ci celui-ci n’est pas dans le répertoire que le script).
  • Le nom de domaine des utilisateurs.

Je lance le SharePoint 2010 Management Shell et lance l’exécution du script.

Le script indique pour chaque ligne du CSV le nom de login de l’utilisateur et le chemin complet vers l’image.

Il est possible de vérifier le bon fonctionnement en allant éditer la fiche profil des utilisateurs.

Rendez-vous pour cela dans l’application de service de profil utilisateur accessible depuis la centrale d’administration.

Cliquer sur le lien « Gérer les profils utilisateurs ».

Rechercher la fiche profil d’un utilisateur et vérifier que l’image est bien en place.

Oops la photo n’est pas retaillée, le travail n’est donc pas terminé.

Lancer la commande suivante, toujours dans le PowerShell :

Update-SPProfilePhotoStore -MySiteHostLocation "http://my/"
Où « http://my » est l’hôte de site monsite
Cette commande va établir 3 images pour chaque profil. Et va les stocker dans la bibliothèque « Photos de l’utilisateur » du MySite.
Bien sur les profils des utilisateurs sont modifiés pour utiliser l’image dans le format adéquat.
Vous savez maintenant comment effectuer un import en masse des photos des utilisateurs dans SharePoint 2010.
Sources:
Note : il est possible que l’invite PowerShell n’autorise pas l’exécution du script, dans ce cas modifier la politique de sécurité en lançant la commande : Set-ExecutionPolicy -ExecutionPolicy unrestricted
kOuilb
Publicités

Export des sites (SPWeb) d’une collection SharePoint (SPSite) en PowerShell

SharePoint 2010 nous offre la possibilité de jouer avec PowerShell pour effectuer les tâches d’administration.

Je vous propose donc un petit script PowerShell pour exporter l’ensemble des sites d’une collection de site.

Commençons tout d’abord par afficher l’ensemble des sites d’une collection.

Rien de plus simple, depuis la console PowerShell SharePoint tapez :

Get-SPWeb -site « http://macollectiondesites »

Les différentes URL’s de vos sites vous sont renvoyées.

Notez que si vous avez de nombreux sous sites la commande ne vous retourne pas l’ensemble des URLs dans ce cas ajouter le commutateur -Limit ALL à votre commande.

Chouette, c’est un bon début. Maintenant nous allons utiliser la fonction ForEach-Object afin d’utiliser chaque URL retournée dans une autre commande.

Get-SPWeb -site « http://macollectiondesites » -Limit ALL | ForEach-Object { }

Le sigle « | » permet d’indiquer d’appliquer une autre commande suite à la première.

Dans les accolades nous allons devoir réaliser deux actions :

  1. Inscrire dans une variable un nom de fichier qui reprend l’url du site.
  2. Effectuer l’export du site à partir des URLs récupérées précédement et du nom de fichier créé

Tout d’abord, comment récupérer les diffrentes URL’s de la précédente commande, tout simplement en utilisant la variable $_.Url

OK, maintenant la commande pour créer un nom de fichier :

$filename = $_.Url.replace(« http:// », » »).replace(« _ », »__ »).replace(« /« , »_ ») + « .cmp »

Une URL du type http://macollectiondesites/mon_soussite/resousite sera transformée en mon__soussite_resousite.cmp parfait pour être utilisé comme nom de fichier.

Suite, la commande d’export d’un site SharePoint (SPWeb) :

Export-SPWeb $_.Url -Path $filename

Rien de compliqué.

Le final, on remet tout ça dans le bon ordre et on obtient :

Get-SPWeb -site « http://macollectiondesites » -Limit ALL | ForEach-Object { $filename = $_.Url.replace(« http:// », » »).replace(« _ », »__ »).replace(« / », »_ ») + « .cmp » ; Export-SPWeb $_.Url -path $filename}

Bien sur vous pouvez mixer la commande Export-SPWeb avec les commutateurs « -includeusersecurity »,  « – includeversions » , etc…

Bon export à tous.

%d blogueurs aiment cette page :