Sharegate ne migre pas vos alertes SharePoint… PowerShell va vous sauver !

Bonjour à tous !

Puisque Patrick Guimonet se met à faire de l’Azure (voir son excellent billet de cette semaine), une fois n’est pas coutume, je vais faire du SharePoint ! Y’a pas de raison !

Comme vous le savez peut-être, les projets Azure ne me prennent pas tout mon temps : je suis aussi consultant SharePoint (heureusement, de moins en moins).

Je me suis récemment confronté à une problématique lors d’une migration de SharePoint 2007 vers SharePoint 2013. Pour ce faire, j’utilise Sharegate. Il se trouve que cet excellent outil (dans sa version actuelle) ne migre pas les alertes. Tout comme le ciblage d’audience sur les webparts d’ailleurs, mais c’est un autre problème.
Vous pouvez d’ailleurs vous rendre sur ce thread pour plus d’informations (et de plaintes ^^) à ce sujet.

Migration SharePoint

Pour mon client, le transfert des alertes était un prérequis essentiel à la réussite de sa migration ; ce que l’on peut aisément comprendre.

J’ai donc entrepris de faire un petit peu de PowerShell pour résoudre cet épineux problème. Le principe est simple : on exporte les informations des alertes du SharePoint 2007 dans un fichier CSV, et on les recréé sur la plateforme SharePoint 2013.

Let’s rock with PowerShell !

1. Préparez PowerShell, si vous êtes sur SharePoint 2007 (non nécessaire pour 2010 ou 2013).

 Set-ExecutionPolicy RemoteSigned  

Puis :

 [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")  

Merci Technet !

2. Exportez vos alertes depuis SharePoint 2007 vers un fichier CSV. Exécutez le code ci-dessous (après avoir renseigné l’adresse de votre collection de site) dans PowerShell

 #For your SharePoint Server 2007 source  
 $SPsiteCollection = New-Object Microsoft.SharePoint.SPSite("YOUR SITE COLLECTION URL")  
 #Array instantiation  
 $arrAlerts_To_Export = @()  
 $arrAlerts_Columns = @("Counter","SiteUrl","ListName","AlertType","AlertEventType","AlertFrequency","AlertTitle","AlertUser")  
 $alertCounter = 0  
 # Iterate through all Webs in the Site Collection   
 foreach($SPweb in $SPsiteCollection.AllWebs)   
 {   
      foreach($alert in $SPweb.Alerts)   
   {   
           #If needed, uncomment this to show alerts informations  
           #Write-Host "Count : " $alertCounter  
           #Write-Host "Site : " $SPweb.Url  
           #Write-Host "List Name : " $alert.List  
           #Write-Host "Alert Type : " $alert.AlertType  
           #Write-Host "Alert Event Type : " $alert.EventType  
           #Write-Host "Alert Frequency : " $alert.AlertFrequency  
           #Write-Host "Alerts Title : " $alert.title   
           #write-host "Subscribed User: " $alert.user   
           #write-host "=============================="  
           #Add datas to an array  
           $currentAlert = new-object PSObject  
           $currentAlertString = @($alertCounter,$SPweb.Url,$alert.List,$alert.AlertType,$alert.EventType,$alert.AlertFrequency,$alert.title,$alert.user)  
           for ($i=0;$i -lt 8; $i++){  
           $currentAlert | add-member -membertype NoteProperty -name $arrAlerts_Columns[$i] -value $currentAlertString[$i]  
           }  
        $arrAlerts_To_Export+=$currentAlert  
        $currentAlert=$null  
        $alertCounter++  
    }   
 }  
 #Write datas to a CSV file  
 Write-Host "Exported alerts count : " $alertCounter  
 $arrAlerts_To_Export | export-csv C:\alertExport.csv -NoTypeInformation -Encoding unicode  

3. Copiez le fichier CSV nouvellement généré sur votre serveur SharePoint 2013

4. Dans SharePoint Management Shell, lancez ce script pour l’import et la création des alertes

 #Set var  
 $AlertsFilePath = "C:\alertExport.csv"  
 #The URL of the old SharePoint sites collection without slashes eg. "http://myoldsharepoint:80/"
 $OldSPUrl = "YOUR 2007 SHAREPPOINT URL" 
 #The URL of the new SharePoint sites collection without slashes eg. "http://mynewsharepoint:80"
 $NewSPUrl = "YOUR 2013 SHAREPOINT URL"  
 #Get the CSV  
 $Alerts = Import-CSV $AlertsFilePath   
 #$site = Get-SPSite $NewSPUrl  
 #Foreach line...  
 ForEach ($Alert in $Alerts) {  
      Try {  
           #Prepare the URL  
           $old_url = $Alert.SiteUrl;  
           $new_url = $old_url -replace $OldSPUrl, $NewSPUrl  
           #Connect to the right site  
           $web=Get-SPWeb -Identity $new_url  
           #Get the library $Victim.Name  
           $list=$web.Lists.TryGetList($Alert.ListName)  
           #Set datas and create the alert  
           $user = $web.EnsureUser($Alert.AlertUser)  
           $newAlert = $user.Alerts.Add()  
           $newAlert.Title = $Alert.AlertTitle  
           if ($Alert.AlertType -eq "Item") {  
                $newAlert.AlertType=[Microsoft.SharePoint.SPAlertType]::Item  
           }  
           elseif ($Alert.AlertType -eq "List") {  
                $newAlert.AlertType=[Microsoft.SharePoint.SPAlertType]::List  
           }  
           $newAlert.List = $list  
           $newAlert.DeliveryChannels = [Microsoft.SharePoint.SPAlertDeliveryChannels]::Email  
           if ($Alert.EventType -eq "Item") {  
                $newAlert.EventType = [Microsoft.SharePoint.SPEventType]::Item  
           }  
           elseif ($Alert.AlertEventType -eq "List") {  
                $newAlert.EventType = [Microsoft.SharePoint.SPEventType]::List  
           }  
           if ($Alert.AlertFrequency -eq "Daily") {  
                $newAlert.AlertFrequency = [Microsoft.SharePoint.SPAlertFrequency]::Daily  
           }  
           elseif ($Alert.AlertFrequency -eq "Immediate") {  
                $newAlert.AlertFrequency = [Microsoft.SharePoint.SPAlertFrequency]::Immediate  
           }  
           elseif ($Alert.AlertFrequency -eq "Weekly") {  
                $newAlert.AlertFrequency = [Microsoft.SharePoint.SPAlertFrequency]::Weekly  
           }  
           $newAlert.Update()  
      }  
      Catch {  
           Write-Host "Error on : " $Alert.Counter  
           Write-Host $_.Exception.Message  
           Write-Host ========================  
      }  
 }  

Notez que cette méthode peut également servir pour migrer ou transférer des alerter depuis et vers n’importe quelle version de SharePoint 2007, 2010 ou 2013.

5. Supprimez toutes les alertes (facultatif)
Ce script peut vous servir si vous rencontrez des erreurs lors d’un premier import et que vous souhaitez repartir d’une base propre.

 $SPsiteCollection = Get-SPSite "YOUR SHAREPOINT 2013 URL"  
 # Iterate through all Webs in the Site Collection   
 foreach($SPweb in $SPsiteCollection.AllWebs)   
 {   
      $myalerts = @()  
      foreach($alert in $SPweb.Alerts)  
      {  
             $myalerts += $alert  
      }  
      if ($myalerts.Count -gt 0)  
      {  
           foreach ($alertdel in $myalerts)  
           {  
                $SPweb.Alerts.Delete($alertdel.ID)  
           }  
      }  
 }  

Et voilà ! Vous pouvez maintenant palier à ce petit manque de Sharegate

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s