mardi 30 juin 2015

Suppression de documents en masse dans SharePoint à l'aide de SPWeb.ProcessBatchData

Aujourd'hui je dois supprimer plus de 100.000 documents dans plusieurs collection de sites et le tout en un temps de traitement le plus court qui soit, VDM.

Cela aurait pu se terminer comme ça !

Plus sérieusement, SharePoint offre plusieurs moyen pour supprimer des éléments au sein d'une liste / Bibliothèque. En revanche toutes les méthodes ne sont pas aussi performantes, en particulier la fonction SPList.Items.DeleteById si cette fonction reste facile à utiliser et à mettre en place lors de la suppression d'un ou plusieurs éléments.

Mais lorsqu'il s'agit de supprimer plusieurs milliers d'élément cela va lentement très très lentement (environ 3-4 secondes par fichier sur un environnement de développement) Alors effectuer ce traitement sur un volume plus important va vite devenir problématique.

Heureusement une autre fonction existe et permet d'effectuer des traitements par lot.  La méthode SPWeb.ProcessBatchData prend en paramètre une chaîne CAML (Collaborative Application Markup Language) qui contient les commandes, qui se compose d'un élément de Batch et un nombre quelconque d'éléments subordonnés Method qui spécifient chacun une méthode d'appel (RPC) de procédure à distance SharePoint .

 La forme la plus simple est la suivante:
<batch>
  <method>
    <setlist scope="Request">ID_LIST</setlist>
    <setvar name="ID">ID_ELEMENT</setvar>
    <setvar md="" name="`">COMMANDE</setvar>
  </method>
</batch>

Dans le cadre d'une suppression en masse la fonction suivante qui prend en paramètre l'url du site et le nom de la bibliothèque permet de supprimer les éléments par lot de 2000.
Une requête CAML permet de faire un filtre sur les documents à supprimer.

Function purgeSite($params){

$web = get-spweb $params[0]
$list = $web.lists[$params[1]]

    try
    {
        $i=0
        $spQuery = New-Object Microsoft.SharePoint.SPQuery
        $spQuery.ViewFieldsOnly = $true
        $spQuery.Query = "<where><lt><fieldref name="Created"><value type="DateTime"><today offsetdays="2"></today></value></fieldref></lt></where>"
        $spQuery.RowLimit = 2000;
        $itemCount = 0;          
        $listId = $list.ID;

        do
        {
            [System.Text.StringBuilder]$batchXml = New-Object "System.Text.StringBuilder";
            $batchXml.Append("<batch>");
            $command = [System.String]::Format( "<method><setlist scope="Request">{0}</setlist><setvar name="`">{1}</setvar><setvar name="owsfileref">{2}</setvar><setvar md="" name="`">Delete</setvar></method>", $listId, "{0}","{1}" );

            $listItems = $list.GetItems($spQuery)
            $spQuery.ListItemCollectionPosition = $listItems.ListItemCollectionPosition
            $count = $listItems.Count

            Write-Host $count
            foreach ($item in $listItems)
            {
                Write-Host -ForegroundColor Green "Delete item "$item.ID
                $list.Items.DeleteItemById($item.ID)
                if($item -ne $null)
                {
                    $batchXml.Append([System.String]::Format($command, $item.ID.ToString(),$item["FileRef"])) | Out-Null;
                }
                #break;
            }
            $batchXml.Append("</batch>");

          #  $web.ProcessBatchData($batchXml.ToString())

            $result = $web.ProcessBatchData($batchXml.ToString())
       
            $web.RecycleBin.DeleteAll()

        }
        while ($spQuery.ListItemCollectionPosition -ne $null)
    }
    catch
    {
        Write-Host -ForegroundColor Red $_.Exception.ToString()
    }
}

mardi 7 octobre 2014

Liste des ports standards utilisés par SharePoint 2013


Protocol Port Usage Comment
TCP 80 http Client to SharePoint web server traffic



(SharePoint – Office Web Apps communication)
TCP 443 https/ssl Encrypted client to SharePoint web server traffic



(Encrypted SharePoint – Office Web Apps communication)
TCP 1433 SQL Server default communication port. May be configured to use custom port for increased security
UDP 1434 SQL Server default port used to establish connection May be configured to use custom port for increased security
TCP 445 SQL Server using named pipes When SQL Server is configured to listen for incoming client connections by using named pipes over a NetBIOS session, SQL Server communicates over TCP port 445
TCP 25 SMTP for e-mail integration Cannot be configured
TCP 16500-16519 Ports used by the search index component Intra-farm only



Inbound rule Added to Windows firewall by SharePoint
TCP 22233-22236 Ports required for the AppFabric Caching Service Distributed Cache…
TCP 808 Windows Communication Foundation communication WCF
TCP 32843 Communication between Web servers and service applications http (default) To use custom port, see references section



Inbound rule Added to Windows firewall by SharePoint
TCP 32844 Communication between Web servers and service applications https



Inbound rule Added to Windows firewall by SharePoint
TCP 32845 net.tcp binding: TCP 32845 (only if a third party has implemented this option for a service application)  Custom Service Applications



Inbound rule Added to Windows firewall by SharePoint
TCP 32846 Microsoft SharePoint Foundation User Code Service (for sandbox solutions)  Inbound on all Web Servers



Inbound rule Added to Windows firewall by SharePoint



Outbound on all Web and App servers with service enabled.
TCP 5725 User Profile Synchronization Service(FIM) Synchronizing profiles between SharePoint 2013 and Active Directory Domain Services (AD DS) on the server that runs the Forefront Identity Management agent
TCP + UDP 389 User Profile Synchronization Service(FIM) LDAP Service
TCP + UDP 88 User Profile Synchronization Service(FIM) Kerberos
TCP + UDP 53 User Profile Synchronization Service(FIM) DNS
UDP 464 User Profile Service(FIM) Kerberos change password
TCP 809 Office Web Apps Intra-farm Office Web Apps communication.

lundi 6 octobre 2014

Powershell : Reporting Service, modification de l'email d'abonnement


L'exemple de script PowerShell suivant met à jour la configuration de l'extension de remise du courrier électronique par le serveur de rapports pour l'application de service nommée My RS Service App. Mettez à jour les valeurs du serveur SMTP

#Modification de l'email Service reporting
$app=get-sprsserviceapplication -Name $rsService
$emailCfg = Get-SPRSExtension -identity $app -ExtensionType "Delivery" -name "Report Server Email" | select -ExpandProperty ConfigurationXml
$emailXml = [xml]$emailCfg
$emailXml.SelectSingleNode("//SMTPServer").InnerText = $smptServer
$emailXml.SelectSingleNode("//SendUsing").InnerText = "2"
$emailXml.SelectSingleNode("//SMTPAuthenticate").InnerText = "2"
$emailXml.SelectSingleNode("//From").InnerText = $fromAddr
Set-SPRSExtension -identity $app -ExtensionType "Delivery" -name "Report Server Email" -ExtensionConfiguration $emailXml.OuterXml



Powershell : Modification du SMTP SharePoint 2013

# Adresse du serveur SMTP
$smptServer = 'smtp.server.com'
# Adresse mail d envoi
$fromAddr = 'noreply@mydomaine.com'
# Adresse mail de réponse
$replyAddr = 'noreply@mydomaine.com'


#Ne rien modifier à partir de cette ligne

#serveurs smtp
Add-PSSnapin Microsoft.SharePoint.PowerShell

$SMTPSvr = $smptServer
$FromAddr = $fromAddr
$ReplyAddr = $replyAddr
$Charset = 65001

vendredi 27 juin 2014

SharePoint 2013 + AjaxControlToolkit 4.5 intégration dans votre solution Visual Studio

De quoi parle-t-on ? 

ASP.NET AJAX Control Toolkit est un projet open-source intégré au framework Microsoft ASP.NET AJAX. Il s'agit d'un effort conjoint entre Microsoft et la communauté ASP.NET AJAX qui fournit une infrastructure puissante pour écrire des composants réutilisables, personnalisables et extensibles ASP.NET AJAX et des contrôles, ainsi que d'un riche éventail de contrôles qui peuvent être utilisé out-of-the-box pour créer une expérience Web interactive.

L'AJAX Control Toolkit contient plus de 30 contrôles qui vous permettent de créer facilement des pages  Web interactives riches.

La liste complète des contrôles disponibles se trouve sur cette page: http://www.asp.net/AjaxLibrary/AjaxControlToolkitSampleSite/Default.aspx

Intégration à une solution SharePoint 2013 sur Visual Studio 2012

A. Premièrement il vous faudra télécharger la version correspondant au framework .NET 4.5 à l'adresse suivante sur la plateforme CodePlex: 
Dézipper finalement l'archive sur votre serveur pour pouvoir ensuite référencer les dlls.

B. Nous allons maintenant référencer les dlls suivantes dans le projet Visual studio :
  • AjaxControlToolkit.dll
  • AjaxMin.dll
C. Ajout des SafeControls à la solution: dans le dossier "Package" de votre solution cliquez sur le fichier Package.package pour le modifier, puis allez dans l'onglet "Advanced"


Cliquez sur Add puis sur "Add existing assembly", sélectionnez la dll  AjaxControlToolKit depuis un sous-dossier de votre solution 
  • Name space :AjaxControlToolkit
  • TypeName : *
  • Assembly : AjaxControlToolkit, Version=4.5.7.1005, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e
Effectuez la même manipulation avec le fichier AjaxMin.dll

  • NameSpace: AjaxMin.dll
  • TypeName: *
  • Assembly : AjaxMin, Version=4.97.4951.28478, Culture=neutral, PublicKeyToken=21ef50ce11b5d80f




D.Ajoutez ensuite dans le fichier web.config de votre WebApplication situez sous le répertoire  "C:\inetpub\wwwroot\wss\VirtualDirectories\[Your web application Port]"  une référence à l'assembly référencé ou encore passez par une feature de scope Web  Application avec l'event receiver suivant pour effectuer la modification automatiquement:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;

            var configModAssembly = new SPWebConfigModification
            {
                Name = "add[@assembly=\"AjaxControlToolkit, Version=4.5.7.1005, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e\"]",
                Owner = "AjaxControlToolkitWebConfig",
                Path = "configuration/system.web/compilation/assemblies",
                Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
                Value = "<add assembly=\"AjaxControlToolkit, Version=4.5.7.1005, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e\" />"

            };

            var configModAssembly2 = new SPWebConfigModification
            {
                Name = "add[@assembly=\"AjaxMin, Version=4.97.4951.28478, Culture=neutral, PublicKeyToken=21ef50ce11b5d80f\"]",
                Owner = "AjaxControlToolkitWebConfig",
                Path = "configuration/system.web/compilation/assemblies",
                Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
                Value = "<add assembly=\"AjaxMin, Version=4.97.4951.28478, Culture=neutral, PublicKeyToken=21ef50ce11b5d80f\" />"
            };

            webApp.WebConfigModifications.Add(configModAssembly);
            webApp.WebConfigModifications.Add(configModAssembly2);

            /*Call Update and ApplyWebConfigModifications to save changes*/
            SPWebService.ContentService.WebApplications[webApp.Id].WebConfigModifications.Add(configModAssembly);
            SPWebService.ContentService.WebApplications[webApp.Id].WebConfigModifications.Add(configModAssembly2);
            SPWebService.ContentService.WebApplications[webApp.Id].Update();
            SPWebService.ContentService.WebApplications[webApp.Id].WebService.ApplyWebConfigModifications();
        }

E.Déplacez la section suivante de votre fichier master .html depuis la balise head vers la balise body.

après:

Ajoutez également une référence dans votre masterpage avec la ligne suivante:

<%@Register TagPrefix="ajaxToolkit" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit, Version=4.5.7.1005, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" %>


Vous êtes maintenant prêt à utiliser les contrôles AjaxControlToolKit au sein de vos webparts.


lundi 23 juin 2014

Design : Sharepoint Palette tool 2013

Ami designer en herbe, Microsoft dispose d'un programme vous permettant de créer et de modifier les fichiers spColor qui constitue la partie thème de SharePoint.

Grâce à cette outil il est possible de générer automatiquement le fichier permettant de customizer votre portail en quelques clics.


Il ne reste plus qu'ensuite à importer le fichier grâce à SharePoint Designer dans le dossier

/_catalogs/theme/15 de votre site SharePoint Online ou SharePoint 2013


Et à modifier le thème de votre site via la page de modification d'apparence.

http://www.microsoft.com/en-us/download/details.aspx?id=38182