Windows: Kommandozeilen-Tools für das Erstellen und Nutzen von Schattenkopien

Die Schattenkopie-Funktion von Windows ist das Mittel der Wahl um geöffnete Dateien Kopieren oder Sichern zu können. Mit Hilfe diverses Kommandozeilen-Tools kann man manuell oder mittels Skript eine Schattenkopie erstellen, darauf zugreifen und diese letztlich wieder zu entfernen. Ideal sind diese beispielsweise für automatisierte Aufgaben wie Datensicherungen.

Das Bordmittel “vssadmin”

Seit Windows Server 2003 bietet der Onboard-Befehl vssadmin zusammen mit dem Parameter create shadow eine Möglichkeit Schattenkopien zu erstellen. Dessen Nutzung im Zusammenhang mit Skripten ist allerdings aufgrund der relativ aufwendigen Ermittlung der notwendigen Schattenkopie-Kennung, dem Einhängen der Schattenkopie sowie letztlich deren Entfernung recht umständlich. Ein Beispiel findet sich in diesem Beitrag:

Windows: Robocopy mit VSS (Schattenkopie)

Einfacher geht es mit den folgenden Werkzeugen.

VShadow aus dem SDK

Das wohl bekannteste Tool in Sachen Schattenkopien dürfte vshadow.exe aus dem Windows SDK sein. Bereits seit Windows XP gibt es dieses Werkzeug, welches im Windows 10 SDK zu finden ist. Um an dieses zu gelangen muss das SDK heruntergeladen und installiert werden.

Tipp: Am besten das SDK mittels der ISO installieren, dies geht schneller und zuverlässiger.

Die Datei für verschiedene Plattformen findet sich letztlich an verschiedenen Stellen:

C:\Program Files (x86)\Windows Kits\10\bin>dir vshadow.exe /s
Datenträger in Laufwerk C: ist OS
Volumeseriennummer: 1234-5678

Verzeichnis von C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\arm64

02.12.2020 05:26 375.784 vshadow.exe
1 Datei(en), 375.784 Bytes

Verzeichnis von C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64

02.12.2020 05:30 356.832 vshadow.exe
1 Datei(en), 356.832 Bytes

Verzeichnis von C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86

02.12.2020 04:59 256.992 vshadow.exe
1 Datei(en), 256.992 Bytes

Je nach installierte Version können die Pfade variieren, daher ist der oben gezeigte “dir…”-Befehl oder eine Suche mittels Explorer hilfreich.

Im Gegensatz zu “vssadmin create shadow” liegt eine wesentliche Erleichterung durch die “vshadow.exe” darin, das mittels des Parameters “-script=” eine Batch-Datei erzeugt wird, mit deren Hilfe die notwendige Variablen gesetzt werden, die man für die weitere Verwendung benötigt.

Ein Beispiel-Befehl kann wie folgt aussehen:

vshadow.exe -nw -script=vars.cmd -exec=backup.cmd C:

Damit man die so erstellte Schattenkopie nutzen kann, muss im unter “-exec=” angegebenen Skript zuerst das durch “vshadow.exe” erstellte Skript “vars.cmd” ausgeführt werden.

Inhalt von “Backup.cmd”:

@echo off

rem VSS-Variablen laden

 call vars.cmd

rem Die Schattenkopie zur Verfuegung stellen (mounten)

 mklink /d C:\VSS\ %shadow_device_1%\

rem Die auszufuehrenden Befehle fuer diese Schattenkopie

 rem Hier koennte z.B. robocopy verwendet werden.

rem Die Bereitstellung aufheben und die Schattenkopie entfernen

 rmdir C:\VSS\

rem Die "vars.cmd" entfernen

 del vars.cmd /q

Der Inhalt einer “vars.cmd” kann so aussehen:

@echo.
@echo [This script is generated by VSHADOW.EXE for the shadow set {ea5f29e0-cb08-433e-9dcd-b24777e7af26}]
@echo.

SET SHADOW_SET_ID={ea5f29e0-cb08-433e-9dcd-b24777e7af26}
SET SHADOW_ID_1={16238672-865e-4e6b-9251-cd88febab273}
SET SHADOW_DEVICE_1=\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy22

Die Ausgabe des vshadow-Befehls samt “backup.cmd” (in diesem Beispiel für Laufwerk E: und nur ein “dir” der Schattenkopie) kann so dargestellt werden:

VSHADOW.EXE 3.0 - Volume Shadow Copy sample client.
Copyright (C) 2005 Microsoft Corporation. All rights reserved.


(Option: No-writers option detected)
(Option: Generate SETVAR script 'vars.cmd')
(Option: Execute binary/script after shadow creation 'backup.cmd')
(Option: Create shadow copy set)
- Setting the VSS context to: 0x00000010
Creating shadow set {ea5f29e0-cb08-433e-9dcd-b24777e7af26} ...
- Adding volume \\?\Volume{65eded96-880a-465e-8e8e-b1f4d9b707b6}\ [E:\] to the shadow set...
Creating the shadow (DoSnapshotSet) ...
(Waiting for the asynchronous operation to finish...)
Shadow copy set succesfully created.

List of created shadow copies:


Querying all shadow copies with the SnapshotSetID {ea5f29e0-cb08-433e-9dcd-b24777e7af26} ...

* SNAPSHOT ID = {16238672-865e-4e6b-9251-cd88febab273} ...
- Shadow copy Set: {ea5f29e0-cb08-433e-9dcd-b24777e7af26}
- Original count of shadow copies = 1
- Original Volume name: \\?\Volume{65eded96-880a-465e-8e8e-b1f4d9b707b6}\ [E:\]
- Creation Time: 21.09.2021 23:16:01
- Shadow copy device name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy22
- Originating machine: hv02
- Service machine: hv02
- Not Exposed
- Provider id: {b5946137-7b9f-4925-af80-51abd60b20d5}
- Attributes: Auto_Release No_Writers Differential

Generating the SETVAR script (vars.cmd) ...
- Executing command 'backup.cmd' ...
-----------------------------------------------------

[This script is generated by VSHADOW.EXE for the shadow set {ea5f29e0-cb08-433e-9dcd-b24777e7af26}]

symbolische Verknüpfung erstellt für E:\VSS\ <<===>> \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy22\
Datenträger in Laufwerk E: ist Hyper-V - 180GD SSD
Volumeseriennummer: F03D-2A3E

Verzeichnis von E:\VSS

20.09.2021 16:50 <DIR> Hyper-V
0 Datei(en), 0 Bytes
1 Verzeichnis(se), 59.027.152.896 Bytes frei
-----------------------------------------------------

Snapshot creation done.

ShadowRun

Mit ShadowRun steht wohl das am einfachsten zu verwendende Tool zur Verfügung. Auf Basis des Quellcodes der “vshadow.exe” hat Albertony eine erweiterte Version erstellt.

Wenn man nur einen Befehl ausführen möchte, besteht die Möglichkeit alles in einer Zeile unter zu bekommen:

shadowrun.exe -env -mount -wait -drive=V: -exec=C:\Windows\System32\cmd.exe E: -- /C dir %SHADOW_DRIVE_1%

Möchte man zunächst nur eine Schattenkopie erstellen und dann mit anderen Anwendungen auf diese Zugreifen, kann man einfach

shadowrun.exe -env -mount -wait -drive=V: E:

ausführen. Die Schattenkopie wird als Laufwerk V: zur Verfügung gestellt und ShadowRun wartet auf die “ENTER”-Taste. Die nachfolgende Variante öffnet eine Eingabeaufforderung, die auf die eingehängte Schattenkopie Zugriff hat:

shadowrun.exe -env -mount -wait -drive=V: -exec=C:\Windows\System32\cmd.exe E:

Diese Eingabeaufforderung kann mit “exit” verlassen werden.

Geht es um das Ausführen eines Skripts, nachdem die Schattenkopie erstellt wurde, geht dies am einfachsten so:

shadowrun.exe -env -mount -drive=V: -exec=backup.cmd E:

Neben der direkten Nutzung der Umgebungsvariablen und dem damit einhergehenden Verzicht auf eine “vars.cmd” sowie des Einhängens der Schattenkopie als Laufwerk wird die Nutzung extrem einfach.

Ein Beispiel samt Ausgabe des Befehls:

c:\test>shadowrun.exe -env -mount -nq -exec=C:\Windows\System32\cmd.exe E: -- /C dir %SHADOW_DRIVE_1%

ShadowRun.exe v0.5.1 - Volume Shadow Copy Runner.
Copyright (C) 2020 Albertony. All rights reserved.

(Option: Set process environment)
(Option: Mount shadow copies as temporary drives)
(Option: Wait after shadow copy has been created)
(Option: Do not force quotes around arguments specified with -arg or after -- with quotes)
(Option: Execute binary/script after shadow creation 'C:\Windows\System32\cmd.exe')
(Option: Create shadow copy set)
- Setting the VSS context to: 0x00000010
Creating shadow set {608edea2-a927-4d90-91df-5c61a341c81c}
- Adding volume \\?\Volume{65eded96-880a-465e-8e8e-b1f4d9b707b6}\ [E:\] to the shadow set...
Creating the shadow (DoSnapshotSet) ...
(Waiting for the asynchronous operation to finish...)
Shadow set succesfully created.
Mounting shadow copies ...
- Mounted A: to \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy11
Setting process environment variables ...
Executing command: "C:\Windows\System32\cmd.exe" /C dir %SHADOW_DRIVE_1%
-----------------------------------------------------
Datenträger in Laufwerk A: ist Hyper-V - 180GD SSD
Volumeseriennummer: 1234-5678

Verzeichnis von A:\

20.09.2021 16:50 <DIR> Hyper-V
0 Datei(en), 0 Bytes
1 Verzeichnis(se), 60.056.428.544 Bytes frei
-----------------------------------------------------
Command returned with exit code: 0

Suspending program while any created shadow copies are still available.

Unounting shadow copies ...
- Unmounted A: from \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy11

Program completed, returning exit code 0.

Persönliche Bemerkung

ShadowRun hat sich innerhalb kürzester Zeit zu meinem Liebling in Sachen VSS und Batch entwickelt, besser und einfacher kann es wohl nicht sein. Als weiterer positiver Punkt kann die ausgezeichnete Dokumentation von VShadow und ShadowRun auf der Projektseite gewertet werden.

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert