Columns Hidden and SharePoint Crawl

Le moteur de recherche de SharePoint n’indexe pas les colonnes Hidden.
Un moyen de contournement est possible, il consiste à conserver vos colonnes Hidden à false (donc de les rendre visibles) et d’utiliser à la place les propriétés :

  • ShowInDisplayForm= »false »
  • ShowInEditForm= »false »
  • ShowInListSettings= »false »
  • ShowInNewForm= »false »
  • ShowInVersionHistory= »false »
  • ShowInViewForms= »false »

Ainsi, elles ne seront pas visibles de l’interface utilisateur, mais le moteur de recherche pourra les indexer 🙂

 

Damien NOBLET.

Utilisation des métadonnées dans les recherches SharePoint

Explication

Il est possible d’utiliser le moteur de recherche et d’utiliser comme critère les métadonnées.

Exemple : Recherche des documents avec l’auteur (métadonnée Créé par) dnoblet.

Il est possible de configurer le moteur de recherche afin d’effectuer un requête avec n’importe quelle métadonnée.

Création d’un type de contenu

Partons d’un type de contenu qui utilise une métadonnée gérée.

 Ajouter ce type de contenu sur une de vos bibliothèques.

 Ajouter un document qui utilise ce type de contenu et ajouter une information sur la métadonnée.

Paramétrage du moteur de recherche

Rendez-vous sur l’application de service de recherche de la Centrale d’Administration.

Lancer manuellement une analyse.

Une fois l’analyse terminée, rendez-vous sur les Propriétés des métadonnées

Cliquer sur Nouvelle propriété gérée

Indiquer un nom à cette métadonnée gérée par le moteur de recherche

Ajouter un mappage sur la métadonnée créée dans le type de contenu. Attention, le nom de la métadonnée est le nom interne donc les caractères et espaces sont encodés et le tout est préfixé par « ows_ ».

Relancer manuellement une analyse.

Vous pouvez d’ores et déjà utiliser la propriété gérée dans la recherche.

Paramétrage du centre de recherche

Nous allons maintenant, modifier le centre de recherche afin que la nouvelle métadonnée gérée soit disponible dans la recherche avancée.

Rendez-vous sur votre centre de recherche.

Ouvrir la page de recherche avancée.

Modifier la page, puis modifier les paramètres du composant WebPart

Copier tout le texte (format XML)

Ouvrir SharePoint Designer, créer un nouveau fichier du type XML.

Coller le texte, faire un clic droit et sélectionner Remettre en forme le code XML

Rajouter les deux lignes (PropertyDef et PropertyRef)

Copier le texte, puis coller le dans les propriétés du composant WebPart de recherche avancée.

Vous pouvez maintenant exploiter pleinement votre métadonnée dans la recherche.

A quoi sert « le site de personnalisation » sous SharePoint

Nous allons voir ensemble, comment tirer parti du modèle de site de personnalisation de SharePoint.

Tout d’abord posez-vous la question suivante : comment puis-je récupérer du contenu de mon intranet SharePoint dans les MySites ?

Et oui, vous êtes dans ce cas sur 2 collections de site différentes. Donc pas de possibilité de positionner un composant WebPart sur le MySite qui requête vers l’Intranet (hormis développement spécifique).

Cet article vous permettra de répondre à cette problématique sans le moindre développement.

Création du site de personnalisation

Positionnez-vous sur la collection de site de votre Intranet et lancer la création d’un site en vous appuyant sur le modèle « site de personnalisation ».

Vous devez donc avoir une structure de site similaire à celle-ci-dessous.

Le site créé ressemble étrangement aux MySites (même MasterPage), vous allez comprendre pourquoi 😉

Le site fait partie intégrante de votre collection de site Intranet, vous pouvez donc modifier la page d’accueil de celui-ci et y ajouter le composant WebPart Requête de contenu afin de récupérer n’importe quel élément de la collection de site.

Vous remarquerez que par défaut 2 composants WebPart de filtre sont positionnés, nous ne les utiliserons pas dans cet article.

Ajout des liens de site dans les mysites

Vous ne l’avez peut-être encore jamais réalisé, mais il est possible de positionner des liens en haut des MySites.

L’ajout de ces liens est réalisé depuis l’application de service de profil utilisateur.

Nous allons donc rajouter un nouveau lien qui va pointer sur le site créé précédemment.


Note : L’ajout des liens peut être « audiencé ».

Le résultat est le suivant.

L’utilisateur aura donc l’illusion d’avoir une page de son MySite qui lui permet de visualiser du contenu de l’Intranet 😉 . Je parle d’illusion car vous l’avez compris le site de personnalisation est bien dans la collection de site de l’Intranet et en aucun cas dans le MySite.


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

Composant WebPart Exchange

Je viens de créer un projet sur le portail de développement communautaire made in Microsoft (CodePlex).
Voici le lien qui vous mènera sur le projet Exchange WebPart.

Il existe une version pour SharePoint 2007 (MOSS 2007 et WSS 3.0) et une pour SharePoint 2010

Le fonctionnement est très simple, la vue par défaut indique le nombre de messages non lus.

Le lien « Voir les messages » permet de consulter un aperçu des emails.

Il est possible de marquer un message commu lu pour ne plus l’afficher dans le composant WebPart.

Le WebPart utilise les fichiers de ressources (fichier .resx) et utilise donc la langue du site SharePoint comme moyen de détection. Français et Anglais uniquement pour l’instant.

J’oubliai le WebPart est compatible Exchange 2007 SP1 et Exchange 2010 car j’utilise l’API EWS (Exchange Web Service).

N’hésitez pas à laisser des commentaires ou à proposer des traductions supplémentaires.

kOuilb 😉

PRA SharePoint à base de Log Shipping

Bonjour,

Aujourd’hui, je vous propose de me suivre au travers de la configuration d’un PRA SharePoint se basant sur la technologie SQL de Log Shipping.

Pour cela, il est nécessaire de disposer de deux fermes SharePoint (une principale et une de secours).

Le but de la manipulation est de dupliquer les webapps SharePoint sur les deux fermes et de mettre à jour les bases de contenu de la ferme secondaire via le processus de Log Shipping.

Cet article reprend les concepts du technet suivant http://technet.microsoft.com/en-us/library/dd890507.aspx.

Soit l’architecture suivante :

Noter que seules les bases de contenus sont « Log Shippées » (un peu de franglais).

Nous partons du contexte suivant :

  •  Ferme 1 composée d’un frontal et d’un serveur de bases de données
  • Ferme 2 composée d’un frontal et d’un serveur de bases de données (dans mon cas un cluster SQL, cela ne change aucunement le processus)
  • Une webapp de contenu SharePoint sur la ferme 1

 Nous avons donc une base de données de contenu qui se trouve sur la ferme 1, nous allons donc commencer par la « log shippée » sur le serveur de base de données de la ferme 2

Mise en place du log shipping

Lancer SQL Management Studio et connectez-vous à vos deux serveurs SQL.

La base de contenu sur laquelle nous allons travailler est WSS_Content du serveur CHAURRAY-SQL (srv SQL de la ferme 1)

Faîtes un clic droit sur la base, puis dans la section « Tâches » cliquer sur « Envoyer les journaux de transactions.. »

Commencer par cocher la case « Activer en tant que base de données primaires dans une configuration de la copie des journaux de transactions » (Attention, il est nécessaire que la base de données soit dans un mode de récupération Complet)

Ensuite planifier l’intervalle et l’emplacement des sauvegardes.

Il est maintenant nécessaire de configurer les bases secondaires, dans notre cas une seule base.

 

Connectez-vous au serveur SQL de la ferme 2, puis indiquer le nom de la base de données à créer ou à utiliser sur ce serveur.

Sélectionner le mode de génération de cette base (nouvelle sauvegarde complète ou sauvegarde existante).

Dans l’onglet « Copier les fichiers », indiquer un répertoire partagé de serveur SQL de la ferme 2. Et planifier le Job de copie des logs (transfert des logs du serveur primaire au serveur secondaire).

Dans le dernier onglet « Restaurer le journal des transactions », sélectionner le mode Veille et cocher la case « Déconnecter les utilisateurs … »

La base secondaire sera dans un état de vieille et en lecture seule et nous allons pouvoir attacher cette base de données à une webapp de la ferme 2. L’ensemble de la webapp sera bien évidemment en lecture seule.

Cliquer sur OK pour valider la configuration de cette base de données secondaire.

Terminer la configuration en cliquant sur le bouton OK, la sauvegarde complète de la base commence, suit la restauration sur le serveur secondaire.

Vous avez une nouvelle base sur le serveur SQL de la ferme 2.

Pour résumer, le serveur primaire effectue une sauvegarde de sa base et cela créé des journaux de transaction.

Le serveur secondaire rapatrie ces journaux, puis joue les journaux sur une de ses bases afin de reconstituer cette base.

L’ensemble de ce travail est réalisé par des jobs SQL qui sont eux-mêmes lancé par les agents SQL.

Il est donc nécessaire que l’identité du service SQL Agent ait les droits sur les répertoires utilisés lors de ces jobs.

Création de la webapp de secours sur la ferme 2

Nous disposons maintenant d’une base de contenu sur notre ferme de secours qui se rafraîchit selon la planification indiquée dans l’étape précédente.

Nous allons donc utiliser cette base de contenu sur une webapp de la ferme de secours.

Commencer par créer une nouvelle webapp sur la ferme secondaire en réutilisant le même hostheader (même URL) que la webapp de la ferme 1.

Lors de la création de cette webapp, une base de données de contenu a été créée. Nous allons supprimer cette base de contenu et ajouter (attacher en terme SharePoint) la base de contenu « log shippée ».

Pour cela rendez-vous dans la gestion des bases de contenu.

La capture ci-dessus est issue de SharePoint 2010, l’interface est quasi similaire sous MOSS 2007.

Sélectionner la bonne webapp, puis cliquer sur la base de contenu existante.

Cocher la case supprimer la base de contenu puis cliquer sur le bouton OK.

Cliquer ensuite sur le lien Add a content database, nous allons donc attacher notre base log shippée.

 

Nous avons donc maintenant deux webapps accessible par la même URL (dans mon cas http://CHAURRAY-WFE) sur deux fermes distinctes avec le même contenu (seulement un delta dù à l’intervalle du log shipping).

Dans le cadre d’un PRA seule une ferme est interrogée (1 ferme active et 1 ferme passive de secours), mais pour tester la ferme de secours nous allons modifier le fichier HOSTS afin de forcer l’interrogation de la ferme secondaire.

Pour cela, ouvrez votre fichier HOSTS (C:\Windows\System32\drivers\etc\hosts) et ajouter une entrée du type 172.16.1.1 CHAURRAY-WFE    

CHAURRAY-WFE indique le hostheader renseigné pour la webapp et l’adresse IP doit être celle du serveur frontal de la ferme de secours.

Lancez votre naviguateur et essayer l’URL.

Vous accédez au même contenu mais l’ensemble de la webapp est en lecture seule. Je vous rappelle que vous interrogez la base log shippée qui est en lecture seule (ferme 2).

Attention les personnalisations effectuées sur la ferme 1 (ajout de solutions SharePoint, ajout de thèmes, etc..) doivent impérativement être rejouée sur la ferme 2.

Depuis une autre station, rendez-vous sur cette même URL le contenu est en lecture / écriture donc vous interrogez la ferme 1.

Ajouter un document dans une bibliothèque de document, dons depuis la ferme 1. Puis attendez le temps que les jobs de log shipping soit relancé. Le document apparaît sur la ferme 2.

Bacule sur la ferme de secours

Le but d’un PRA est en cas de crash complet d’une salle info de pouvoir remonter l’architecture sur un autre salle info éloignée de plusieurs kilomètres. Oui cela ne sert pas à grand chose d’avoir deux salles serveur côte à côte en cas de feux ou de catastrophe naturelle les deux salles sont inutilisables.

Donc une ferme SharePoint sur chaque site. Mettons nous dans le cas où notre site primaire est injoignable. Nous avons bien notre site de secours qui est disponible.

Faut-il encore rediriger les utilisateurs sur cette ferme de secours. Le moyen le plus simple est de modifier l’enregistrement DNS action manuelle, il est possible d’automatiser cette manipulation via des boitiers du type RADWARE où autre.

Ok nos utilisateurs accèdent donc à notre ferme de secours. 

  Petit problème le contenu est en lecture seule, il faut donc réactiver la base de données log shippée pour qu’elle soit en lecture écriture. Rappel : à cet instant le log shipping ne fonctionne plus puisque la ferme 1 est injoignable.

Le principe pour « réactiver » une base de données en vieille / lecture seule (warm standby) est de la restaurer avec la commande with recovery.

Pour nous éviter tout problème, nous allons prendre l’accès exclusif sur la base avant de la restaurer.

Les commandes sont les suivantes :

ALTER DATABASE « nom de ma base » SET SINGLE_USER WITH ROLLBACK IMMEDIATE

 RESTORE DATABASE « nom de ma base » WITH RECOVERY

 ALTER DATABASE « nom de ma base » SET MULTI_USER WITH ROLLBACK IMMEDIATE

Afin d’automatiser cette bascule je vous ai concocté un script powershell. Le jour où la ferme 1 tombe, l’état de stress vous enlèvera une partie de vos facultés intélectuelle, plus les choses seront documentées et automatisées mieux ce sera.

param (
  [string] $SQLSERVER,
  [string] $Database
)
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = « Server=$SQLSERVER;Database=$DATABASE;Integrated Security=True »
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = « USE MASTER ALTER DATABASE $DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE RESTORE DATABASE $DATABASE WITH RECOVERY ALTER DATABASE $DATABASE SET MULTI_USER WITH ROLLBACK IMMEDIATE »
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]

Copier le texte ci-dessus dans un fichier nommé basculeLogShipping.ps1

Attention il est nécessaire d’autoriser l’éxécution de script PowerShell sur le serveur SQL de secours, voici la commande :

set-ExecutionPolicy unrestricted

Vous pouvez maintenant éxécuter le script comme ceci basculeLogShipping.ps1 « CLUSTERSQL » « WSS_Content_LOGSHIPPED »

C’est la fin de cet article.

Merci d’avoir lu jusqu’au bout.

Damien => Kouilb

%d blogueurs aiment cette page :