Restaurer des milliers d'éléments supprimés par une personne sur un site Sharepoint peut être une opération fastidieuse, voici donc un script Powershell pour le faire à votre place et vous bénéficierez aussi d'un rapport d'état ("Success", "Failure") pour chacun des éléments.
1 - Prérequis Powershell
Dans un premier temps nous allons avoir besoin d’installer le module Powershell nécessaire à la gestion de Sharepoint, pour ce faire utilisez la commande suivante :
# Installation du Module Powershell
Install-Module SharePointPnPPowerShellOnline
Une fois le module Powershell installé nous allons pouvoir nous connecter au site et atteindre sa corbeille de là nous pourrons faire le filtrage et l’export des éléments.
2 - Script Powershell
# Script to Restore RecycleBin elements
# By : Mathieu ADELAÏDE
# Date : 06/09/2019
# Version : V0
#######################
# Step 0 : Management #
#######################
#region - Step 0
# Folder Definition
# Get Current Path
$currentPath = (Get-Location).Path
$RootFolder = "C:\Temp\Sharepoint"
$LogFolder = "$RootFolder\Log"
#Folder Creation
$AllFolder = $RootFolder, $LogFolder
$AllFolder | foreach {
$FolderName = $_
If (!(Test-Path $FolderName)) {
New-Item $FolderName -ItemType Directory
}
}
# Files Definition
$ResultState = "$LogFolder\RestaurationReport.csv"
Add-Content $ResultState -Value "Title;ItemType;Size;ItemState;DirName;DeletedByName;DeletedDate;ID;State"
$logFilePath = "$logFolder\SP_Restauration.log"
#Define Array
$Array = @()
#Config Variables
$SiteURL = "https://MySite.sharepoint.com/sites/Recrutement"
#endregion - Step 0
#######################
# Step 1 : Connection #
#######################
#region - Step 1
#Connect to Sharepoint Online
Try {
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)
}
Catch {
$tmpError = $_.Exception.message
Write-Output "The following error occurred: $tmpError" | Add-Content $logFilePath
Write-Output "The error occurred while we trying to Connect to Sharepoint Online" | Add-Content $logFilePath
}
#endregion - Step 1
#######################################
# Step 2 : Collection and Restoration #
#######################################
#region - Step 2
# List all Items
$RecycleBin = Get-PnPRecycleBinItem
# Filter result
$FilteredRecycleBin = $RecycleBin.Where({$_.DeletedByName -eq "DUPONT Jean"})
$FilteredRecycleBin | foreach {
$Title = $_.Title
$ItemType = $_.ItemType
$Size = $_.Size
$ItemState = $_.ItemState
$DirName = $_.DirName
$DeletedByName = $_.DeletedByName
$DeletedDate = $_.DeletedDate
$ID = $_.id
$Guid = $ID.Guid
# Restore
Try {
Restore-PnPRecycleBinItem -Identity $Guid -Force -ErrorAction Stop
Write-Output "Successfully Restored File $Title" | Add-Content $logFilePath
$State = "Succes"
}
Catch {
$tmpError = $_.Exception.message
Write-Output "The following error occurred: $tmpError" | Add-Content $logFilePath
Write-Output "The error occurred while we trying to Restore $Title" | Add-Content $logFilePath
$State = "Failed"
}
$Array += New-Object psobject -Property @{
Title = $Title
ItemType = $ItemType
Size = $Size
ItemState = $ItemState
DirName = $DirName
DeletedByName = $DeletedByName
DeletedDate = $DeletedDate
State = $State
Id = $id
}
# Release variable
$Title = $null
$ItemType = $null
$Size = $null
$ItemState = $null
$DirName = $null
$DeletedByName = $null
$DeletedDate = $null
$ID = $null
$State = $null
$Guid = $null
}
#endregion - Step 2
###################
# Step 3 : Export #
###################
#region - Step 3
Try {
$Array | Export-Csv $ResultState -Encoding UTF8 -NoTypeInformation -Delimiter ";"
Write-Output "Successfully Export Data" | Add-Content $logFilePath
}
Catch {
$tmpError = $_.Exception.message
Write-Output "The following error occurred: $tmpError" | Add-Content $logFilePath
Write-Output "The error occurred while we trying to Export Data" | Add-Content $logFilePath
}
#endregion - Step 3
Récemment j’ai été confronté à un sujet délicat, une synchronisation entre Sharepoint Online et un poste client s’est terminée par la suppression de la majorité des dossiers et fichiers du site en question.
Pour pouvoir connaitre l’étendue des dégâts il a fallu faire un audit de ce qui avait été supprimés par erreur.
On pourrait le faire graphiquement via le portail, mais lorsque le nombre d’éléments s’élève à plusieurs milliers ce n’est pas pratique.
Voici une petite astuce pour faire un export au format CSV des éléments dans la corbeille et en option comment les filtrer sur un utilisateur en particulier.
1 - Prérequis Powershell
Dans un premier temps nous allons avoir besoin d’installer le module Powershell nécessaire à la gestion de Sharepoint, pour ce faire utilisez la commande suivante :
# Installation du Module Powershell
Install-Module SharePointPnPPowerShellOnline
Une fois le module Powershell installé nous allons pouvoir nous connecter au site et atteindre sa corbeille de là nous pourrons faire le filtrage et l’export des éléments.
2 - Script Powershell
2.1 Version avec tous les éléments de la corbeille.
#Config Variables
$SiteURL = "https://Monsite.sharepoint.com/sites/Recrutement"
$Items = "C:\temp\RecycleBinItems.csv"
Add-Content $Items -Value "Title;ItemType;Size;ItemState;DirName;DeletedByName;DeletedDate"
$Array = @()
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)
# List and export all Items in Recycle bin
$RecycleBin = Get-PnPRecycleBinItem
$RecycleBin | foreach {
$Title = $_.Title
$ItemType = $_.ItemType
$Size = $_.Size
$ItemState = $_.ItemState
$DirName = $_.DirName
$DeletedByName = $_.DeletedByName
$DeletedDate = $_.DeletedDate
$Array += New-Object psobject -Property @{
Title = $Title
ItemType = $ItemType
Size = $Size
ItemState = $ItemState
DirName = $DirName
DeletedByName = $DeletedByName
DeletedDate = $DeletedDate
}
}
$Array | Export-Csv $Items -Encoding UTF8 -NoTypeInformation
2.2 Version avec option de filtrage.
Dans cette version nous faisons la même requête, en ajoutant un filtrage sur un utilisateur bien précis.
#Config Variables
$SiteURL = "https://Monsite.sharepoint.com/sites/Recrutement"
$Items = "C:\temp\RecycleBinItems.csv"
Add-Content $Items -Value "Title;ItemType;Size;ItemState;DirName;DeletedByName;DeletedDate"
$Array = @()
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)
# List and export all Items in Recycle bin
$RecycleBin = Get-PnPRecycleBinItem
$FilteredRecycleBin = $RecycleBin.Where({$_.DeletedByName -eq "DUPONT Jean"})
$FilteredRecycleBin | foreach {
$Title = $_.Title
$ItemType = $_.ItemType
$Size = $_.Size
$ItemState = $_.ItemState
$DirName = $_.DirName
$DeletedByName = $_.DeletedByName
$DeletedDate = $_.DeletedDate
$Array += New-Object psobject -Property @{
Title = $Title
ItemType = $ItemType
Size = $Size
ItemState = $ItemState
DirName = $DirName
DeletedByName = $DeletedByName
DeletedDate = $DeletedDate
}
}
$Array | Export-Csv $Items -Encoding UTF8 -NoTypeInformation