in

didierdanse.net

Site personnel de Didier Danse
Didier Danse's Personnal Website
Microsoft Most Valuable Professional SharePoint

didierdanse.net - Les news Developpement

  • Microsoft TechDays France du 10 au 12 février 2009 à Paris (évènement gratuit)

    23 parcours thématiques, 300 conférences techniques, plus de 140 partenaires experts Microsoft autour de 5 grands thèmes :

    • Découvertes
      Windows 7, Windows Azure, SaaS, Cloud Computing…
    • Architecture et Développement
      Windows Live, SOA, Visual Studio, .NET, Silverlight, Design, Biztalk…
    • Infrastructure et socle applicatif de l'entreprise numérique
      SQL Server, Windows Server, Virtualisation, Microsoft Desktop Optimization Pack, High Performance Computing, Small Business Server, Enterprise Business Server, Sécurité, ERP…
    • Efficacité individuelle et collective
      Poste de travail, Communications Unifiées, Recherche en entreprise, Microsoft PerformancePoint, SharePoint, Office Communications Server, CRM…
    • Enjeux
      Sécurité, Interopérabilité, Accessibilité, Education, Recherche, Programme de licences...

    Site officiel: http://www.microsoft.com/france/mstechdays/

    Inscriptions: http://galilee.microsoft.fr/TechDays2009/Default.aspx

  • SharePoint: Un Web Service intermédiaire pour réaliser des appels à GetListItems de Lists.asmx depuis InfoPath

    Lors d'un appel au Web Service Lists.asmx et plus exactement à la méthode GetListItems, il est souvent nécessaire de passer des paramètres de types XML. Ces paramètres sont mal interprétés, rendant ainsi l'utilisation du Web Service difficile voire impossible.

    Les paramètres XML sont indiqués dans InfoPath sous la forme d'une chaîne de caractères (ceci dit de l'XML, ce n'est jamais que des caractères qui respectent des règles prédéfinies).

    image

    C'est cette chaîne qui, une fois encodée pour être envoyée, n'est plus compréhensible par le Web Service.

    Une fois le problème repéré, des tests montrent que l'appel du Web Service depuis une application .NET se fait sans aucun souci. Sur base de ces informations, une solution s'offre à nous: utiliser un Web Service (écrit en .NET) que l'on déploie au sein de SharePoint afin de générer le message à envoyer de manière correcte.

        <WebMethod()> _
        Public Function GetListItems(ByVal listName As String, ByVal viewID As String, ByVal query As String, ByVal viewFields As String, ByVal rowLimit As String, ByVal queryOptions As String, ByVal webID As String) As XmlNode
            Dim service As SharePointListsWS.Lists = GetWebServiceInstance(webID)
    
            Dim queryElement As XmlNode = CreateNode("Query", query)
            Dim viewFieldsElement As XmlNode = CreateNode("ViewFields", viewFields)
            Dim queryOptionsElement As XmlNode = CreateNode("QueryOptions", queryOptions)
    
            Return service.GetListItems(listName, viewID, queryElement, viewFieldsElement, rowLimit, queryOptionsElement, webID)
    
        End Function
    
        Private Function GetWebServiceInstance(ByVal webID As String) As SharePointListsWS.Lists
            Dim service As New SharePointListsWS.Lists
            service.Credentials = System.Net.CredentialCache.DefaultCredentials
    
            service.Url = SPContext.Current.Web.Url + "/_vti_bin/Lists.asmx"
    
            Return service
        End Function
    
        Private Function CreateNode(ByVal name As String, ByVal innerXml As String)
            Dim document As New XmlDocument
            Dim node As XmlNode = document.CreateElement(name)
            node.InnerXml = innerXml
            Return node
        End Function

    Ce Web Service, après avoir générer du XML valide et compréhensible, passe les paramètres au Web Service Lists.asmx qui, cette fois, pourra interpréter les paramètres en entrée. Les valeurs retournées par celui-ci sont quant à elle directement renvoyées vers le client appelant.

    Ce qu'il vous faut donc savoir pour réaliser ce Web Service intermédiaire:

    • Comment écrire un Web Service;
    • Comment permettre de l'intégrer dans SharePoint;
    • Comment le déployer dans SharePoint.

    Il existe de nombreux articles discutant de chacun des points. Pour simplifier la vie aux personnes qui ne souhaitent pas trop de temps, je vous joins un fichier zippé comprenant l'ensemble des fichiers nécessaires pour installer un tel Web Service: Téléchargement

    La procédure se résume donc par:

    • Dézippez le fichier;
    • Appuyez sur install.bat.

    Attention! La version actuelle de ce package fait que le fichier spdisco.aspx existant sur le serveur est remplacé par celui présent dans le package. Il est par ailleurs supprimé lors d'un retract de la solution. Faites un backup préalablement.

  • SharePoint: Spécifier l'utilisateur utilisé dans l'historique d'un workflow

    Cette question m'est revenue plusieurs fois déjà. Ainsi, je prends quelques minutes pour mettre la réponse par écrit.

    Dans l'historique d'un workflow, vous retrouvez des valeurs "System Account" à chaque ligne.

    workflow_userid_ko

    Cette information est ainsi peu utile et il serait bien plus intéressant d'indiquer l'utilisateur qui a provoqué une action de laquelle résulte l'élément présent dans l'historique.

    Pour cela, voici rapidement la procédure:

    • Dans le code de votre workflow, si vous n'avez pas suivi l'un des différents articles du net, rajoutez la première ligne (afin de récupérer l'élément courant) du code ci-dessous en global ainsi que la seconde ligne (qui serait la variable dans laquelle on stocke l'ID du user courant de type entier) dans tous les cas:

    VB:

    Public workflowProperties As New Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties ()
    Public CurrentUserId As Integer = -1

    C#:

    public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties workflowProperties = 
          new Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties ();
    public int CurrentUserId = -1;
    
    
    • Si ce n'est déjà fait, ajoutez une activité Code avant l'activité LogToHistoryListActivity. Dans cette activité, ajoutez les lignes suivantes qui permettent de récupérer l'ID de l'utilisateur au sein de SharePoint:

    VB:

    CurrentUserId = workflowProperties.Item("Editor").ToString().Substring( _
           0, workflowProperties.Item("Editor").ToString().IndexOf(";#"))

    C#:

    CurrentUserId = workflowProperties.Item("Editor").ToString().Substring(
           0, workflowProperties.Item("Editor").ToString().IndexOf(";#"));

     

    • Les activités d'un Workflow sont constituées d'un ensemble de propriétés qu'il est possible (voire nécessaire) de spécifier. C'est également le cas pour la LogToHistoryListActivity. Au delà des propriétés explicites telles que HistoryDescription que vous avez certainement déjà remplis (sans quoi, il serait dur d'avoir des logs...), il existe la propriété UserId. C'est cette propriété qui indique l'utilisateur à afficher dans l'historique. Elle requiert une valeur entière qui correspond à ... vous l'aurez compris, la valeur que nous avons récupéré dans le point précédent. Ainsi, il ne reste plus qu'à cliquer sur le bouton "..." et de sélectionner la variable :

     

    userid_1

    userid_2

     userid_3

    • Dernière étape: déployez votre workflow et vérifiez! Désormais l'utilisateur affiché est bien le bon

    workflow_userid_ok

  • Le Service Pack 2 de Vista en beta, c'est pour cette semaine!

    Alors qu'il y a un an presque jour pour jour je vous annonçais la venue du SP1 de Vista, voici désormais le SP2 en beta!

    Comme pour son prédécesseur, il corrige certes quelques bugs, failles de sécurité et autres incohérences qui persisteraient après le SP1 mais il ajoute de nouvelles fonctionnalités / possibilités.

    Pour le télécharger, il vous faudra attendre le:

    • 2 décembre pour les abonnés MSDN et Technet;
    • 4 décembre en téléchargement publique sur MSDN et Technet.

    Les nouveautés les plus importantes de ce Service Pack:

    • Support de types d'hardware émergeants:
      • Support du Bluethoot 2.1;
      • Possibilité d'enregistrer des données sur des supports Blue-Ray;
      • ...;
    • Amélioration de l'administration;
    • Amélioration des performances:
      • Windows Search 4 qui améliore les performances d'indexation et améliore la qualité des résultats;
      • Diminution des ressources nécessaires pour les gadgets de la toolbar;
      • Hyper-V.

    Des améliorations concernant la compatibilité entre des logiciels tels que ZoneAlarm et Vista sont présentes. Par ailleurs, Microsoft annonce que toute application qu'il n'y aura pas de régression de la compatibilité lors du passage au SP2 (heureusement ceci dit...).

    On notera aussi qu'un outil pour nettoyer les fichiers devenus obsolètes après l'installation du SP2 est fourni.

    N'hésitez pas à poster vos feedbacks à ce sujet et n'oubliez pas, il s'agit d'une version beta, il n'est pas conseillé de l'installation pour une installation en "production".

  • SharePoint: des uploads lents avec IE6? Pourquoi?

    Alors que l'envoi de fichier via WebDAV (c'est-à-dire à l'aide de la vue Explorateur) se passe efficacement, l'envoi de fichiers via l'interface web dans SharePoint s'avère très lent?

    Si vous disposez d'Internet Explorer 6 sur les pcs depuis lesquels l'upload est lent, ne cherchez plus le pourquoi! Si ce n'est pas le cas, il s'agit juste d'une piste à suivre.

    La cause est simple: Internet Explorer 6 utilise une clé de registre qui indique la taille du buffer à utiliser pour l'envoi des fichiers. La taille par défaut pose problème dès lors que vous faites l'upload d'un fichier de plus de 2Mo. Après quelques secondes, l'upload semble s'arrêter (et pour preuve, vous pouvez monitorer la charge réseau au travers de l'information "Total Bytes/sec") et un timeout intervient dès lors.

    Internet Explorer 7 ne souffre pas de ce paramètre puisque la valeur de la clé s'est vue modifiée.

    Vous trouverez la procédure pour mettre à jour le paramètre: http://support.microsoft.com/kb/329781/en-us

  • SharePoint: Récupérer la taille d'un Item

    On fera le calcul en utilisant deux fonctions:

    • GetAttachmentsTotalSize: renvoie la taille totale occupée par les fichiers attachés à l'item;
    • GetItemSize: renvoie la taille total des fichiers attachés à laquelle on y ajoute la taille du contenu inclus dans les différents champs.

    GetAttachmentsTotalSize

        Public Function GetAttachmentsTotalSize(ByVal item as SPListItem) As Integer
            Dim size As Integer = 0
    
            For Each filename As String In item.Attachments
                Dim file As String = item.Web.GetFileAsString( _ 
                    item.Attachments.UrlPrefix + filename)
                size = size + file.Length
            Next
    
            Return size
        End Function

    GetItemSize

        Public Function GetItemSize(ByVal item as SPListItem) As Integer
            Dim size As Integer = GetAttachmentsTotalSize()
    
            For Each field As SPField In item.Fields
                If Not (item(field.Id) Is Nothing) Then
                    size = size + item(field.Id).ToString().Length
                End If
    
            Next
    
            Return size
        End Function

    Bon calcul!

  • SharePoint: Attention aux champs users après une migration avec la Content Migration API

    [English version]

    Si dans vos listes vous utilisez un champ user qui filtre les utilisateurs possibles sur base d'un groupe SharePoint et que vous avez l'intention de migrer votre application d'un environnement à un autre via la Content Migration API, ce post est pour vous!

    Tout d'abord, un rapide rappel sur la manière de filtrer les users sur base d'un groupe:

    Dans la définition de la liste, cliquez sur le nom de la colonne user. Une fois dans la fenêtre de propriétés, il suffit de sélectionner le groupe utilisé pour filtrer les users.

     02_thumb[1] 

    Comment cela se passe-t-il en interne? L'identifiant du groupe sélectionné est stocké dans une propriété du champ. Il s'agit de SPFieldUser.SelectionGroup qui reçoit et renvoie un entier comme en atteste MSDN: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfielduser.selectiongroup.aspx.

    Cet identifiant (424 dans notre exemple) est celui présent dans l'url lorsque vous modifiez les membres du groupe.

    01_thumb[2]

    Jusque là, pas de problème.

    Là où peut survenir un problème, c'est lorsque, via STSADM (stsadm -o export) ou un outil (SP RAD Studio par exemple) utilisant la Content Migration API, nous exportons ce site et ensuite l'importons dans un autre environnement. Et là, surprise! Il s'avère que le groupe sélectionné pour le filtre ne correspond pas à ce que nous attendions.

    03_thumb[12]

    Que s'est-il passé? La réponse est simple. Seul un identifiant sous forme d'entier est utilisé comme nous l'avons vu. En regardant le package généré par une opération d'export, on pourrait penser que l'import ne posera aucun problème puisque l'on retrouve  <Group Id="424" Name="GroupName" [...]> dans le fichier UserGroup.xml.

    Cependant, lors de l'import, pour peu que l'identifiant soit déjà utilisé, le groupe importé recevra un nouvel ID. Malheureusement, l'ID utilisé par le champ user n'est quant à lui pas modifié. Et c'est ainsi que l'on se retrouve avec un filtre sur un groupe non souhaité!

    Ainsi, il nous sera nécessaire de modifier manuellement ce filtre après la migration. Pour cela, il suffit de passer par l'interface web... si nous en avons le droit. Dans le cas contraire, une solution possible est d'utiliser des extensions STSADM. C'est cette solution que j'ai mis en place afin de réaliser toutes les opérations d'une traite.

    Cette opération prend en paramètre le nom d'un groupe SharePoint (et non pas sans identifiant puisqu'on ne le connaît pas à l'avance dans notre scénario).

    stsadm -o setfieldproperties -url <SiteUrl> -list <Listname> -field <Fieldname> -userfieldgroupfilter <GroupName>

    Cette extension fait partie des extensions Migration extensions présentes sur CodePlex (http://www.codeplex.com/migrationstsadmext).

  • Roadshow MSDN: Comment Silverlight 2 et WPF peuvent procurer de riches expériences client aux utilisateurs - Liège, 15 Octobre

    Des sessions techniques dans la région liégeoise, cela est suffisamment rare pour être signalé.

    Aujourd’***, les développeurs qui construisent de nouvelles applications veillent tout particulièrement à ce qu’elles procurent une riche expérience client aux utilisateurs. En effet, ceux-ci sont de plus en plus familiarisés avec des applications (web) capables de réagir de façon logique et d’interagir d’avantage avec eux en tenant compte de leurs actions.

    Rejoignez-nous au RIA Roadshow et restez à l'écoute des dernières innovations. Vous y apprendrez comment développer de riches applications pouvant être déployées sur le web et au-delà de ce que vous pouvez habituellement faire avec une application basée sur un navigateur

    Cette session abordera 4 sujets principaux:

    • Les nouvelles fonctionnalités de ASP.NET AJAX

    • Comment utiliser les Windows Live Tools for Visual Studio

    • Comment construire une application Silverlight 2 qui fait appel aux services à distance, à l’inter-liaison des données (data binding), à la création de gabarits et styles (templating & styling) et cela, aussi bien avec Visual Studio 2008 qu’avec Expression Blend 2.5

    • Windows Presentation Foundation et le .NET Client Profile

    Inscriptions: http://msevents.microsoft.com/CUI/EventDetail.aspx?culture=en-US&EventID=1032390486&%3bCulture=fr-BE

  • TechDays '08 à Luxembourg: 30 septembre 2008 à Mondorf-les-Bains, Luxembourg et c'est gratuit!

    C'est au tour du Luxembourg d'héberger les TechDays '08. Avec 6 sessions pour les développeurs et 3 orientées IT Pro, ces TechDays ont pour but d'avoir un large aperçu des nouveautés de .NET et du Service Pack associé ainsi que sur la virtualisation, un des sujets de discussion les plus en vogue actuellement.

    C'est gratuit et le nombre de places est limité donc inscrivez-vous au plus vite!

    Agenda complet: http://www.microsoft.com/belux/techdays08/agenda.aspx

    Inscription: http://www.microsoft.com/belux/techdays08/inscrivez.aspx

  • ASP.NET AJAX: Tous mes UpdatePanels sont raffraîchis lors d'un retour serveur alors que seul un UpdatePanel ne devrait l'être, pourquoi?

    Dans la continuité des questions / réponses sur ASP.NET AJAX (1.0 ou 3.5, peu importe dans ce cas), voici la réponse à une petite question relativement simple mais que tout développeur débutant avec ASP.NET AJAX rencontrera certainement.

    Imaginons une page contenant les éléments suivants:

    • Deux update panels;
    • Un timer;
    • Un bouton et un label dans chacun des update panels.

    Ceci donne une page de ce type (sans aucun chichi et ne respectant aucunement les conventions de nommage habituelles):

    image

    Un seul trigger est associé à l'UpdatePanel1. Celui-ci a pour but de réaliser un retour serveur asynchrone lorsque Timer1 lance l'évènement Tick, ce qui donne:

        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
        </Triggers>
            <ContentTemplate>        
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
            </ContentTemplate>
        </asp:UpdatePanel>

    Aucun trigger n'est associé à l'UpdatePanel2 et pourtant, les deux updatepanels sont rafraichis lors de ce fameux retour asynchrone.

    Ceci se justifie par le fait que, par défaut, la propriété UpdateMode des objets UpdatePanel a la valeur Always. Ainsi, quelque soit l'élément qui a effectué le retour serveur, les UpdatePanel sont raffraîchis.

    Afin de mieux contrôler le rechargement des UpdatePanel, il suffit de mettre la propriété UpdateMode à la valeur Conditional. Dès lors seul les retours serveurs effectués et présents dans les triggers auront pour effet de recharger le contenu de notre UpdatePanel.

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
        </Triggers>
            <ContentTemplate>        
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
            </ContentTemplate>
        </asp:UpdatePanel>

    Pour rappel, vous pouvez retrouver une Introduction à ASP.NET AJAX sur ce même site.

  • ASP.NET AJAX 1.0: Sys is undefined, pourquoi et comment le corriger?

    Certes, c'est loin d'être un problème récent mais étant récemment retombé sur le problème, je me décide enfin à écrire la solution... Je sais que cela servira au moins à une personne :-)

    Après avoir installé les extensions ASP.NET AJAX 1.0 sur un poste dans le but de réaliser des développements avec Visual Studio 2008, on pourrait s'attendre à trouver le template de projet "ASP.NET AJAX Enabled Web Application". Il n'en est pourtant rien comme en atteste la capture d'écran suivante:

    image

    Puisque nous n'avons guère le choix, choisissons le template ASP.NET Web Application. Rapidement, nous pouvons remarquer que les composants "de base" de ASP.NET AJAX Extensions sont bel et bien présents dans la toolbox. Parfait!

    image

    Il ne nous reste donc plus à les utiliser à l'aide d'un drag and drop, tout ce qu'il y a de plus classique.

    Si on observe le web.config (le plus simple étant de garder le web.config ouvert dans Visual Studio, vous serez immédiatement averti des changements), on peut voir que quelques lignes ont été ajoutées dans le web.config:

    <assemblies>
                    <add assembly="System.Web.Extensions, Version=1.0.61025.0, 
    Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies>

    Dès lors, on pourrait se dire que tout va bien et que Visual Studio a fait le travail pour nous. Mais après exécuté la page, l'erreur 'Sys' is undefined apparaît dans le browser.

    Pourquoi? La réponse est simple... On retrouve

    <script src="/ScriptResource.axd?d=xyz" type="text/javascript"></script>
    <script src="/ScriptResource.axd?d=abc" type="text/javascript"></script>

    dans la source HTML. Or si on vérifie ce que génére ce fichier, on remarque que celui-ci n'est pas disponible. Cela est dû au fait que le serveur ne sait pas comment interpréter les .axd. C'est pour cela qu'il est nécessaire d'ajouter les lignes suivantes dans le web.config et ce entre <system.web> et </system.web>:

    <httpHandlers>
      <add verb="GET" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler"
    validate="false"/> </httpHandlers>

    Désormais, il ne nous reste plus qu'à laisser exploser notre imagination.

    Le web.config minimal:

    <?xml version="1.0"?>
    <configuration>
        <appSettings/>
        <connectionStrings/>
        <system.web>
        <httpHandlers>
          <add verb="GET" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler"
    validate="false"/> </httpHandlers> <compilation debug="false"> <assemblies> <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> <authentication mode="Windows"/> </system.web> </configuration>

    Notez que vous pouvez trouver un web.config complet à l'adresse suivante:

    C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025.

  • SharePoint: Introduction à la Content Migration API

    La Content Migration API, voilà une librairie importante de SharePoint et qui s'avère souvent trop peu connue. Comprendre cette API permet de réaliser des opérations de transfert de données d'un environnement SharePoint à un autre et de ce manière efficace. C'est pour cette raison que j'ai décidé de publier un ensemble de posts à ce sujet afin de montrer ce qu'il est possible de faire grâce à cette librairie. Mais commençons par le début et voyons ce qu'est cette API.

    Qu'est ce que la content migration API?

    La Content Migration API permet d'effecuter le transfert de données d'un site SharePoint. Ce transfert peut s'effectuer entre des environnements connectés (éventuellement le même environnement) ou entre des énvironnements totalement déconnectés. 

    Qu'entend-t-on par le terme données? En fait tout (ou presque) ce qu'il est possible de définir via l'interface web de SharePoint, à savoir:

    • Listes
    • Eléments de liste (lists items)
    • Web Parts
    • Page customisées
    • Pages maîtres (master pages)
    • Types de contenu (content types)
    • CSS
    • Page layouts
    • Colonnes de sites
    • Images référencées dans des pages
    • ...

    Ne font pas partie des données qui peuvent être transportées par la Content Migration API et définis via l'interface web de SharePoint:

    • Alertes
    • Statuts Check in/Check out
    • Eléments de la corbeille
    • Statuts des Workflows
    • Logs des modifications

    On notera également que les éléments suivants ne sont également pas pris en compte lors de l'export:

    • Features
    • Workflows personnalisés
    • Solutions

    La raison pour laquelle les features et les workflows personnalisés ne peuvent être exportés est qu'ils se trouvent dans le système de fichiers et non pas dans la base de données comme pour les autres éléments. Si on devait résumer ceci, on dirait que tout ce qui résulte d'un développement ou d'une customisation (ajouter une liste n'est pas pour moi une customisation ;-) ), et donc déployable via les solutions, doivent être déployés en suivant les principes courants, en utilisant par exemple STSADM.

    Le transfert de données d'un site à l'autre se fait en trois étapes:

    1. Export: Choix des éléments à exporter et génération d'un ensemble de fichiers contenant les données;
    2. Transport: Les fichiers générés doivent être placés afin d'être accessibles lors d'opérations vers l'environnement cible. Le transport peut se faire par n'importe quel moyen (FTP, clé USB, ...) puisqu'il s'agit de simples fichiers;
    3. Import: Sur base des fichiers générés et mis à disposition, l'import peut se faire dans l'environnement cible.

    Les fichiers intermédiaires étant basés sur une structure de fichiers connue (voir Content Migration XML Schema Reference), il est possible de générer ces fichiers de données depuis une application tierce et ce afin de faciliter l'import d'information provenant d'un autre système d'information.

    Par quelles fonctionnalités SharePoint utilise-t-il la C.M. API?

    Il ne s'agit pas d'une liste exhaustive loin de là mais un aperçu des fonctionnalités utilisées régulièrement et pour lesquelles on ne soupçone pas toujours l'utilisation de l'API.

    Copier / Déplacer depuis les menus de gestion du contenu et de structure 

    image

    Pour faire simple, quelles sont les opérations qui sont effectuées lorsque l'on veut copier un site? On pourrait penser qu'il y a une boucle pour réaliser une copie du site source vers le site cible (la copie devant se faire dans le même site collection, le site source et le site destination sont d'office connectés entre eux) mais il n'en est rien. Il s'agit de la suite d'actions désormais si bien connue:

    • Export: vers le système de fichiers local;
    • (Transport: non nécessaire dans ce cas puisque la cible et la destination se trouve sur le même serveur; )
    • Import: vers un nouveau site SharePoint.

    On notera que lors de la copie d'un site vers un autre à l'aide de cette fonctionnalité, la sécurité du site n'est pas dupliquée. Nous comprendrons pourquoi très bientôt. N'oubliez donc pas de réappliquer vos règles de sécurité.

    STSADM

    STSADM, que certains nomment Super admin tool, est un outil utilisable en ligne de commande fourni avec SharePoint qui permet d'effectuer un ensemble considérable d'opérations autour de SharePoint. Si vous ne connaissez pas encore les possibilités (et les limites) de cet outil, foncez sur votre moteur de recherche préféré et faites une petite recherche à ce sujet... en attendant que je poste à ce sujet :))

    image

    Comme à l'accoutumée, comment peut-on copier des données d'un site à l'autre à l'aide de STSADM? En suivant nos éternelles trois étapes bien entendu:

    • Export: du site source vers un fichier (compressé dans l'exemple ci-dessous)

    stsadm -o export -url http://monserveur/monsitesource -filename "c:\un repertoire\content.cmp"

    Un rapide aperçu des options liées à la sélection des éléments à exporter de cette fonctionnalité de STSADM:

    stsadm.exe -o export
               -url <URL du site à exporter>
               -filename <Chemin vers le fichier ou le répertoire intermédiaire>
               [-includeusersecurity]
               [-versions <1-4>
                   1 - Dernière version majeure des fichiers et des list items (valeur par défaut)
                   2 - Version courante, qu'elle soit mineure ou majeure
                   3 - Dernière version majeure et dernière version mineure des fichiers et des lists items
                   4 - Toutes les versions]

    Au vu des propriétés, on se rend rapidement compte qu'il n'est possible d'exporter que des sites complets.

    • Transport des fichiers: A vous de choisir ce qui vous convient le mieux. Tous les chemins mènent au serveur de destination ;-);
    • Import: d'un fichier (compressé dans l'exemple ci-dessous) vers le site cible

    stsadm -o import -url http://monserveur/monsitecible -filename "c:\un repertoire\content.cmp"

    Un petit tour du côté des options liées à la manière d'importer les éléments:

    stsadm.exe -o import
               -url <URL du site dans lequel importer les données>
               -filename <Chemin vers le fichier ou le répertoire intermédiaire>
               [-includeusersecurity]
               [-updateversions <1-3>
                   1 - Ajoute de nouvelles versions au fichier (valeur par défaut)
                   2 - Remplace le fichier et ses versions (suppression avant insertion)
                   3 - Ignore le fichier si il est déjà existant sur la destination]

    On notera qu'il existe d'autres propriétés/options liées aux fichiers générés (compression ou non, ...) qui sont certes importantes mais sont moins parlantes que celles qui nous intéresse ici.

    Web Services

    Le WebService Sites, disponible à l'adresse http://<Site>/_vti_bin/Sites.asmx, permet d'effectuer des exports et des imports de données. Comme pour STSADM, le niveau le plus bas qu'il est possible d'exporter est le site.

    image  image

    Gestion de contenu web

    Le Web Content Management, que l'on retrouve au travers des publishing sites suit la même procédure en ce qui concerne la publication d'information sur un site particulier. La source et la destination étant directement connecté, il n'y a ainsi que les opérations d'export et d'import qui sont effectuées. L'export se fait sur un  sous-ensemble de données, à savoir uniquement celles-qui doivent être publiées. Cette opération de filtre des données à exporter se nomme l'export sélectif.

    Pourquoi utiliser la Content Migration API?

    Export sélectif

    Que ce soit les web services ou STSADM, il n'est pas possible, nous l'avons vu, de réaliser un export de données d'un niveau plus bas que le site. Ce n'est cependant qu'une limite de l'outil et non pas de la Content Migration API puisque dans le cas du Web Content Management, l'API est utilisée pour exporter un sous-ensemble de données. Ainsi, seuls les éléments de liste qui ont été ajoutés ou mis à jour depuis une date donnée sont exportées afin de permettre une réplication d'un site à un autre.

    Utilisant la même API, nous pouvons effectuer la même opération et sélectionner les éléments à exporter. Nous verrons dans un prochain post que cela peut avoir plusieurs utilités. Bien entendu, les premiers intérêts que l'on peut trouver sont la publication d'éléments et la réplication de données d'un site vers un autre.

    Dans un prochain post, nous verrons comment effectuer un export sélectif du point de vue développement. Nous nous rendrons rapidement compte qu'il est aisé d'implémenter sa propre logique pour la sélection des données.

    Maintien des identifiants des éléments d'un site

    Dans certains cas, il est important de préserver les identifiants d'un site à l'autre. On retrouve cette nécessité lors d'un export sélectif (pour savoir quel élément mettre à jour) mais aussi si un webpart référence une liste via son identifiant, il est nécessaire de retrouver le même identifiant pour cette dite liste.

    Nous verrons que dans certains cas, le maintien des identifiants n'est pas nécessaire et que pire que ça, cela peut poser parfois des problèmes. Effectivement, toutes les données sont stockées en base de données. Le GUID (identifiant unique) est utilisé comme clé primaire au sein de cette base. Le principe d'une clé primaire est d'interdire les doublons. Or que se passe-t-il si vous importez un package vers deux sites différents en maintenant les identifiants? Vous dupliquez les identifiants.

    Les packages de migration de données

    De quoi est composé un package de migration de données?

    Pour qu'une migration de données soit effective, il est nécessaire que tous les éléments nécessaires soient présents sur le serveur source. Un package de migration de données contient donc, en plus des données proprement dit, un ensemble de fichiers dans lesquels sont stockés les informations sur les éléments requis ou encore ceux à importer (groupes et utilisateurs pour la partie sécurité par exemple).

    Succintement, le package est formé des fichiers suivants:

    image

    • Manifest.xml: est le fichier de base lors de toute migration;
    • Requirements.xml: contient la liste des éléments requis par le contenu à migrer. La vérification de l'existence de ces ressources se fait préalablement à toute migration de données;
    • ExportSettings.xml: contient la logique utilisée lors de l'export pour vérifier que tous les éléments attendus dans le package soient présents;
    • RootObjectMap.xml: contient l'élément de plus haut niveau à importer;
    • SystemData.xml: utilisé principalement lorsque l'on maintient les identifiants, il contient l'ensemble des éléments installés et requis sur le serveur. En cas d'absence de l'un ou plusieurs de ces éléments arrêtent l'import;
    • UserGroup.xml: contient les informations provenant du site d'origine concernant les utilisateurs et les groupes SharePoint utilisés dans le site;
    • LookupListMap.xml: contient les liens entre items liés (c'est à dire utilisés dans les champs lookup);
    • ViewFormsList.xml: contient la liste des Web Parts en indiquant si il s'agit de vues ou de formulaires;
    • fichiers .dat: contiennent les données proprements dites.

    Il existe un outil très utile pour parcourir le Content Migration Package Explorer: http://blogs.msdn.com/ronalus/archive/2007/10/02/content-migration-package-explorer.aspx

    image

    Sous quel format peut être le package?

    Deux possibilités s'offrent à nous pour stocker l'ensemble des fichiers précédemment cité:

    • Fichier Compressé: théoriquement avec une extension .cmp, il s'agit de l'option par défaut lors d'un export;
    • Répertoire: les fichiers sont situés dans un répertoire unique.

    Le premier a l'avantage de rassembler tous les fichiers nécessaires au sein d'un seul et même fichier, qui plus est, compressé. L'inconvénient est que cette compression est couteuse en temps et nécessite de disposer sur disque de deux fois la taille du package. Notez que pour de gros packages, une erreur peut survenir durant la compression, arrêtant l'export en cours.

    Dans le second cas, il est important de faire attention à bien transférer tous les fichiers d'un environnement source vers l'environnement cible.

    Peut-on modifier un package de migration de données?

    Bien entendu! Comme nous l'avons vu précédemment la référence au sujet de la syntaxe de ces fichiers est fournie. Nous verrons d'ailleurs comment utiliser la Content Migration API (et surtout comment modifier les fichiers intermédiaire) il est possible d'effectuer des opérations qui ne sont pas possibles Out-of-the-box, par exemple passer d'un template en français à un template en anglais et inversément.

    Pour faciliter les modifications, il est conseillé d'utiliser des fichiers non compressés.

    Conclusion

    Désormais, nous avons une connaissance suffisante de la Content Migration API afin de passer à la réalisation d'exemples concrets. 

    Dans un prochain post, je présenterai au travers d'un poste le développement d'une application permettant d'effectuer des exports ainsi que des imports de sites ou d'un ensemble quelconque d'informations provenant de sites SharePoint. Nous verrons également comment utiliser la C.M. API pour permettre de changer le parent d'un élément exporté.

    Plus tard, nous verrons également comment réaliser des exports incrémentals de données, utilisés lors de la réplication par exemple.

    Enfin, après voir vu comment développer des outils utilisant ces fonctionnalités nous verrons comment les utiliser à bon escient pour réaliser des opérations qui pourraient s'avèrer complexes sans ceux-ci.

  • Sql Server: Impossibilité de passer d'une version à l'autre ou de le désinstaller. Que faire?

    L'installation de Sql Server, que ce soit dans le but d'installer SharePoint ou non, est une opération relativement simple et relativement rares sont les problèmes qui peuvent survenir.

    L'ajout de composants, la mise à jour de notre Sql Server ou encore la désinstallation d'un Sql Server (et oui... cela est parfois nécessaire à des fins de nettoyage avant réutilisation d'un serveur) n'amène que peu de difficultées supplémentaires. Il suffit de suivre les indications (en utilisant l'argument SKUUPGRADE=1 comme indiqué dans l'article Sql Server: Passer de la version Express à une version Standard/Enterprise) et d'être patient (oui je sais, je me répète).

    Cependant, j'ai malheureusement rencontré un problème pas ou peu documenté. L'erreur obtenue est:

    The setup has encountered an unexpected error while Setting Internal Properties. The error is: Fatal error during installation.

    En l'absence d'un message d'erreur explicite, une petite lecture des logs permet de découvrir un peu plus de détails:

    GetServiceUserGroup failed for OFFICESERVERS, 5
            Error Code: 0x80070534 (1332)
    Windows Error Text: No mapping between account names and security IDs was done.

    Après lecture et recherche dans l'historique de l'installation de la machine, il s'avère que l'erreur est dûe au fait que Sql Server utilise des comptes locaux temporaires dont le SID n'existe plus suite à un changement de nom de la machine (Voir Renommer un serveur et un SharePoint installé en standalone).

    Effectivement, l'outil NewSID a effectué la mise à jour de tous les SID qu'il a pu identifier.

    Pour rappel, le "Computer Security Identifier" ou "Identificateur de Sécurité" permet d'identifier un ordinateur (plus précisément le système d'exploitation qui y est installé). Ce SID est créé et assigné dès les premières phases de l'installation du Windows.

    Pour la même raison, cette erreur peut survenir après avoir placé une machine dans un réseau d'entreprise.

    La correction est simple pour peu qu'on ait accès à la base de registre. Pour cela, dans le menu Démarrer (Start), dans la zone Exécuter (Run) indiquez regedit

    Identifiez les hierarchies suivantes en remplacant X par 1, 2, ... n où n est le nombre d'instances déjà présentes: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\Setup

    Deux clés de registres s'y trouvent :

    • SQLGroup
    • FTSGroup

    groups dans registry pour install sql server

    Supprimer ces clés de registre permet de réinitialiser les comptes.

    Redémarrez le programme d'installation ou de mise à jour de Sql Server. Vous ne devriez désormais plus recevoir cette erreur.

    Selon mes recherches sur Internet, il semble que deux autres groupes peuvent être présents dans les clés de registre et nécessitent une suppression:

    • AGTGroup
    • ASGroup
  • Sql Server: Passer de la version Express à une version Standard/Enterprise

    Sql Server Express convient parfaitement pour une utilisation lors de développement ou de projets persos. Certaines limitations peuvent cependant être insuffisantes pour des développements nécessitant plus de composants ou d'espace de stockage.

    Réalisant principalement des développements principalement dans un environnement SharePoint, ce post a pour origine un besoin lié à SharePoint qui, par défaut, inclut l'installation d'un Sql Server express. Cependant, ceci s'applique à d'autres environnements basés sur Sql Server.

    Mettre à jour Sql Server

    Après avoir mis le cd ou le DVD contenant la version cible de Sql Server, lancez, en ligne de commande, le programme d'installation à l'aide de setup.exe SKUUPGRADE=1 (respectez la casse)

    Après avoir accepté les termes de la licence, un peu de patiente et quelques clics à la sauce Next Next Next, vous pouvez enfin choisir les composants de Sql Server que vous souhaitez mettre à jour.

    image

    Comme indiqué, cliquez sur Advanced pour accéder à plus d'options. Bien entendu, vous n'êtes aucunement obligé de passer par cette étape mais cela est tout de même fortement conseillé afin d'être certain d'installer tout ce que vous souhaitez et uniquement ce que vous souhaitez.

    image

    Sélectionnez le nom de l'instance (la mise à jour se fait instance par instance. Il vous faudra donc réaliser l'opération plusieurs fois si vous avez plusieurs instances à mettre à jour). Dans le cas de SharePoint, vous pouvez indiquer "OFFICESERVERS" dans Named instance ou encore passer par le bouton Installed instances.

    InstalledInstances 

    Sélectionnez les éléments que vous souhaitez mettre à jour ou installer pour l'instance sélectionnée.

    existingcomponents

    Pensez à cocher les composants à mettre à jour...

    image 

    Il suffit dès lors de suivre les instructions et d'être patient.

    Les écrans suivants dépenderont des composants mis à jour ou installés. Par exemple, l'écran pour le compte à utiliser pour Reporting Services:

    image  image

    Ensuite un rapport des actions qui vont être effectuées apparait:

    image

    A nouveau, un seul mot d'ordre après avoir cliqué sur Install : la patience!

    Attention, si vous avez renommé votre machine entre la première installation et la mise à jour d'une instance, il est nécessaire d'effectuer quelques petites opérations comme indiqué dans le post suivant: à suivre...

  • IE Dev Toolbar ne fonctionne pas, que faire?

    Bien que depuis peu il soit possible de réaliser des développements SharePoint sous Vista, souvent, les développeurs utilisent une machine virtuelle contenant Windows Server 2003 et l'Internet Explorer installé par défaut.

    L'extension IE Dev Toolbar peut être utile dès lors que l'on manipule le DOM de la page web (encore plus utile si on couple l'utilisation de cette extension avec l'utilisation du debugger JavaScript de Visual Studio 2008). Mais après avoir installé cette extension et redémarré Internet Explorer, nous sommes rapidement heureux de pouvoir démarrer cette toolbar. Et là, surprise puisque rien n'est présent dans ce toolbar.

    image

    Effectivement, l'extension n'est, par défaut, pas autorisée à accéder au contenu de la page web. Effectivement, l'accès à Internet depuis un serveur n'est pas conseillée. Les options sont ainsi sélectionnées en ce sens.

    Pour autoriser l'accès à la page web par IE Dev Toolbar, rendez-vous dans les options Internet de Internet Explorer. Ensuite cocher l'option "Enable third-party browser extensions"

    image

    Redémarrez Internet Explorer et là... bingo!

    image

    Sur des O.S. "clients" (Windows XP, Windows Vista, ...), aucun souci puisque cette option est, à l'installation, activée.

More Posts Next page »
L'auteur du site ne peut être tenu responsable des dommages que les informations fournies pourraient entraîner. Tout est cependant mis en oeuvre pour éviter tout désagrément.
Powered by Community Server (Non-Commercial Edition), by Telligent Systems