DevOps + SharePoint ?

I think the structure of SharePoint is naturally « DevOps oriented ». Actions to create web applications and configure services through a web interface is a DevOps philosophy ! On standard .NET environnements, such actions require interventions on servers, but SharePoint does this « out-of-the-box ».
But the work of DevOps in a SharePoint environment is not limited to that. In the case of a SharePoint farm hosting several applications, how to ensure that a solution deployment does not impact non-concerned applications ? How to be sure that an application will not be broken by an undisciplined neighbor ?
Because SharePoint is a complex service, the traditional tools of production operators are not sufficient to watch a farm. And on the other hand, development teams should not have to worry about server scalability !
This is the role of DevOps : Being the bridge between developers and production, while maintaining a consistent chain of delivery.
In a future post I will talk about the tools available to the « DevOps SharePoint ».
This is my view about what a « DevOps SharePoint » shoud be :

How to "DevOps" SharePoint ?
How to « DevOps » SharePoint ?

Traduction française :
Je pense que la structure même de SharePoint est orientée DevOps. Les actions de création d’applications web et de configuration de services au travers d’une interface web est une philosophie DevOps ! Ce genre d’actions nécessiteraient des interventions sur les serveurs, mais ici c’est SharePoint qui contrôle cela « out-of-the-box ».
Mais le travail du DevOps dans un environnement SharePoint ne se limite pas à cela. Dans le cas d’une ferme SharePoint qui hébergeraient plusieurs applications autonomes, comment garantir qu’un déploiement de solution n’impacte pas des applications non concernées ? Comment être sûr qu’une application ne soit pas impactée par le développement du voisin ?
Parce que SharePoint est un service complexe, les outils classiques des opérateurs / exploitants de production ne suffisent pas à gérer une ferme. Mais d’un autre côté, les équipes de développement n’ont pas à se soucier de l’évolutivité (scalability) des serveurs !
C’est là le rôle du DevOps : Faire le pont entre dev et prod, tout en maintenant une chaine de livraison cohérente.
Dans un prochain post je parlerais des outils à disposition du « DevOps SharePoint ».

SharePoint 2010 : Workflow d'envoi de mails déclenché par un utilisateur anonyme.

Les utilisateurs anonymes ne sont pas autorisés à déclencher certains flux de travail (workflow), notamment ceux qui envoient des mails.
Prenons l’exemple d’une liste qui déclenche un workflow d’envoi de mail sur l’ajout d’un élément :
Workflow_1
Ici l’envoi de mail sera un échec, car la tâche d’envoi de mail nécessite plus de droit que ne peut avoir un utilisateur anonyme.
Pour remédier à cela, une solution serait de faire déclencher le workflow par un événement tiers :
Workflow_2
Il suffit d’insérer un event-handler qui va prendre en charge l’événement « ajout d’un élément » à la place du workflow, et qui va forcer le démarrage du workflow « à la main ».
Le code de l’event-handler pourrait ressembler à cela :

public class List_EventReceiver : SPItemEventReceiver
{
 /// <summary>
 /// Un élément a été ajouté, on lance le workflow avec privilèges.
 /// </summary>
 public override void ItemAdded(SPItemEventProperties properties)
 {
    base.ItemAdded(properties);

        // Exécution en élévation de privilège
    SPSecurity.RunWithElevatedPrivileges(delegate()
   {
      using (SPSite site = new SPSite("http://mon_site"))
      {
        using (SPWeb siteWeb = site.OpenWeb())
        {
          SPList list = siteWeb.Lists["Ma_Liste"];
          SPWorkflowAssociation wf = list.WorkflowAssociations.GetAssociationByName("Nom_du_Workflow", System.Globalization.CultureInfo.CurrentCulture);
          // Lancement du workflow
          site.WorkflowManager.StartWorkflow(list.GetItemById(properties.ListItemId), wf, wf.AssociationData);
        }
      }
   });
 }
}

SharePoint : Notification mails are not sent

English version

Symptoms : notification mails are not sent (but subscription notifications are).
Diagnosis : There are multiple causes that can be explained here : blogs.technet.com/b/steve_chen. But in my case, it was different.
Solution : Here I’m talking about a very specific case. Consider a farm consisting of 4 servers: 1 SQL Server, 1 admin server, one intranet front-end server and one front-end server in the DMZ for extranet.
What you should know is that shipments of alerts are managed by a single server (as opposed to what we see in « Central Administration> Operations> Timer Job Status »).
To find out which server handles alerts’ shipments, launch this SQL request on any content database :

select * from TimerLock

This query will return a server name : this is the one who sends the alerts.
NB: Unlike subscription mails that – I think – are sent by the administration server.
So for some unknown reason, the Intranet server that manages the sending of these messages has stopped doing it, and suddenly it’s the front DMZ that has taken over. But since he was not at all set up for it (firewall, etc.)., alerts were not sent anymore.
Thus, to assign new shipments alert to the other front, you must disable the service timer on the current one:

NET STOP "Windows SharePoint Services Timer"

And finally, the front intranet will resume over.

Article en français

Symptômes : Les mails d’alerte ne sont plus envoyés (mais les notifications d’abonnement elles, sont bien envoyées).
Diagnostique : Les causes sont multiples. Cet article en parle très bien.
Solution : Ici je vais parler d’un cas bien spécifique. Prenons une ferme composée de 4 serveurs : 1 SQL Server, 1 serveur d’administration, 1 serveur frontal intranet et 1 serveur frontal en DMZ pour l’extranet.
Ce qu’il faut savoir, c’est que les envois d’alertes sont gérés par un seul serveur (contrairement à ce qu’on peut voir dans « Administration centrale > Opérations > Etat du travail du minuteur »). Ceci est bien expliqué ici.
Pour savoir quel serveur gère les envois d’alertes, il faut consulter le verrou actif sur le minuteur :

select * from timerlock

(à lancer sur n’importe quelle BDD de contenu, ou du moins celle dont le site refuse d’envoyer les alertes).
Cette requête va renvoyer un nom de serveur : c’est celui-ci qui s’occupe d’envoyer les alertes.
NB : Contrairement au mail de notification d’abonnement qui – je pense – est envoyé par le serveur d’administration.
Donc pour une raison inconnue, le serveur Intranet qui gérait l’envoi de ces mails a cessé de le faire, et du coup c’est le frontal en DMZ qui a pris le relais. Mais vu qu’il n’était pas du tout configuré pour cela (pare-feu, etc.), les alertes n’étaient plus envoyées.
Ainsi, pour confier de nouveau les envois d’alertes à un l’autre frontal, il faut désactiver le service timer sur celui en cours :

NET STOP "Windows SharePoint Services Timer"

Et finalement, le frontal intranet reprendra le relais.
 

Install and Configure iFilter for SharePoint Foundation 2010

SharePoint Foundation 2010 : Installer et configurer iFilter 9 pour fichiers PDF.
In SharePoint Foundation 2010, these are the steps to make PDF files indexed by the search engine :

  • Install Adobe iFilter 9 for PDF files
  • Copy a PDF icon in %CommonProgramFiles%Microsoft SharedWeb Server Extensions14TEMPLATEIMAGES
  • Add an entry in the Docicon.xml file
  • Modify the registry (twice !)
  • Configure the indexer so that it takes into account the PDF extension (VBS script provided by MS)
  • iisreset

Just follow these two tickets :
http://support.microsoft.com/kb/2293357
http://support.microsoft.com/kb/2518465
You don’t need to install Search Server 2010.
TRADUCTION
Pour que les fichiers PDF soient indexés par le moteur de recherche Foundation 2010, il faut faire les actions suivantes :

  • Installer iFilter 9 fourni par Adobe
  • Copier une icone de fichier PDF dans %CommonProgramFiles%Microsoft SharedWeb Server Extensions14TEMPLATEIMAGES
  • Ajouter une entrée dans le fichier DOCICON.XML
  • Modifier la base de registre (2 fois)
  • Configurer l’indexeur pour qu’il prenne en compte l’extension PDF (script VBS fourni par MS)
  • iisreset

 
Il suffit donc de suivre à la lettre les 2 billets suivants :
http://support.microsoft.com/kb/2293357
http://support.microsoft.com/kb/2518465
Pas besoin d’installer Search Server 2010 !

SharePoint 2010 : Diminuer la durée rétention des données d'utilisation

Better than a Shrink
Voici la commande à passer pour passer à 3 jours de rétention pour les données d’utilisation de la ferme (Console Powershell SharePoint) :
Get-SPUsageDefinition | foreach-Object { Set-SPUsageDefinition -Identity $_.Name -DaysRetained 3 }
Ceci permet de réduire la taille de la base WSS_Logging.

SharePoint (2007/2010) : Echec de l'élévation de privilèges dans un EventReceiver.

Au rez-de-chaussée, c’est ‘.
Dans un EventHandler de ce type (ou d’un autre !) :
public override void ItemAdded(SPItemEventProperties properties){
   SPSecurity.RunWithElevatedPrivileges(delegate()   {
  // Actions nécessitant des privilèges.
});
Dans le code exécuté avec privilèges, il NE FAUT PAS utiliser directement les objets présentés par l’objet properties (.List, .Web, etc.). Il faut retrouver ces objets avec leur ID (.ListID, .SiteID, etc.). Sinon il y a de grandes chance d’avoir des valeurs ‘ ou des exceptions d’accès.
SPSite monSite = new SPSite("url.com");
SPList maListe = monSite.Lists[properties.ListID];
SPItem monItem = maListe.GetItemById(properties.ListItemId);
etc…
 

Serveur SharePoint 2010 : Surcharge de la mémoire

Le bac à sable, pour le garde des sceaux
Symptôme : La RAM atteint une consommation inquiétante (et incrémentielle).
Diagnostic : La multiplication des processus SPUCHostService.exe et SPUCWorker*.exe pollue la mémoire. Ces processus correspondent aux solutions qui fonctionnent en mode “bac à sable”. Cela permet d’exécuter du code utilisateur sans risque pour le processus IIS w3wp.exe.
Solution : Relancer le service “Service de code en mode bac à sable Microsoft SharePoint Foundation” (via l’administration centrale ou Powershell (ci-dessous).
Se connecter au serveur avec le compte d’installation de la ferme.
Lancer une fenêtre POWERSHELL sur le serveur (en tant qu’administrateur), et de lancer les commandes suivantes :
Get-SPServiceInstance | Where-Object {$_.TypeName -like "Service de code en mode bac*"}
Copier la valeur de l’ID affichée, et entrer les commandes suivantes :
Stop-SPServiceInstance -Identity "id_copié_précédemment"
Start-SPServiceInstance -Identity "id_copié_précédemment"
 
Aller plus loin : Déterminer quelle solution en mode bac à sable provoque cette multiplication des processus.

SharePoint : Déplacer une liste / bibliothèque d'un site WSS/MOSS vers SharePoint 2010

  • Enregistrer la liste source en tant que modèle (fichier STP), avec les données.
    • Si la taille des données est trop importante, autoriser exeptionnellement une taille de modèles supérieure : "C:Program FilesFichiers communsMicrosoft Sharedweb server extensions12BINSTSADM.exe" -o setproperty -pn max-template-document-size -pv 52428800
  • Récupérer ce fichier STP.
  • Renommer le fichier en .CAB.
  • Extraire les fichiers.
  • Editer le fichier manifest.xml, et modifier la valeur de <ProductVersion> à 4.
  • ré-empaqueter le(s) fichier(s) dans une archive .CAB :
    • Utiliser makecab.exe si il n’y a qu’un seul fichier (manifest.xml).
    • Utiliser iexpress.exe si il y a plusieurs fichiers.
  • Renommer le fichier en .STP
  • Utiliser ce fichier comme modèle de liste dans le site de destination.

Source

SharePoint : La suppression d'une colonne provoque une "erreur inconnue"

L’un connu, l’autre pas.
Symptôme : Le fait de supprimer la colonne d’une liste provoque une erreur inconnue. La trace est la suivante :
w3wp.exe (0x0AA8) 0x044C Windows SharePoint Services General 8dzz High Exception Type: System.Web.HttpException Exception Message: Unable to validate data.
Diagnotic : Certaines pages systèmes (dans /_layouts/*.aspx) ne supportent pas la présence d’une webpart de recherche dans la page maître. Article détaillé.
Solution : Si la page maître d’application “application.master” contient une webpart de recherche, il faut la supprimer (édition dans un bloc note, puis publication dans la galerie des pages maitres du site).

SharePoint 2010 : Renommer une URL de sous-site et c'est le drame…

Renommer une URL de sous-site provoque une perte des données.
Symptôme : Dans SharePoint 2010, dans “Actions du site > Paramètres du site > Titre”, il est possible de modifier l’URL d’un sous-site. Après la modification, le site devient inaccessible, ou tout son contenu est perdu.
Diagnotic : L’URL donnée au sous-site est déjà utilisée (par une collection de sites par exemple). SharePoint a failli à sa tâche de prévenir l’utilisateur.
Solution : Restaurer la base de données de contenu. Puis au choix : Renommer l’URL du sous-site sous un autre nom. OU (si la collection de site est obsolète) supprimer la collection de sites ET le chemin d’accès géré, et renommer le sous-site comme voulu.