<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Bertrand Vergnault, Consultant SharePoint &#187; .NET</title>
	<atom:link href="https://blog.developpez.com/bertrandvergnault/pcategory/net/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/bertrandvergnault</link>
	<description></description>
	<lastBuildDate>Mon, 28 Nov 2011 08:18:06 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>[Office 365] Activer l&#8217;accès anonyme</title>
		<link>https://blog.developpez.com/bertrandvergnault/p10546/sharepoint/office_365_activer_l_acces_anonyme</link>
		<comments>https://blog.developpez.com/bertrandvergnault/p10546/sharepoint/office_365_activer_l_acces_anonyme#comments</comments>
		<pubDate>Mon, 28 Nov 2011 08:18:06 +0000</pubDate>
		<dc:creator><![CDATA[bertrandv]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Office 365]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J’ai donc voulu créer mon blog sur SharePoint Online étant donné que je me suis spécialisé cette année dans le développement SharePoint. Mais je me suis confronté à un léger souci, lorsque j’ai créé un site de type « Blog » sur SharePoint Online, il s’avère que les permissions héritent du site parent et que le site parent ne possède pas d’accès anonyme. Il n’est pas non plus possible via l’interface d’activer l’accès anonyme, n’ayant [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J’ai donc voulu créer mon blog sur SharePoint Online étant donné que je me suis spécialisé cette année dans le développement SharePoint. Mais je me suis confronté à un léger souci, lorsque j’ai créé un site de type « Blog » sur SharePoint Online, il s’avère que les permissions héritent du site parent et que le site parent ne possède pas d’accès anonyme.<br />
<br />
Il n’est pas non plus possible via l’interface d’activer l’accès anonyme, n’ayant pas accès à l’administration centrale !<br />
<br />
Par exemple, pour un blog, si l’utilisateur clique sur un billet en page d’accueil pour y accéder, il est redirigé directement vers la page d’authentification. Idem pour les catégories et commentaires.<br />
<br />
Du coup, et grâce à <a href="http://www.martinhatch.com/2011/08/how-to-enable-anonymous-access-to-blog.html">cet article de Martin Hatch</a>, j’ai créé une webpart permettant de lister toutes les listes du site courant et de permettre d’activer l’accès anonyme en lecture seule ou en modification/écriture.&#8203;<br />
<br />
<img src="http://bertrandvergnault.sharepoint.com/blog/BlogImages/Manage%20Lists%20permissions%20webpart.JPG" alt="anonymous access" title="anonymous access" /><br />
<br />
Ainsi, j’ai activé l’accès anonyme pour la liste des billets, des commentaires et des catégories. De plus, j’ai activé l’ajout d’item pour la liste des commentaires afin que tout utilisateur puisse ajouter un commentaire.<br />
Voici, le code utilisé pour activer l’accès anonyme :<br />
<br />
La permission <b>SPBasePermissions.ViewFormPages</b> n’est pas effective. Il suffit de l’ajouter sur le masque de permissions AnonymousPermMask64 de la liste.</p>
<pre>SPList list = SPContext.Current.Web.Lists[listId];
if (list != null)
{
   if (!list.HasUniqueRoleAssignments)
   {
      list.BreakRoleInheritance(true);
   }
   list.WriteSecurity = 2;
   list.AnonymousPermMask64 |= (SPBasePermissions.Open | SPBasePermissions.OpenItems 
                                    | SPBasePermissions.ViewListItems | SPBasePermissions.AddListItems);
   list.Update();
   this.gridViewLists.DataBind();
}</pre>
<p>Pour activer l’ajout d’items dans la liste des commentaires, il suffit d’ajouter la permission <b>SPBasePermissions.AddListItems</b>.</p>
<pre>list.AnonymousPermMask64 |= (SPBasePermissions.AddListItems);</pre>
<p>Vous pouvez trouver le code source de la webpart ici: http://bertrandvergnault.sharepoint.com/blog/PublicDocuments/ModifyListsPermissionsWebPart/Office365.ModifyListsPermissions.zip&#8203;<br />
<br />
Ou télécharger directement le fichier solution WSP pour l&rsquo;ajouter directement dans votre environnement:</p>
<p>http://bertrandvergnault.sharepoint.com/blog/PublicDocuments/ModifyListsPermissionsWebPart/Office365.ModifyListsPermissions.wsp</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SharePoint 2010] Liens utiles aux developpeurs</title>
		<link>https://blog.developpez.com/bertrandvergnault/p10532/sharepoint/sharepoint_2010_liens_utiles_aux_develop</link>
		<comments>https://blog.developpez.com/bertrandvergnault/p10532/sharepoint/sharepoint_2010_liens_utiles_aux_develop#comments</comments>
		<pubDate>Thu, 24 Nov 2011 07:33:34 +0000</pubDate>
		<dc:creator><![CDATA[bertrandv]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici une liste de liens utiles et tips pour les développeurs SharePoint. Cet article a plutôt un but personnel puisqu&#8217;il me permet de garder sous le coude les infos que je ne retiens pas forcément Niveaux de permissions dans SharePoint&#8203; : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbasepermissions.aspx Custom actions locations and IDs : http://msdn.microsoft.com/en-us/library/bb802730.aspx ID des types de listes natives SharePoint : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splisttemplatetype.aspx ID des Content types : http://msdn.microsoft.com/fr-fr/library/aa543822.aspx Guid des features natives de SharePoint : http://blogs.msdn.com/b/mcsnoiwb/archive/2010/01/07/features-and-their-guid-s-in-sp2010.aspx Liste des contentclass [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici une liste de liens utiles et tips pour les développeurs SharePoint.<br />
<br />
Cet article a plutôt un but personnel puisqu&rsquo;il me permet de garder sous le coude les infos que je ne retiens pas forcément <img src="https://blog.developpez.com/bertrandvergnault/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /><br />
<br />
Niveaux de permissions dans SharePoint&#8203; : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbasepermissions.aspx<br />
<br />
Custom actions locations and IDs : http://msdn.microsoft.com/en-us/library/bb802730.aspx<br />
<br />
ID des types de listes natives SharePoint : http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splisttemplatetype.aspx<br />
<br />
ID des Content types : http://msdn.microsoft.com/fr-fr/library/aa543822.aspx<br />
<br />
Guid des features natives de SharePoint : http://blogs.msdn.com/b/mcsnoiwb/archive/2010/01/07/features-and-their-guid-s-in-sp2010.aspx<br />
<br />
Liste des contentclass utilisable pour la recherche: http://www.rtsmedia.com/SharePoint/contentclass.aspx&#8203;<br />
<br />
Activer/Désactiver le developer dashboard :</p>
<pre>
stsadm -o setproperty -pn developer-dashboard -pv On|Off|OnDemand
</pre>
<p>Cet article sera amené à grossir&#8230; <img src="https://blog.developpez.com/bertrandvergnault/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SharePoint 2010] Erreur HRESULT E_FAIL lors de l&#8217;utilisation d&#8217;une FullTextSqlQuery</title>
		<link>https://blog.developpez.com/bertrandvergnault/p10530/sharepoint/sharepoint_2010_erreur_hresult_e_fail_lo</link>
		<comments>https://blog.developpez.com/bertrandvergnault/p10530/sharepoint/sharepoint_2010_erreur_hresult_e_fail_lo#comments</comments>
		<pubDate>Wed, 23 Nov 2011 07:28:40 +0000</pubDate>
		<dc:creator><![CDATA[bertrandv]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lors de l’utilisation de la recherche et plus particulièrement d’une requête FullText, j’ai été confronté à une erreur pas vraiment explicite Voici la requête que j’ai exécutée : SearchServiceApplicationProxy proxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(site)); FullTextSqlQuery myQuery = new FullTextSqlQuery(proxy); myQuery.ResultsProvider = SearchProvider.Default; myQuery.ResultTypes = ResultType.RelevantResults; myQuery.QueryText = &#34;SELECT Title FROM SCOPE() where \&#34;scope\&#34;='All Sites' AND MyManagedProperty LIKE ‘%test%’”; Voici maintenant le libellé de l’erreur en question au moment du myQuery.Execute() : HRESULT E_FAIL has been returned from [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Lors de l’utilisation de la recherche et plus particulièrement d’une requête FullText, j’ai été confronté à une erreur pas vraiment explicite <img src="https://blog.developpez.com/bertrandvergnault/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Voici la requête que j’ai exécutée :</p>
<pre>
SearchServiceApplicationProxy proxy = 
(SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(site));
FullTextSqlQuery myQuery = new FullTextSqlQuery(proxy);
myQuery.ResultsProvider = SearchProvider.Default;
myQuery.ResultTypes = ResultType.RelevantResults;
myQuery.QueryText = &quot;SELECT Title FROM SCOPE() where \&quot;scope\&quot;='All Sites' AND MyManagedProperty LIKE ‘%test%’”;
</pre>
<p>
Voici maintenant le libellé de l’erreur en question au moment du myQuery.Execute() :<br />
<i>HRESULT E_FAIL has been returned from a call to a COM component</i><br />
<br /> <br />
Après des recherches sur Google je suis tombé sur ce post m’indiquant la marche à suivre.<br />
<a href="http://msdn.microsoft.com/fr-fr/library/microsoft.sharepoint.search.query.query.hint(v=office.12).aspx">http://msdn.microsoft.com/fr-fr/library/microsoft.sharepoint.search.query.query.hint(v=office.12).aspx</a><br />
<br /> <br />
Il suffit de spécifier la propriété Hint avec la valeur <b>QueryHint.OptimizeWithPropertyStore</b>.<br />
</p>
<pre>
myQuery.Hint = QueryHint.OptimizeWithPropertyStore;
</pre>
<p>
Sur la msdn, il n’y a aucune information permettant de savoir réellement quel est l’impact de cette propriété. Cependant, il n’y a plus d’erreur et les résultats que me retourne la recherche sont ceux attendus ;)&#8203;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SHP 2010] Modifier le titre et la description d&#8217;une webpart de la galerie</title>
		<link>https://blog.developpez.com/bertrandvergnault/p10504/sharepoint/shp_2010_modifier_le_titre_et_la_descrip</link>
		<comments>https://blog.developpez.com/bertrandvergnault/p10504/sharepoint/shp_2010_modifier_le_titre_et_la_descrip#comments</comments>
		<pubDate>Wed, 16 Nov 2011 08:57:06 +0000</pubDate>
		<dc:creator><![CDATA[bertrandv]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Post original : http://bertrandvergnault.sharepoint.com/blog/Lists/Billets/Post.aspx?ID=7 Pour modifier programmatiquement le titre et la description d&#8217;une webpart présente dans un site SharePoint, il faut pouvoir l&#8217;atteindre depuis la galerie de webpart. Cette galerie de webpart est accessible depuis les paramètres du site : L’idée est donc toute simple : aller récupérer l’item de cette liste contenant les fichier “.dwp” ou “.webpart” correspondant aux webparts. Une fois l’item souhaité récupéré, il suffit d’en modifier les métadata comme bon nous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><b>Post original : <a href="http://bertrandvergnault.sharepoint.com/blog/Lists/Billets/Post.aspx?ID=7">http://bertrandvergnault.sharepoint.com/blog/Lists/Billets/Post.aspx?ID=7</a></b></p>
<p>Pour modifier programmatiquement le titre et la description d&rsquo;une webpart présente dans un site SharePoint, il faut pouvoir l&rsquo;atteindre depuis la galerie de webpart.<br />
Cette galerie de webpart est accessible depuis les paramètres du site :<br />
<br />
<img src="http://bertrandvergnault.sharepoint.com/blog/BlogImages/galeries.png" alt="galeries" title="galeries sharepoint" /><br />
<br />
<img src="http://bertrandvergnault.sharepoint.com/blog/BlogImages/webpart%20galery.png" alt="webpart galery" title="webpart galery" /></p>
<p>L’idée est donc toute simple : aller récupérer l’item de cette liste contenant les fichier “.dwp” ou “.webpart” correspondant aux webparts. Une fois l’item souhaité récupéré, il suffit d’en modifier les métadata comme bon nous semble.<br />
Dans l’exemple qui suit, j’ai souhaité modifier les métadata de la webpart &laquo;&nbsp;Colleagues&nbsp;&raquo; présente nativement dans SharePoint 2010. Celle-ci permet de visualiser la liste de ses collègues (partie Réseau Social de SharePoint).<br />
</p>
<pre>using (SPSite site = new SPSite(mysiteUrl)) 
{ 
    using (SPWeb web = site.OpenWeb()) 
    { 
        SPList wpList = site.GetCatalog(SPListTemplateType.WebPartCatalog); 
        SPListItem colleagueItem = null; 
        foreach (SPListItem item in wpList.Items) 
        { 
             if (item["LinkWebPart"].ToString().Equals("Colleagues.dwp")) 
             { 
                 colleagueItem = item; 
                 break; 
             } 
        }                    
        if (colleagueItem != null) 
        { 
            colleagueItem.Properties["vti_title"] = "Contacts"; 
            colleagueItem.Properties["vti_cachedtitle"] = "Contacts"; 
            colleagueItem.Properties["WebPartDescription"] = colleagueItem["WebPartDescription"]
                .ToString().Replace("colleague", "contact").Replace("colleagues", "contacts"); 
            colleagueItem.SystemUpdate(false); 
        } 
    } 
}</pre>
<p>
Voilà le résultat lorsque l’utilisateur souhaite ajouter la webpart dans une page :<br />
<img src="http://bertrandvergnault.sharepoint.com/blog/BlogImages/contacts.png" alt="contacts webpart" title="contacts webpart" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SHP2010] Réaliser un ajout de collègues bidirectionnel</title>
		<link>https://blog.developpez.com/bertrandvergnault/p10509/sharepoint/shp2010_realiser_un_ajout_de_collegues_b</link>
		<comments>https://blog.developpez.com/bertrandvergnault/p10509/sharepoint/shp2010_realiser_un_ajout_de_collegues_b#comments</comments>
		<pubDate>Thu, 17 Nov 2011 08:29:14 +0000</pubDate>
		<dc:creator><![CDATA[bertrandv]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans SharePoint 2010 et plus précisément dans la partie “Réseau Social” du produit, il est possible d’ajouter un autre utilisateur en tant que collègue. L’ajout d&#8217;un collègue est unidirectionnel : c’est-à-dire que lorsqu&#8217;une personne ajoutera une autre dans sa liste des collègues, le collègue ne verra cependant pas dans sa liste celui qui vient de l’ajouter. Dans le cas de la mise en place d’une mise en relation comme Facebook par exemple, lorsqu’un utilisateur accepte [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans SharePoint 2010 et plus précisément dans la partie “Réseau Social” du produit, il est possible d’ajouter un autre utilisateur en tant que collègue.</p>
<p>L’ajout d&rsquo;un collègue est unidirectionnel : c’est-à-dire que lorsqu&rsquo;une personne ajoutera une autre dans sa liste des collègues, le collègue ne verra cependant pas dans sa liste celui qui vient de l’ajouter.<br />
Dans le cas de la mise en place d’une mise en relation comme Facebook par exemple, lorsqu’un utilisateur accepte la requête d’un autre, l’un est ajouté dans la liste de contacts de l’autre et inversement.<br />
<br /> <br />
Pour réaliser cela avec SharePoint, on peut se dire que c’est très simple mais j’ai fait face à un petit soucis : lorsque l’utilisateur connecté accepte la requête, l’ajout du collègue dans sa propre liste fonctionne mais l’inverse ne fonctionne pas et on obtient une erreur de sécurité. En effet, il est impossible d’ajouter un collègue dans la liste d’un autre utilisateur que celui dans lequel le contexte tourne. Et ce, même en élévation de privilèges…<br />
<br /> <br />
Il y a un hack possible pour “shooter” le contexte utilisateur pour faire en sorte que la requête passe :</p>
<pre>
public void AddToColleagues(UserProfile user, UserProfile colleagueToAdd, SPSite currentSite) 
{ 
     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
          using (SPSite site = new SPSite(currentSite.Url)) 
          { 
                using (SPWeb web = ssite.OpenWeb()) 
                { 
                      SPServiceContext context = SPServiceContext.GetContext(site); 
                    
                      //On sauvegarde le contexte 
                      HttpContext currentContext = HttpContext.Current; 
 
                      //On “shoote” le contexte 
                      HttpContext.Current = null;
 
                      UserProfileManager profManager = new UserProfileManager(context); 
                      user.Colleagues.CreateWithoutEmailNotification(colleagueToAdd, ColleagueGroupType.General, impersUser.Colleagues.GetGroupList()[0], false, Privacy.Public); 
                      colleagueToAdd.Colleagues.CreateWithoutEmailNotification(user, ColleagueGroupType.General, impersUser.Colleagues.GetGroupList()[0], false, Privacy.Public); 
 
                      //On recharge le contexte 
                      HttpContext.Current = currentContext; 
                } 
          }      
     }); 
}
</pre>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SHP2010] Modifier l&#8217;apparence d&#8217;un contrôle natif à l&#8217;aide d&#8217;un ControlAdapter</title>
		<link>https://blog.developpez.com/bertrandvergnault/p10524/sharepoint/shp2010_modifier_l_apparence_d_un_contro</link>
		<comments>https://blog.developpez.com/bertrandvergnault/p10524/sharepoint/shp2010_modifier_l_apparence_d_un_contro#comments</comments>
		<pubDate>Tue, 22 Nov 2011 07:33:01 +0000</pubDate>
		<dc:creator><![CDATA[bertrandv]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un Control Adapter permet de modifier l’apparence de contrôles en récupérant le flux HTML généré par celui-ci. Dans le cadre de SharePoint on peut du coup l’utiliser pour venir modifier l’apparence de certains contrôles natifs. Pour cela, il faut créer une classe qui héritera de la classe ControlAdapter (dans l’espace de noms System.Web.UI.Adapters) et venir redéfinir la méthode Render : public class InputFormDropDownListAdapter : ControlAdapter { protected override void Render(System.Web.UI.HtmlTextWriter writer) { StringBuilder sb = [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Un Control Adapter permet de modifier l’apparence de contrôles en récupérant le flux HTML généré par celui-ci.<br />
Dans le cadre de SharePoint on peut du coup l’utiliser pour venir modifier l’apparence de certains contrôles natifs.<br />
Pour cela, il faut créer une classe qui héritera de la classe <b>ControlAdapter</b> (dans l’espace de noms System.Web.UI.Adapters) et venir redéfinir la méthode <b>Render</b> :<br />
</p>
<pre>public class InputFormDropDownListAdapter : ControlAdapter    
{        
    protected override void Render(System.Web.UI.HtmlTextWriter writer)        
    {            
        StringBuilder sb = new StringBuilder();            
        HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb));            
        base.Render(htw);                        
        string stringToWrite = sb.ToString();             
        //Modifier la chaine "stringToWrite" à écrire dans le rendu du contrôle...             
        writer.Write(stringToWrite);        
    }    
}</pre>
<p>
Il faut maintenant mettre en place la prise en compte de ce ControlAdapter par le navigateur.<br />
<br />
Pour cela, il faut se placer dans le <b>constructeur</b> de la <b>masterPage</b><br />
qui sera utilisée par SharePoint :<br />
</p>
<pre>public SiteMaster()        
{            
    var adapters = HttpContext.Current.Request.Browser.Adapters;            
    var key = typeof(Microsoft.SharePoint.Portal.WebControls.InputFormDropDownList).AssemblyQualifiedName;            
    if (!adapters.Contains(key))            
    {                
        var adapter = typeof(InputFormDropDownListAdapter).AssemblyQualifiedName;                
        adapters.Add(key, adapter);            
    }        
}</pre>
<p>
La clé de l’entrée du dictionnaire correspond au nom de l’assembly du type du contrôle dont<br />
on viendra modifier l’apparence.<br />
<br />
La valeur de l’entrée du dictionnaire correspond au nom de l’assembly du controlAdapter<br />
que l’on a développé plus haut.<br />
<br />
Il est ainsi possible de modifier l’apparence des contrôles natifs de SharePoint…</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
