Optimaliseer VSS

Normaal gesproken stel je VSS op een disk zodanig in dat deze bijvoorbeeld ieder uur draait, maar omdat Windows een limiet heeft van maximaal 64 snapshots betekend dit dat je maximaal 3 dagen terug kan. In sommige gevallen wordt het zodanig ingesteld dat de snapshots alleen tijdens kantooruren gemaakt worden hierdoor kun je nu iets meer dan 7 dagen terug. Maar vaak komt de vraag naar voren: vorige week had ik een bestand verwijderd maar deze heb ik nu toch nog nodig. Hiervoor is het volgende script ontstaan.

Het script welke ik geschreven heb zorgt ervoor dat alleen de snapshots van de laatste 23 uur bewaard worden, daarna zal alleen de laatste van de dag (18:00) bewaard worden. Nadat een snapshot ouder dan 14 dagen is, dan zal alleen nog maar de snapshot van vrijdag's bewaard worden. Hierdoor kunnen er nog bestanden terug gehaald worden van meer dan een maand geleden. Het enige wat dan nodig is; is voldoende opslagruimte voor de snapshots.

Stap 1: Het instellen waar de snapshots opgeslagen moeten worden

Wanneer gebruik gemaakt wordt van een speciale schijf waarop de snapshot bewaard worden, dan zal dit appart ingesteld moeten worden. Maar hier ga ik op dit moment niet dieper op in.

Stap 2: Het maken van de snapshots

Als eerst zal er een scheduled task aangemaakt moeten worden welke de volgende eigenschappen heeft:

Schedule: Run daily every 1 hour for 13 hours vanaf 6:00
Command: C:\WINDOWS\system32\vssadmin.exe Create Shadow /AutoRetry=5 /For=D:

Stap 3: Het plaatsen van de VSSRetention script.

Wat ik zelf vaak doe is het aanmaken van een directory scripts op de C-drive en daarbinnen een map met VSSRetention. Hierbinnen zal een bestand aangemaakt moeten worden met de volgende inhoud:


' On Error resume Next
Dim namespace
Set namespace = GetObject("winmgmts://localhost/root/cimv2")
Dim objSet
Set objSet = namespace.ExecQuery("select * from Win32_ShadowCopy")
Dim currentDateTime
Set currentDateTime = CreateObject("WbemScripting.SWbemDateTime")
Dim currentSnapshotDate
Dim keepCurrentSnapshot
Dim logMessage
' De volgende snapshots moeten bewaard worden.
'
' De laatste van elke dag moet bewaard worden.
' De laatste van elke week moet bewaard worden.
' De laatste van elke maand moet bewaard worden.
'
For Each obj In objSet
 Set currentShadowCopyObj = obj
 keepCurrentSnapshot = 0
 currentDateTime.Value = currentShadowCopyObj.InstallDate
 currentSnapshotDate = currentDateTime.GetVarDate(True)
 
 ' WScript.echo "Snapshot on " & currentShadowCopyObj.VolumeName & " @ " & currentSnapshotDate
 
 dayOfWeek = DatePart("w", currentSnapshotDate)
 hourOfDay = DatePart("h", currentSnapshotDate)
 
 ' Keep snapshot from last day and every snapshot of 18:00 hours
 If (DateDiff("h", currentSnapshotDate, Now) > 23) Then
  If (hourOfDay = 18) Then
   keepCurrentSnapshot = 1
  End If
 Else
  keepCurrentSnapshot = 1
 End If
 
 ' Keep snapshots from the last week and every snapshot on Friday
 If ((DateDiff("d", currentSnapshotDate, Now) > 14)) Then
  If (dayOfWeek = vbFriday) Then
   keepCurrentSnapshot = 1
  Else
   keepCurrentSnapshot = 0
  End If
 End If
 
 If (keepCurrentSnapshot = 0) Then
  ' logMessage = logMessage & "Delete snapshot: " & currentSnapshotDate & vbCrLf
  obj.Delete_()
 Else
  ' logMessage = logMessage & "Keep snapshot: " & currentSnapshotDate & vbCrLf
 End IF
next
' WScript.echo logMessage


Stap 4: Het schedulen van de VSS Retention

Tot slot zal een extra scheduled task aangemaakt moeten worden met de volgende eigenschappen:

Schedule: Run daily every 1 hour for 13 hours vanaf 6:05
Command: c:\scrips\VSSRetention\VSSRetention.vbs
Wanneer beide scheduled tasks goed draaien zal vanzelf een langere tijd terug gegaan kunnen worden met behulp van snapshots