Edgar Maucourant - Expert / Formateur SharePoint

Aller au contenu | Aller au menu | Aller à la recherche

samedi 19 mai 2012

Erreur lors de la création d'une connexion pour la synchro des profiles

Bonjour à tous,

Imaginons que vous souhaitiez synchroniser votre magasin de profils (User Profile Application ou UPA) avec votre Active Directory (AD), vous allez alors recourir à la création d'une connexion pour synchroniser vos annuaires dans SharePoint via FIM (ForeFront Identity Manager). Cependant au moment de la création de votre connexion vous recevez le message suivant :

err_synch_conn.png

Et le message donné dans les Logs ne vous aidera pas beaucoup plus.

Il existe un nombre important de raisons pour lesquelles vous recevez ce message, en voici quelques unes :

  • Le compte utilisé pour la synchro n'a pas les bons droits
  • Certains affirment que le compte de synchro doit être administrateur de la machine qui fait la synchro (je n'ai pas constaté ce point)
  • Vous n'avez pas appliqué les patchs : KB 2475880 et 2475878
  • Des objets non-conformes sont présents dans votre A.D.

Dans mon cas rien de tout ça n'a fonctionné, heureusement il existe une autre raison bien plus simple : le nom de votre connexion ne respecte pas la convention de nommage !

En effet, après avoir cherché sur le net et testé de nombreuses "solutions" différentes, je me suis rendu compte que le nom de ma connexion contenait un accent et une apostrophe qui sont tous les deux interdits dans le nom de la connexion.

Evidemment, c'est toujours après avoir trouvé la solution que l'on trouve des posts s'y rapportant, comme celui-ci : http://danmyhre.wordpress.com/2011/02/12/error-unable-to-process-create-message/

Bref avant de vous lancer dans des modifications (parfois farfelues) de votre ferme, vérifiez que vos noms de connexion soient simples !

Bon code à tous, Edgar

vendredi 11 mai 2012

Les 3 règles d'or pour toutes personnes travaillant avec SharePoint

Bonjour à tous,

Cela fait quelques temps maintenant que je souhaite écrire ce post, le temps m'a manqué, mais aujourd'hui je me lance !

De mes pérégrinations dans le monde magique de SharePoint, j'ai pu au fil du temps établir 3 règles qui me semble indispensable pour chaque personne travaillant sur SharePoint. Il s'agit là bien évidemment d'un sentiment personnel lié à ma propre histoire avec ce produit, cependant j'ai expérimenté ces règles sur plusieurs types de profils lors de mes formations, coaching, etc... et je dois dire qu'elles se révèlent très souvent efficaces !

Ces règles sont valables pour tous profils : expert, consultant, architecte, développeur, administrateur, gestionnaire de sites, commercial, chef de projet, et même l'utilisateur occasionnel ! J'espère qu'elle pourront vous permettre de mieux appréhender cet plate-forme.

Les règles sont classées par ordre d'importance, les explications sont données en suivant :

  • Règle n°1 : Avec SharePoint, ne jamais présumer.
  • Règle n°2 : Avec SharePoint, Google (ou Bing) n'est pas toujours ton ami, ni la MSDN ni le Technet.
  • Règle n°3 : Avec SharePoint, se méfier de ses expériences passées

Voici à présent pour chaque règle, une explication plus détaillée de mon propos.

Règle n°1 : Avec SharePoint, ne jamais présumer

Lorsque l'on débute avec SharePoint, ou lorsque l'on aborde un sujet nouveau (il y en a toujours, même pour les experts), on est tenté de ce dire que telle ou telle action ou fonctionnalité doit agir comme ceci ou comme cela. De mon expérience la plupart des fois où j'ai raisonné ainsi mes présomptions se sont révélées fausses ou partiellement fausses. Je pourrais mettre en cause ma manière de raisonner ou mes capacités intellectuelles, mais d'autres ont eu le même résultat que moi, peut-être sommes-nous tous nuls, mais j'en doute :) Toute personne ayant déjà travaillé avec cet outil sait à quel point la logique utilisée dans SharePoint est... floue. Parfois cela est dû à l'organisation interne du produit et en creusant on comprend le pourquoi du problème en surface, parfois on se demande si le produit n'a tout simplement pas été codé avec les pieds... (Au moins en partie).

Règle n°2 : Avec SharePoint, Google (ou Bing) n'est pas toujours ton ami, ni la MSDN ni le Technet.

Internet est une révolution, personne ne le niera, c'est une mine d'or incroyable d'expériences échangées, de bugs remontés, d'explications et d'entraide. Cela a révolutionné notre manière de travailler. Ainsi aujourd'hui n'importe quel informaticien qui rencontre un problème et qui dispose d'Internet à proximité va faire une recherche sur Google (ou Bing) pour trouver une réponse ou au moins un peu d'aide. Sauf que dans le cas de SharePoint ce n'est pas forcément la meilleure idée. On trouve en effet beaucoup de bêtises à son sujet sur Internet, des informations fausses, des informations partielles où l'on a omis la partie problématique de la solution, des méthodes qui relève franchement de la bidouille et d'autres qui s'appuie sur des mauvaises pratiques... Même des sources d'information supposées "sûres" ne le sont pas, ainsi la MSDN et le Technet, bien qu'améliorés, ont encore des pages de documentation fausses, ou ambiguës. Il est par exemple possible de rencontrer des articles contradictoires où l'un préconise telle action alors que l'autre indique de ne pas le faire. Ou bien des articles dans lequel les tournures de phrases masquent une difficulté du produit (ex : quid de la sauvegarde à chaude de la base de configuration ?)

Règle n°3 : Avec SharePoint, se méfier de ses expériences passées

SharePoint est un outil complexe, parce que vaste, il couvre un nombre important de fonctionnalités et de cas d'usage. De cette richesse survient un soucis : la multiplicité des cas "similaires" mais pas identiques. Ainsi lorsque l'on réfléchis à un problème sur cet outil, il faut se méfier de ses expériences passées, car ce qui a fonctionné dans tel cas ne fonctionnera pas forcément dans tel autre. Par exemple des fonctions disponibles dans le site de publication, ne le sont pas dans le site d'équipe, pire les comportements diffèrent entre le site vide et le site d'équipe qui sont pourtant basés sur la même définition. De même ce qui fonctionnait en SharePoint 2007, n'est peut être plus valable en SharePoint 2010 ou seulement en partie. Ainsi quand vous développez ce qui fonctionne sur un site racine peut ne pas fonctionner dans un sous-site, ou dans un site contenu sous un chemin managé. Avant de vous aventurer sur les chemins tortueux du chiffrage SharePoint garder cela à l'esprit...

J'espère que ces règles pourront vous aider dans votre travail avec cette plate-forme. Il n'existe à mon sens qu'un moyen de pouvoir contourner les problèmes suggérés par ces règles : Tester, tester et retester. Cela peut paraître simpliste et "puriste" mais si vous vous aventurez à parler d'un sujet que vous ne connaissez pas dans SharePoint sans avoir ces règles à l'esprit, vous risque au mieux de vous planter, au pire de passer pour un vaniteux incompétent en fonction des personnes que vous aurez en face de vous ;)

Bon code à tous
Edgar

dimanche 4 mars 2012

SharePoint 2007 (et 2010 ?) : suppression d'un serveur de BDD impossible

Bonjour à tous,

Imaginons que vous n'ayez pas installé votre ferme SharePoint selon les bonnes pratiques, et qu'au lieu d'utiliser un alias SQL Server vous ayez directement saisi le nom du serveur pour la création des services (c'est ballot mais c'est courant...).

Imaginons maintenant que vous souhaitiez refaire les choses bien et que vous recréiez les services avec un alias (c'est un bon consultant ça ! oh oui un bon consultant...).

Il est probable qu'ensuite vous souhaitiez supprimer le serveur de BDD référencé dans la section "Servers in farm".

Sage décision, le ménage ça fait toujours du bien (ma femme m'a obligé à mettre cette phrase...), cependant lorsque vous cliquez pour supprimer le serveur vous obtenez le message suivant :


An object in the SharePoint administrative framework, "SPDatabaseServiceInstance Name=NOMINSTANCE Parent=SPServer Name=NOMSERVEUR", could not be deleted because other objects depend on it. Update all of these dependants to point to null or different objects and retry this operation. The dependant objects are as follows :

Grosso modo, il existe des objets dépendant de celui-ci, et SharePoint ne peut pas le supprimer. Cependant la section listant les objets concernée est vide !! (Bizarre ça ne m'étonne même plus, je dois être trop habitué à SharePoint...)

Après un rapide tour sur Internet, vous trouvez un certain nombre de posts qui vous encouragent à aller faire une requête sur la base de données pour voir les objets dépendants et à les supprimer, par exemple : http://www.mylifeinaminute.com/2008/07/23/manually-removing-servers-in-moss-2007/

Pas de chance, cette requête ne retourne rien... On aurait pu s'en douter puisque c'est sûrement la même requête qui a été utilisée dans le message d'erreur ci-dessus.

En allant un peu plus loin vous pourriez tomber sur un post comme celui-ci : http://www.jeremytaylor.net/2010/01/09/sharepoint-moss-shared-services-ssp-delete-unprovisioning/ qui vous encourage à supprimer directement les objets par l'utilisation de STSADM, ce qui semble plus propre mais revient au même : la suppression d'une ligne directement dans la base. Pas de chance là également car l'exécution de cette commande vous renvoie exactement le même message que précédemment...

Dans votre quête de connaissance, vous continuez à chercher et tombez sur ce post : http://sharepointwillem.blogspot.com/2010_06_01_archive.html. Cette fois-ci on va encore plus loin dans le risque pour modifier temporairement la structure de la base de données SharePoint....(L'aaaaaamour du risque, Jonathan et Jennifer... tout ça, tout ça)


STOP !!!!


Bon honnêtement, là j'ai pas pu, je me suis dit qu'il devait y avoir un autre moyen... Et en regardant les contraintes de clés étrangères que le post précédent expliquait comment faire sauter (tout en disant qu'il ne faut pas le faire :o/), je me suis rendu compte qu'il y avait une autre forme de dépendance plus implicite (parce que non indiquée dans la table "dependencies") : la relation Parent / Enfant. En effet les tables des Objets SharePoint donne pour chaque objet quel est l'id de son parent (dont il dépend donc).

J'ai donc fait une recherche rapide sur les objets dont le parent est mon instance SQL Server (après avoir récupéré son Id), et j'ai trouvé le problème : la base de données du service de recherche d'aide WSS était encore stockée sur cette instance... Après avoir redéployée ma base de données du service de recherche d'aide via mon alias, j'ai pu supprimer ma référence de serveur sans soucis...

Ce cas illustre encore une fois le risque de suivre les actions données sur Internet, surtout si celles-ci vont à l'encontre des bonnes pratiques : on ne doit pas toucher aux bases SharePoint !!! Microsoft ne supporte même pas les requêtes SELECT sur ces bases, il ne s'agit donc pas juste de modifier la base, mais rien que lire les données de cette base en dehors des API SharePoint n'est pas supporté... Notez que pour SharePoint 2010 il me semble avoir lu que MS supporte la lecture, mais toujours pas évidemment l'écriture en direct dans les bases (sauf peut-être celle de logging, à vérifier)


Bon code à tous,
Edgar


Note : les plus perspicaces d'entre-vous se seront rendu compte que ma requête pour retrouver les objets parent n'est donc pas supportée... Gardez cela à l'esprit si vous suivez cette démarche (bon en même temps je ne pense pas que cela gêne quoi que ce soit sur la table Objects...).

mardi 21 février 2012

SharePoint, PowerPivot, Datafeed & erreur 401

Bonjour à tous,

Dans PowerPivot, vous pouvez utiliser un flux Atom en tant que source de données pour une table. Si vous souhaitez exposer votre fichier PowerPivot dans SharePoint, il est nécessaire de disposer d'un ficheir ".atomsvc" accessible au travers d'un répertoie partagé ou d'une url accessible (par exemple une bibliothèque SharePoint). Si ce fichier n'est pas accessible au service PowerPivot il ne sera alors pas possible de rafraîchir les données du cube PowerPivot.

Le Problème

C'est ici que votre erreur 401 intervient. En effet il est possible que lors du rafraîchissement programmé du cube, l'erreur suivante apparaisse :


Errors in the high-level relational engine. The following exception occurred while the managed IDbConnection interface was being used: The remote server returned an error: (401) Unauthorized.. A connection could not be made to the data source with the DataSourceID of '48ffbe38-adeb-48ae-a20d-b32a99b03ebb', Name of 'List_Name'. An error occurred while processing the 'TableName' table. The operation has been cancelled.

Après avoir vérifié que vous avez accès à la liste indiquée, que votre compte de rafraîchissement (PowerPivotDataRefresh) a accès à la liste, que le compte PowerPivotDataRefresh et vous avez accès aux fichiers ".atomsvc" concernés, vous êtes sur le point de menacer votre serveur de le priver de courant s'il n'optempère pas sur le champ...

La solution

Mais il y a toujours une solution plus douce... En effet si vous avez installé votre instance PowerPivot selon les recommandations Microsoft, vous devriez avoir séparé les comptes de services pour chaque service (hormis l'application de service PowerPivot sur SharePoint qu'il est recommandé de faire tourner avec le compte système de la ferme). Vous devriez donc avoir en plus de votre compte de rafraîchissement des données, un compte pour le moteur "analysis service vertipaq". Un rapide coup d'oeil avec NetMon vous indiquera que c'est le compte de ce service qui nécessite l'accès aux fichier ".atomsvc" et vous envoie une erreur 401 s'il n'a pas les autorisations pour cela.

Donc pour que cette erreur "401" disparaisse n'oubliez pas de donner accès aux fichiers ".atomsvc" au compte exécutant le moteur AS de PowerPivot. Et rebranchez-moi cette prise....

Bon code à tous,
Edgar

mardi 31 janvier 2012

SharePoint 15 arrive... Enfin le SDK pour le moment

Bonjour à tous,

Tous les SharePointeurs de la planète s'attendent à une sortie de la prochaine version de SharePoint dans le courant de cette année (au moins en CTP ou Beta). Et Microsoft semble confirmer ceci car ils viennent de mettre en ligne le SDK de la Tech preview de SharePoint 15, vous pourrez le télécharger ici :

http://www.microsoft.com/download/en/details.aspx?id=28768&

Bon code à tous, Edgar

dimanche 8 janvier 2012

Meilleurs voeux pour cette nouvelle année !

Bonjour,

Toute l’équipe NFTInside se joint à moi pour vous souhaiter une excellente année 2012 qui vous apportera, nous l’espérons, santé, bonheur, et prospérité.

C’est l’occasion pour moi également de faire comme chaque année une rétrospective de l’évolution de NFTInside (pour la première fois sur ce blog !).


2011 aura été pour nous l’année du changement.

Tout d’abord changement de stratégie, après avoir longtemps œuvré seul ou en partenariat, j’ai décidé de donner à cette société la possibilité de mieux travailler et de mieux servir ses clients, par le recrutement de 4 consultants SharePoint. Changement de statut également, par augmentation du capital de la société à 40 000 €, ce qui nous permet aujourd’hui de travailler avec des clients que nous n’aurions pas pu rencontrer précédemment. Changement de lieu enfin, puisque nous avons à présent des locaux parisiens situés 57 rue d’Amsterdam dans le 8ème arrondissement de Paris. Nous avons également mis en place un site internet où vous pouvez retrouver l’ensemble des prestations que nous mettons en œuvre : http://www.nftinside.com.

Tous ces changements traduisent notre volonté de figurer parmi les acteurs qui comptent pour l’écosystème « SharePoint » français, nous souhaitons ainsi pouvoir conserver et même augmenter notre niveau d’expertise sur ce produit afin de toujours mieux vous conseiller et vous accompagner dans la mise en œuvre, la gestion, la formation, et la personnalisation de cet outil.


Si 2011 fut l’année du changement, 2012 ne manquera pas non plus d’évolutions !

Nous prévoyons le recrutement de 6 consultants supplémentaires, ainsi que le dévoilement de produits & solutions pour SharePoint confectionnés sur la base de vos besoins et notre expérience. Avec l’arrivée probable d’une nouvelle version SharePoint dans le courant de cette année (au moins en bêta), nous ne serons pas trop de 10 pour analyser, décortiquer et tirer le meilleur des nouveautés que cette nouvelle mouture ne manquera pas de nous apporter.

NFTInside c’est 100% SharePoint, 100% Service, 100% Satisfaction…

Je vous souhaite une nouvelle fois une excellente année 2012, qu'elle soit source de prospérité !

Edgar Maucourant

dimanche 11 septembre 2011

Ajouter une PJ à un élément de liste par modèle objet client dans SharePoint 2010

Bonjour à tous,

Ceux qui l'ont déjà expérimenté le savent bien, il y a des choses que le modèle objet client de SharePoint 2010 sait faire à merveille et d'autres qui semblent avoir complètement été oubliées, y compris les plus basiques....

Comme vous l'aurez compris au titre de ce post, l'une d'elles est la possibilité d'ajouter une pièce jointe à un élément de liste. Il semble que Microsoft n'est pas envisagé ce cas, ou que pour des raisons obscures ils ne l'aient pas implémenté.

Qu'à cela ne tienne, voici deux méthodes pour les ajouter, une n'est utilisable que si vous avez déjà au moins une pièce jointe attachée à votre élément, l'autre est utilisable tout le temps mais fait référence aux WebServices de SharePoint...


Première méthode :

Cette méthode ne fonctionne que si le répertoire contenant les pièces jointes de l'élément existe déjà, sinon vous recevrez une erreur "409 : Erreur de conflit"

Vous remarquerez au passage que Microsoft n'a toujours pas amélioré son système de message d'erreur. D'un point de vue développeur il ne s'agit pas d'un conflit mais de l'absence du répertoire pour stocker la pièce jointe.

Le seul moyen que ce répertoire existe est que vous ayez ajouté une ou plusieurs pièces jointes à votre élément, soit par l'interface utilisateur, soit par le deuxième méthode ci-dessous.

Ne cherchez pas à créer ce répertoire, j'ai testé toutes les méthodes que j'ai pu trouvé sur Internet et aucune ne fonctionne pour créer un sous-répertoire dans le répertoire "Attachments" de la liste. Il semble que ce soit un comportement confirmé par Microsoft...


string uploadLocation = string.Format("{0}/Lists/{1}/Attachments/{2}/{3}", webName, listName, itemId, Path.GetFileName(fileName));
Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, uploadLocation, fileStream, true);


Dans ce code :

  • webName est le nom (url) du site Web,
  • listName est le nom (url) de la liste,
  • itemId est l'Id (int) de l"élément sur lequel ajouter la pièce jointe,
  • filename est le nom de la pièce jointe,
  • clientContext représente le context client pour le site web contenant la liste,
  • enfin fileStream correspond au contenu du fichier représenté sous forme de stream.

Deuxième méthode :

Cette méthode fonctionne à tous les coups mais nécessite de faire une référence web au webservice de liste de SharePoint.


ListsWebService.Lists listsWS = new ListsWebService.Lists();
listsWS.UseDefaultCredentials = true;
byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer,0,(int)fileStream.Length);
fileStream.Close();
listsWS.AddAttachment(listName, itemId.ToString(), fileName, buffer);

Dans ce code :

  • ListsWebService et le nom de la classe proxy vers le webservice de listes de SharePoint (http://urldevotresite/_vti_bin/lists.asmx),
  • fileStream représente le contenu de la pièce jointe sous forme de Stream,
  • listName est le nom de la liste,
  • enfin itemId correspond à l'ID (int) du listitem auquel ajouter la pièce jointe.

Bonus :

Aller parce que je suis sympa (les fleurs sont pas chers en ce moment), je vous donne la méthode complète pour ajouter l'élément de liste et la première pièce jointe. La petite difficulté vient du fait que lors de l'ajout de l'élément à la liste, l'ID de celui n'est pas connu et qu'il est nécessaire de le recharger ensuite pour le connaître.


using (ClientContext clientContext = new ClientContext(siteUrl))
{
   var list = clientContext.Web.Lists.GetByTitle(listName);
   clientContext.Load(list);
   ListItemCreationInformation itemInformation = null;
   ListItem listItem = list.AddItem(itemInformation);
   listItem["Nom"] = Nom;
   listItem["Prenom"] = Prenom;
   listItem["email"] = Email;
   listItem.Update();
   clientContext.ExecuteQuery();
   CamlQuery query = new CamlQuery();
   query.ViewXml = @"
         <Query>
            <Where>
               <And>
                  <And>
                     <Eq>
                        <FieldRef name="Nom" />
                        <Value type="Text">" + Nom + @"</Value>
                     </Eq>
                     <Eq>
                        <FieldRef name="Prenom" />
                        <Value type="Text">" + Prenom + @"</Value>
                     </Eq>
                  </And>
                  <Eq>
                     <FieldRef name="email" />
                     <Value type="Text">" + Email+ @"</Value>
                  </Eq>
               </And>
            </Where>
         </Query>
      </View>";
   var refreshedItem = list.GetItems(query);
   clientContext.Load(refreshedItem);
   clientContext.ExecuteQuery();
   if (refreshedItem.Count != 1)
   {
      // TODO Manage Error
   }
   if (!string.IsNullOrEmpty(fileName) && fileStream.Length > 0)
      {
         ListsWebService.Lists listsWS = new ListsWebService.Lists();
         listsWS.UseDefaultCredentials = true;
         byte[] buffer = new byte[fileStream.Length];
         fileStream.Read(buf,0,(int)fileStream.Length);
         fileStream.Close();
         listsWS.AddAttachment(listName, refreshedItem[0].Id.ToString(), fileName, buffer);
      }
}


Bon code à tous ! Edgar

samedi 13 août 2011

Le site www.nftinside.com est en maintenance

Bonjour à tous,

Un opération de maintenance sur notre infrastructure serveur, nous oblige à arrêter temporairement le site www.nftinside.com pour une durée ne devant pas excéder 4 heures.

Edgar Maucourant

dimanche 7 août 2011

SharePoint 2007&2010 : Limite de taille de fichier qui ne fonctionne pas en mode explorateur ?

Bonjour à tous,

Vous est-il déjà arrivé de sombrer lentement dans la folie à l'utilisation de SharePoint ? (Si vous répondez non c'est que vous ne l'utilisez pas depuis assez longtemps :p).

Cela pourrait bien vous arriver si un jour vous modifier la taille maximum d'un fichier pouvant être téléchargé dans SharePoint (au niveau de la Web Application) mais que ce comportement ne semble pas être pris en compte lorsque vous travaillez en mode Explorateur... Après avoir vérifié la configuration de votre SharePoint maintes fois, vous commencez à vous demandez si la vie vaut encore la peine d'être vécue... Quand tout à coup, vous avez l'éclair de génie (ouais bon il aura fallut du temps mais saluons tout de même votre pugnacité) : Si le problème ne vient pas du serveur c'est qu'il vient du client !

Eurêka !

En effet, le WebClient notamment utilisé par l'explorateur client en mode WebDav limite par défaut les fichiers transférable à environ 50 000 000 Bytes soit approximativement 47 Mo. Pour modifier cela il faut depuis l'ordinateur utilisant le mode explorateur (et non le serveur), modifier une clé de registre pour augmenter la taille maximum supportée. Pour cela :

  • Ouvrir Regedit
  • Aller dans le dossier : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters
  • Faire un clic droit sur le fichier : FileSizeLimitInBytes
  • Passer en mode décimal et saisir votre valeur en octects ! (Valeur Max : 4294967295 soit 4 Go).
  • Valider votre saisie et fermer Regedit
  • Redémarrer le service WebClient (en utilisant la console de services Windows)
  • Fermer puis réouvrir tout explorateur Windows

Et voilà vous pouvez à présent transférer des fichiers de la taille maximum indiquée ou de celle fixée dans SharePoint (suivant celle qui est la plus petite).

Bon code à tous

Edgar

mercredi 6 juillet 2011

Le Blog fait peau neuve...

Bonjour à tous,

Afin d'accompagner le changement opéré depuis plusieurs mois au sein de la structure NFTInside (recrutement et constitution d'une équipe de consultants permanents), nous avons décidé de nous doter d'un site Internet. En attendant la mise en ligne de celui-ci prévue pour la fin de la semaine, j'ai mis à jour le design du blog pour refléter celui du futur site (une sorte d'avant-goût ;)). N'hésitez-pas à me laisser un commentaire pour me dire ce que vous en pensez !

Bon code à tous, Edgar

- page 1 de 5