Les clichés Microsoft (Snapshot) sauvegardent les droits, mais ne les restaurent pas!

L’activation des clichés sur les serveurs de fichiers Windows est une fonctionnalité très pratique pour que les utilisateurs puissent restaurer d’anciennes versions de leurs documents. Mais, attention, Microsoft précise bien qu’il ne faut pas voir cela comme une sauvegarde des données.

En voici une des raisons que l’un de mes clients a malheureusement constatée. Tous les attributs et en particulier la sécurité, sont bien sauvegardés par le mécanisme de cliché. Ceux-ci permettent de n’autoriser que les utilisateurs possédant les bons droits à accéder à ces copies. En revanche, lors d’une restauration totale ou partielle, les droits ne sont pas repris, et les éléments restaurés héritent automatiquement des droits du dossier dans lequel ils sont restaurés.

Ceci ne cause aucun problème lors de la restauration d’un document par l’utilisateur. En revanche, elle est très impactante pour un administrateur qui souhaiterait restaurer la totalité d’une arborescence de dossiers, par exemple après une application malheureuse d’un droit sur la racine. La seule solution logique est de restaurer la dernière sauvegarde « normale », avec le risque de perdre tout ou partie des modifications réalisées depuis la dernière sauvegarde. L’autre solution est de réappliquer manuellement les droits visualisés dans le cliché, dossier par dossier, en commençant par les dossiers racines. Mais il faudrait ensuite vérifier tous les sous-dossiers un par un… Ce qui devient infaisable.

J’ai donc créé 2 scripts permettant d’automatiser la récupération des droits sur tout ou partie des dossiers.

Le premier script permet d’obtenir la liste des clichés disponibles :

PS C:\Users\Administrator> .\SnapList.ps1

Liste de tous les clichés existants

Numéro Temps Réel Temps universel (utilisé dans RecoverSecurityFromSnap)

1 2013.05.30-18.19.17 2013.05.30-16.19.17

2 2013.05.30-12.00.06 2013.05.30-10.00.06

3 2013.05.30-12.00.02 2013.05.30-10.00.02

4 2013.05.29-17.47.53 2013.05.29-15.47.53

5 2013.05.29-12.00.08 2013.05.29-10.00.08

 

Les noms des clichés correspondent à la valeur « temps universel ».

La liste des clichés provient de tous les disques (locaux) qui en contiennent !

Vérifier dans l’interface graphique que le cliché choisi contienne bien l’information souhaitée (droits corrects avant la modification).

Ensuite, utilisez le script principal pour restaurer la sécurité à partir du cliché et du dossier souhaité.

PS C:\Users\Administrator> .\RecoverSecurityFromSnap.ps1 2013.05.30-10.00.02 c:\data\APPLI

Récupération des droits sur le dossier c:\data\APPLI

A partir du cliché : 2013.05.30-10.00.02

droits récupérés sur C:\data\APPLI

droits récupérés sur C:\data\APPLI\APPLI1

droits récupérés sur C:\data\APPLI\APPLI2

 

Les scripts seront disponibles dans cet article, puis mis à jour sur le site Microsoft https://gallery.technet.microsoft.com/. En effet, des fonctionnalités supplémentaires seront ajoutées afin de pouvoir récupérer les droits spécifiques que pourraient avoir certains fichiers, et les propriétaires correspondants.

Il serait intéressant que Microsoft permette de restaurer ces attributs directement à partir de l’interface, tout au moins pour les administrateurs.

---- Script de liste des clichés ----- SnapList.PS1
write-output "Liste de tous les clichés existants"

$ListSnaps = Get-WmiObject Win32_ShadowCopy | Select-Object InstallDate | sort-object InstallDate -Descending
$i=0
write-output "Numéro Temps Réel Temps universel (A utiliser dans RecoverSecurityFromSnap)"
foreach ($x in $ListSnaps) {
$b = [System.Management.ManagementDateTimeConverter]::ToDateTime($x[0].InstallDate).ToString("yyyy.MM.dd-HH.mm.ss")
$c = [System.Management.ManagementDateTimeConverter]::ToDateTime($x[0].InstallDate).ToUniversalTime().ToString("yyyy.MM.dd-HH.mm.ss")
$i+=1
write-output "$i $b $c"
}
---- Script de récupération des droits à partir d'un cliché ----- RecoverSecurityFromSnap.PS1
param ($DateSnap,$folder)

IF ($folder -eq $null) {
$folder=get-item "."
$folder=$folder.fullname
}

IF ($DateSnap -eq $null) {
write-output "Utiliser ListCliche.ps1 pour déterminer le Cliché à utiliser"
break
}
else
{ $global:DateSauvegarde=$DateSnap }

write-output "Récupération des droits sur le dossier $Folder"

Choose Snapshot

write-output "A partir du cliché : $global:DateSauvegarde"

function RecoverPerms($PARAMS){
$Unit=$params.substring(0,1)
$Chemin=$params.substring(3)

$foldSource=get-item "\localhost$Unit$@GMT-$DateSauvegarde$Chemin"

echo $FoldSource

$FoldPerms=[System.Security.AccessControl.DirectorySecurity](get-ACL $foldSource)
#write-output $FoldPerms
$FoldDest=get-item $params
Set-ACL -aclobject $FoldPerms -path $FoldDest
write-output "Droits récupérés sur $FoldDest"
}

Function RecurseFolder($f)
{
$fold=$f
$ListFold=get-childitem $fold -force |where {$_.mode -like "d" }
foreach ($e in $ListFold){
$FD=$e.fullname
RecoverPerms $FD
}
foreach ($e in $ListFold){
RecurseFolder($e.fullname)
}
}

RecoverPerms($Folder)
RecurseFolder($Folder)