Besoin de déclencher une copie instantanée (VSS) du disque C: depuis PowerShell, en plaçant la zone de stockage sur un autre volume local et, si besoin, d’exporter le contenu vers un partage réseau ? Suivez ce guide pas‑à‑pas, fiable et reproductible.
Vue d’ensemble
Le service Volume Shadow Copy (VSS) permet de capturer un cliché cohérent d’un volume NTFS. Deux points essentiels guident la mise en œuvre :
- La zone de stockage des clichés (aussi appelée diff area) doit être un volume NTFS local. Elle peut être différente du volume source (ex.
C:
→E:
), mais ne peut pas être un partage réseau. - On peut ensuite monter le cliché et copier ses données vers un NAS (
\\NAS\Sauvegardes
) avec un outil de copie (Robocopy, etc.).
Ce que vous allez accomplir
- Vérifier l’éligibilité (NTFS, droits, état du service VSS).
- Rediriger la zone de stockage VSS de
C:
vers un autre volume local (ex.E:
). - Créer la copie instantanée depuis PowerShell.
- Monter le cliché et exporter ses données vers un disque externe ou un partage réseau.
- Mettre en place un script complet et une planification (tâche planifiée).
Rappels et limites VSS
Point clé | Explication |
---|---|
Emplacement de la zone de stockage | Volume NTFS local uniquement. Différent du volume source autorisé (/for=C: et /on=E: ). Réseau non supporté. |
Type de volume | VSS (fournisseur système) s’appuie sur NTFS. Les volumes FAT/exFAT/ReFS ne sont pas éligibles à cette procédure. |
Exposition réseau | Impossible de définir la zone de stockage /on= vers \\NAS\... . Pour un NAS, on copie ensuite le contenu du cliché monté. |
Outils de création | diskshadow (recommandé) ou WMI/CIM (Win32_ShadowCopy ). wmic est déprécié sur les versions récentes. |
Impact performance | Plus la zone de stockage est lente (ex. USB 2.0), plus les écritures sur le volume source peuvent être pénalisées (gestion des blocs modifiés). |
Pré‑requis et vérifications rapides
- Ouvrez PowerShell en administrateur.
- Vérifiez le type et le système de fichiers des volumes :
Get-Volume | Select DriveLetter, FileSystem, DriveType | Sort DriveLetter
Le volume destination (ex.E:
) doit êtreNTFS
et vu comme Local Disk (DriveType
=Fixed
). - Assurez-vous que le service VSS n’est pas désactivé :
Get-Service VSS # Démarrer si nécessaire Start-Service VSS -ErrorAction SilentlyContinue
- Confirmez que vous utilisez le bon exécutable vssadmin (64 bits) :
Get-Command vssadmin | Format-List Source
Chemin attendu :C:\Windows\System32\vssadmin.exe
.
Rediriger la zone de stockage vers un autre volume local
Si votre volume source est C:
et que vous disposez d’un second volume NTFS local E:
(disque interne/USB), créez l’association :
# 20% de E: réservés à C: pour VSS
vssadmin add shadowstorage /for=C: /on=E: /maxsize=20%
# Alternative : taille illimitée (à éviter sans supervision)
# vssadmin add shadowstorage /for=C: /on=E: /maxsize=UNBOUNDED
# Vérifier
vssadmin list shadowstorage
Dimensionnement recommandé
Cas d’usage | Taille conseillée | Commentaire |
---|---|---|
Poste standard (Office, navigation) | 10–15 % du volume source | Faible churn ; plusieurs clichés peuvent tenir. |
Développement, VM locales | 15–25 % | Beaucoup de modifications ; ajuster selon la rotation. |
Serveur de fichiers | 20–30 % (ou taille fixe) | Churn important ; préférer une limite fixe surveillée. |
Créer la copie instantanée (PowerShell)
Deux approches pratiques : DiskShadow (scénarios avancés, exposition directe) ou CIM/WMI (script PowerShell pur). Les deux nécessitent l’association de stockage configurée (vssadmin add shadowstorage
).
Méthode A — DiskShadow piloté par PowerShell
DiskShadow sait créer et exposer un cliché. Exemple de script texte :
$ds = @"
SET CONTEXT PERSISTENT
SET VERBOSE ON
ADD VOLUME C: ALIAS Src
CREATE
"@
$scriptPath = Join-Path $env:TEMP "create_vss.dsh"
$ds | Out-File -FilePath $scriptPath -Encoding ASCII
diskshadow /s $scriptPath
Après la création, utilisez vssadmin list shadows /for=C:
pour récupérer l’ID et/ou le chemin Device Object (\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyXX
), puis exposez ou montez (voir plus bas).
Méthode B — Classe CIM Win32_ShadowCopy
(PowerShell pur)
Cette méthode renvoie directement l’ID du cliché et son chemin DeviceObject :
# Créer un cliché "client accessible"
$create = Invoke-CimMethod -ClassName Win32_ShadowCopy -MethodName Create -Arguments @{
Volume = "C:\"
Context = "ClientAccessible"
}
if ($create.ReturnValue -ne 0) {
throw "La création VSS a échoué (code $($create.ReturnValue))."
}
# Récupérer l’objet pour lire le DeviceObject
$shadow = Get-CimInstance -ClassName Win32_ShadowCopy -Filter "ID='$($create.ShadowID)'"
$shadow.DeviceObject
Monter le cliché et copier vers un NAS ou un autre disque
Une fois la copie instantanée créée, vous pouvez monter son contenu en créant un lien symbolique vers le chemin DeviceObject
, puis copier avec Robocopy.
Montage via lien symbolique
$mount = Join-Path $env:TEMP ("VSS_" + (Get-Date -Format "yyyyMMdd_HHmmss"))
New-Item -ItemType Directory -Path $mount | Out-Null
# Exemple avec l’objet $shadow obtenu ci‑dessus
$dev = $shadow.DeviceObject.TrimEnd('') + ""
# Créer un lien symbolique lisible par les outils habituels
cmd /c "mklink /d `"$mount`" `"$dev`"" | Out-Null
# Vérifier le contenu
Get-ChildItem $mount | Select -First 5
Copie vers un partage réseau (NAS)
Copie efficace avec Robocopy (préserve attributs et horodatages). Adaptez \\NAS\Sauvegardes\C_...
:
$dest = "\\NAS\Sauvegardes\C_$((Get-Date).ToString('yyyyMMdd_HHmmss'))"
New-Item -ItemType Directory -Path $dest -ErrorAction SilentlyContinue | Out-Null
# /E : sous-dossiers, y compris vides
# /COPY:DAT : Data + Attributs + Timestamps
# /DCOPY:T : conserve l'heure des dossiers
# /XJ : ignore les jonctions pour éviter les boucles
# /R:1 /W:1 : 1 tentative, attente 1s
# /MT:16 : multithread (ajustez selon CPU/disque)
robocopy $mount $dest /E /COPY:DAT /DCOPY:T /XJ /R:1 /W:1 /MT:16 /NP /NFL /NDL
# Démontage (supprime le lien, pas les données)
Remove-Item $mount -Force
# Supprimer le cliché pour libérer l'espace (facultatif)
$null = Invoke-CimMethod -InputObject $shadow -MethodName Delete
Remarque : vous pouvez aussi copier vers un autre volume local (ex. F:\Backups
) en remplaçant la destination.
Pourquoi « add shadowstorage » peut sembler absent
Si vssadmin /?
n’affiche pas l’option add shadowstorage
:
- Session non élevée : même si l’aide s’affiche, les opérations échouent sans élévation. Relancez PowerShell en Administrateur.
- Environnement minimal (WinPE, Nano/Server Core tronqué) : certains composants VSS peuvent être absents de l’image.
- Exécutable inattendu : vérifiez le chemin (
System32
) et la version. Sur un OS 64 bits, évitez un PowerShell 32 bits redirigé. - Service VSS désactivé : réactivez‑le et réessayez.
Alternative graphique (selon l’édition)
- Windows Server (rôle serveur de fichiers) : Explorateur → clic droit sur le volume → Configurer les clichés instantanés (Shadow Copies) pour choisir le volume de stockage et la planification.
- Windows Client (10/11) : l’UI « Protection du système » concerne surtout la restauration système et n’offre pas la même granularité VSS par volume. Préférez les commandes et scripts ci‑dessus.
Script PowerShell complet et robuste
Le script ci‑dessous automatise l’ensemble : vérifications, association de stockage, création/montage du cliché, copie vers destination (locale ou réseau) et nettoyage. Il écrit aussi un log minimal.
#requires -RunAsAdministrator
param(
[ValidatePattern('^[A-Z]:\\$')] [string]$SourceVolume = 'C:\',
[ValidatePattern('^[A-Z]:$')] [string]$DiffVolume = 'E:',
[string]$MaxSize = '20%', # ex. "20%" ou "10GB" ou "UNBOUNDED"
[string]$ExportPath = "\\NAS\Sauvegardes", # ou "F:\Backups" ou "" pour ne pas copier
[switch]$DeleteShadowAfterCopy = $true
)
function Write-Log { param([string]$m) "$((Get-Date).ToString('u')) `t $m" | Tee-Object -FilePath "$env:TEMP\VSS-Copy.log" -Append }
function Assert-Admin {
$p = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if (-not $p.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
throw "Exécutez ce script en tant qu'Administrateur."
}
}
function Ensure-VssService {
try {
$svc = Get-Service VSS -ErrorAction Stop
if ($svc.Status -ne 'Running') { Start-Service VSS }
} catch { throw "Service VSS introuvable ou désactivé." }
}
function Ensure-ShadowStorage {
param([string]$For, [string]$On, [string]$Size)
$list = & vssadmin list shadowstorage 2>&1 | Out-String
if ($list -notmatch "(?s)For volume:\s+$For.*?On volume:\s+$On") {
Write-Log "Association VSS absente : For=$For On=$On → création"
& vssadmin add shadowstorage /for=$For /on=$On /maxsize=$Size | Out-Null
} else {
Write-Log "Association VSS déjà présente (For=$For On=$On)"
}
}
function New-VssShadow {
param([string]$Vol)
$ret = Invoke-CimMethod -ClassName Win32_ShadowCopy -MethodName Create -Arguments @{ Volume=$Vol; Context="ClientAccessible" }
if ($ret.ReturnValue -ne 0) { throw "Echec VSS (code $($ret.ReturnValue))." }
Get-CimInstance -ClassName Win32_ShadowCopy -Filter "ID='$($ret.ShadowID)'"
}
function Mount-Shadow {
param([string]$DeviceObject)
$mount = Join-Path $env:TEMP ("VSS_" + (Get-Date -Format "yyyyMMdd_HHmmss"))
New-Item -ItemType Directory -Path $mount | Out-Null
$dev = ($DeviceObject.TrimEnd('') + "")
cmd /c "mklink /d `"$mount`" `"$dev`"" | Out-Null
$mount
}
function Copy-FromMount {
param([string]$MountPath, [string]$Destination)
if ([string]::IsNullOrWhiteSpace($Destination)) { return }
if ($Destination -notmatch '^[A-Za-z]:\|^\\') { throw "Destination invalide : $Destination" }
if ($Destination -like "\\*") {
# Crée le dossier de destination sur le NAS si nécessaire
New-Item -ItemType Directory -Path $Destination -ErrorAction SilentlyContinue | Out-Null
}
$dest = Join-Path $Destination ("C_" + (Get-Date -Format "yyyyMMdd_HHmmss"))
New-Item -ItemType Directory -Path $dest -ErrorAction SilentlyContinue | Out-Null
$args = @("$MountPath", "$dest", "/E", "/COPY:DAT", "/DCOPY:T", "/XJ", "/R:1", "/W:1", "/MT:16", "/NP", "/NFL", "/NDL")
Write-Log "Robocopy vers $dest"
& robocopy @args | Out-Null
return $dest
}
try {
Assert-Admin
Ensure-VssService
Write-Log "Vérifications des volumes"
$sv = $SourceVolume.TrimEnd('')
$dv = $DiffVolume.TrimEnd('')
$srcOk = (Get-Volume -DriveLetter $sv[0]).FileSystem -eq 'NTFS'
$dstOk = (Get-Volume -DriveLetter $dv[0]).FileSystem -eq 'NTFS'
if (-not $srcOk) { throw "Le volume source doit être NTFS." }
if (-not $dstOk) { throw "Le volume de stockage doit être NTFS." }
Ensure-ShadowStorage -For $sv -On $dv -Size $MaxSize
Write-Log "Création du cliché"
$shadow = New-VssShadow -Vol $SourceVolume
Write-Log "Créé : $($shadow.ID)"
$mountPath = Mount-Shadow -DeviceObject $shadow.DeviceObject
Write-Log "Monté sur $mountPath"
$copyDest = Copy-FromMount -MountPath $mountPath -Destination $ExportPath
# Nettoyage
Remove-Item $mountPath -Force
if ($DeleteShadowAfterCopy) {
$null = Invoke-CimMethod -InputObject $shadow -MethodName Delete
Write-Log "Cliché supprimé."
} else {
Write-Log "Cliché conservé (ID=$($shadow.ID))."
}
if ($copyDest) { Write-Log "Copie terminée vers $copyDest" }
Write-Log "Succès"
} catch {
Write-Log "Erreur : $($_.Exception.Message)"
throw
}
Planifier l’exécution (tâche planifiée)
Pour automatiser la copie chaque nuit à 02:00 :
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"`"C:\Scripts\VSS-Export.ps1`"`""
$trigger = New-ScheduledTaskTrigger -Daily -At 02:00
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest
Register-ScheduledTask -TaskName "VSS-Export-C" -Action $action -Trigger $trigger -Principal $principal
Placez le script dans C:\Scripts\VSS-Export.ps1
(ou un autre chemin) et adaptez les paramètres en en‑tête.
Dépannage (erreurs fréquentes)
Symptôme | Cause probable | Correctif |
---|---|---|
ReturnValue != 0 à la création | Zone de stockage insuffisante, Writer VSS en erreur | Augmentez /maxsize , exécutez vssadmin list writers et corrigez les Writers « Failed/Retryable ». |
« Le support n’est pas éligible » | Destination non NTFS, partage réseau, ou disque vu comme amovible. | Reformatez en NTFS, utilisez un disque « local/fixed » et non un partage. |
Robocopy boucle/volume infini | Suivi de jonctions/pointeurs | Gardez /XJ et évitez de copier dans le même volume monté. |
Access denied sur GLOBALROOT | Session non élevée | Exécutez PowerShell en administrateur. |
Performance dégradée | Zone de stockage sur support lent | Placez la diff area sur SSD/local rapide, réduisez la concurrence E/S. |
Bonnes pratiques
- Taille de la zone : commencez à 10–20 % du volume source ou définissez une taille fixe (ex.
30GB
) ; surveillez la saturation. - Rotation : conservez seulement les clichés nécessaires.
vssadmin delete shadows
permet de purger. - Application‑cohérente : pour des bases de données, vérifiez l’état des Writers et synchronisez avec la quiescence applicative.
- Limitez la fenêtre : créez le cliché hors pic d’activité (nuit).
- Chiffrement : chiffrez la cible (BitLocker sur disque externe, chiffrement côté NAS) si les données sont sensibles.
- Tests de restauration : validez régulièrement l’exploitabilité des sauvegardes (restore test).
Commandes utiles
# Etat des Writers
vssadmin list writers
# Espace de stockage VSS (associations)
vssadmin list shadowstorage
# Liste des clichés du volume C:
vssadmin list shadows /for=C:
# Supprimer tous les clichés d’un volume (attention !)
vssadmin delete shadows /for=C: /all /quiet
# Redimensionner la zone de stockage
vssadmin resize shadowstorage /for=C: /on=E: /maxsize=30GB
FAQ rapide
Puis‑je stocker directement les clichés sur un partage réseau ?
Non. La zone VSS exige un volume NTFS local. Pour un NAS, créez le cliché localement puis copiez son contenu vers le partage.
Mon disque USB fonctionne‑t‑il ?
Oui s’il est vu comme disque local et formaté en NTFS. Certains périphériques étiquetés « amovibles » peuvent ne pas être acceptés comme zone VSS.
WMIC n’est plus disponible chez moi, comment faire ?
Utilisez diskshadow
ou la classe Win32_ShadowCopy
via PowerShell (exemples ci‑dessus).
Combien de clichés puis‑je conserver ?
Autant que la zone le permet. Une fois saturée, les plus anciens clichés sont purgés selon la politique interne de VSS.
Exemple de workflow complet (résumé)
- Configurer la zone :
vssadmin add shadowstorage /for=C: /on=E: /maxsize=20%
. - Créer le cliché : PowerShell
Invoke-CimMethod Win32_ShadowCopy...
(oudiskshadow
). - Monter : lien symbolique vers
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyXX\
. - Copier : Robocopy vers
E:\Backups
ou\\NAS\Sauvegardes
. - Nettoyer : supprimer le lien et, si souhaité, le cliché.
Conclusion
La procédure standard consiste à déporter la zone de stockage VSS sur un volume NTFS local (USB/SSD interne), puis à exporter le contenu du cliché vers un partage réseau si nécessaire. Cette approche respecte les contraintes structurelles de VSS, tout en offrant une automatisation complète via PowerShell (création, montage, copie et nettoyage). En complément, une tâche planifiée garantit une exécution régulière et des sauvegardes exploitables.