kangaroojack
Goto Top

Ergebnis von VSSADMIN weiterverarbeiten (Consolenausgabe bzw. Ergebnis aus Textfile analysieren und String daraus weiterverwerten) (Dateiwiederherstellung aus Schattenkopiespeicher)

Hallo liebe IT-Leidgenossen,

heute möchte ich mal ein Thema anreissen, mit dem einige von euch evtl. schon Bekanntschaft gemacht haben. Ransomware!
Diese Ransomware verschlüsselt gängige Dateitypen und hängt an den Dateinamen z.B. ".micro" oder ".vvvv" etc. an.
Wir hatten bereits einige Male Kontakt mit dem Mist und mussten teils ziemlich aufwendig die Files/Folder wiederherstellen. (Teils vom Band, aber über Shadowcopys geht es Faktor 10000 (geschätzt) schneller)

Auf unserem Fileserver haben wir Schattenkopien aktiviert. 1x am Tag um 12.00Uhr zieht der von dem Laufwerk eine Schattenkopie.
Nun ist es ja so, dass wir unmöglich jede verschlüsselte Datei einzeln per Mausklick aus den Schattenkopien wiederherstellen können - also stellt man gleich ein ganzes Verzeichnis (teils mit X Unterverzeichnissen...) auf Version X zurück. (Suche nach *.micro, dann alle Files markieren und Wiederherstellen aus Schattenkopie geht leider nicht)
Leider hat das natürlich den klitzekleinen Nachteil, dass man dann auch alle Dateien, die nicht betroffen sind zurückstellt.

Wünschenswert, wäre also eine genaue, dateiweise Wiederherstellung per Skript aus dem Schattenkopiespeicher.
Soviel zu der Beschreibung des Vorhabens.

Nun hoffe ich mal, dass einige von euch fitter sind als ich im Skripten in batch oder Powershell und mir an der Stelle unter die Arme greifen können ;)


Nun Stelle ich mir das Skipt wie folgt vor:

1. User gibt die Dateiendung an, nach der gesucht werden soll
2. User gibt das Laufwerk an, welches durchsucht werden soll
3. User gibt optional einen bestimmten Pfad an, der durchsucht werden soll
4. Laufwerk wird nach entsprechenden Dateien durchsucht, Ergebnis wird in txt-Datei gespeichert
5. User wird nach Datum zur Wiederherstellung gefragt => z.B. 08.02.2016
6. genau hier bräuchte ich Hilfe!
Das Skipt führt "vssadmin List Shadows /for=F:" (bzw. for=Laufwerk$) aus
Anhand des eingegebenen Datums wird das dazugehörige "Schattenkopievolume" gesucht.

Mit
 vssadmin List Shadows /for=F:
in der Console erhält man folgende Ausgabe:

vssadmin 1.1 - Verwaltungsbefehlszeilenprogramm des Volumeschattenkopie-Dienstes
(C) Copyright 2001-2013 Microsoft Corp.

Inhalte der Schattenkopiesatzkennung: {ade17f6d-454e-4ef8-8a32-bd70c425d24a}
   1 Schattenkopie(n) war(en) enthalten bei der Erstellungszeit:
         07.02.2016 12:00:15
      Schattenkopienkennung: {0bab55b0-8268-4e2e-bc9b-24119b867e8d}
         Ursprüngliches Volume: (F:)\\?\Volume{c646ac3e-c63b-4b7a-85e9-2b12e225c90c}\
         Schattenkopievolume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy279
         Quellcomputer: Servername.domaene.local
         Dienstcomputer: Servername.domaene.local
         Anbieter: "Microsoft Software Shadow Copy provider 1.0"  
         Typ: ClientAccessible
         Attribute: Permanent, Clientzugänglich, Keine automatische Freigabe, Keine Verfasser, Differenziell

Inhalte der Schattenkopiesatzkennung: {9763e50e-04ff-43ba-9cc1-bd9e0b39f40e}
   1 Schattenkopie(n) war(en) enthalten bei der Erstellungszeit:
         08.02.2016 12:00:18
      Schattenkopienkennung: {ba26cc47-374e-4c87-8015-9725ea83131f}
         Ursprüngliches Volume: (F:)\\?\Volume{c646ac3e-c63b-4b7a-85e9-2b12e225c90c}\
         Schattenkopievolume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy281
         Quellcomputer: Servername.domaene.local
         Dienstcomputer: Servername.domaene.local
         Anbieter: "Microsoft Software Shadow Copy provider 1.0"  
         Typ: ClientAccessible
         Attribute: Permanent, Clientzugänglich, Keine automatische Freigabe, Keine Verfasser, Differenziell

Inhalte der Schattenkopiesatzkennung: {52eb8777-d1d5-4765-a111-1032eb30d242}
   1 Schattenkopie(n) war(en) enthalten bei der Erstellungszeit:
         09.02.2016 12:00:23
      Schattenkopienkennung: {82b9140f-b0fa-407c-9458-d72fef5216c9}
         Ursprüngliches Volume: (F:)\\?\Volume{c646ac3e-c63b-4b7a-85e9-2b12e225c90c}\
         Schattenkopievolume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy283
         Quellcomputer: Servername.domaene.local
         Dienstcomputer: Servername.domaene.local
         Anbieter: "Microsoft Software Shadow Copy provider 1.0"  
         Typ: ClientAccessible
         Attribute: Permanent, Clientzugänglich, Keine automatische Freigabe, Keine Verfasser, Differenziell

Inhalte der Schattenkopiesatzkennung: {8a536f6a-34d9-4f85-9de9-005d09fd3e99}
   1 Schattenkopie(n) war(en) enthalten bei der Erstellungszeit:
         10.02.2016 12:00:26
      Schattenkopienkennung: {3400f09b-1aeb-4931-ba0f-350e4167bac8}
         Ursprüngliches Volume: (F:)\\?\Volume{c646ac3e-c63b-4b7a-85e9-2b12e225c90c}\
         Schattenkopievolume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy285
         Quellcomputer: Servername.domaene.local
         Dienstcomputer: Servername.domaene.local
         Anbieter: "Microsoft Software Shadow Copy provider 1.0"  
         Typ: ClientAccessible
         Attribute: Permanent, Clientzugänglich, Keine automatische Freigabe, Keine Verfasser, Differenziell

Inhalte der Schattenkopiesatzkennung: {02857ba9-c158-4145-955d-9cd19f276c18}
   1 Schattenkopie(n) war(en) enthalten bei der Erstellungszeit:
         10.02.2016 19:49:21
      Schattenkopienkennung: {448af96d-8aae-4da0-b32c-91953434ad51}
         Ursprüngliches Volume: (F:)\\?\Volume{c646ac3e-c63b-4b7a-85e9-2b12e225c90c}\
         Schattenkopievolume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy286
         Quellcomputer: Servername.domaene.local
         Dienstcomputer: Servername.domaene.local
         Anbieter: "Microsoft Software Shadow Copy provider 1.0"  
         Typ: Backup
         Attribute: Differenziell


6. Hat man das Schattenkopievolume kann man es ins Dateisystem mounten mit
mklink /d C:\SHADOW \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy281\

(das \ am Ende ist wichtig und MUSS sein, sonst kann man nicht drauf zugreifen!)

7. Dateien wiederherstellen

Ich habe schonmal angefangen einwenig zu basteln. Es fehlt halt noch der komplette Punkt des auslesens und verlinken vom Schattenkopievolume.
Da bin ich nicht fit genug mir das zusammen zu schreiben und wäre froh wenn mir jemand helfen würde!


Hier das fertige Skript:

@echo off & setlocal enabledelayedexpansion
chcp 1252
set "EncryptedFiles=C:\Skript\EncryptedFiles.txt"  
set "RecoveredFiles=C:\Skript\RecoveredFiles.txt"  
set "VirusFilesToDelete=C:\Skript\VirusFilesToDelete.txt"  
set "VirusFilesDeleted=C:\Skript\VirusFilesDeleted.txt"  
set "Nach="  
set "Nach2="  
set "ShadowMountPoint=C:\Shadow"  

if exist "%EncryptedFiles%" (del /Q "%EncryptedFiles%")  
if exist "%RecoveredFiles%" (del /Q "%RecoveredFiles%")  
if exist "%VirusFilesToDelete%" (del /Q "%VirusFilesToDelete%")  
if exist "%VirusFilesDeleted%" (del /Q "%VirusFilesDeleted%")  
if exist "%ShadowMountPoint%" (rd "%ShadowMountPoint%")  

cls
echo Bitte Dateiendung angeben die gesucht werden soll ( Beispiel:   .micro   )
echo.
set /p "Von=Eingabe:"  


cls
echo Bitte Laufwerk angeben, welches nach der angegebenen Dateiendung durchsucht 
echo werden soll. ( Beispiel:   F:   )
echo.
set /p "ZielLaufwerk=Eingabe:"  


cls
echo Falls nur ein Directory auf dem Laufwerk durchsucht werden soll, bitte angeben  
echo ( Beispiel:   \K010\ORGA\ZKE   )
echo Falls nicht, einfach ENTER druecken
echo.
set /p "Pfad=Eingabe:"  


cls
echo "%ZielLaufwerk%%Pfad%" wird nach Dateien mit der Endung "%Von%" durchsucht. Bitte warten.  
%ZielLaufwerk%
cd\ 
cd "%Pfad%"  
dir /s /b *%Von%>"%EncryptedFiles%"  
start notepad "%EncryptedFiles%"  


cls
echo Bitte Datum eingeben auf das die Dateien zurueckgesetzt werden sollen 
echo ( Beispiel:   08.02.2016   )
echo.
set /p "Datum=Eingabe:"  


cls
echo Suche ShadowCopyVolume und mounte es nach %ShadowMountPoint%...bitte warten.
for /f "delims=" %%a in ('powershell -Executionpolicy Bypass -command "gwmi win32_shadowcopy | select @{n='Drive';e={$v=$_.Volumename;(gwmi win32_volume | ?{$_.DeviceId -eq $v}).Driveletter}},DeviceObject,@{n='Datum';e={$_.ConvertToDateTime($_.InstallDate)}} | ?{$_.Datum.Date -eq (get-date '%Datum%') -and $_.Drive -eq '%ZielLaufwerk%'} | select -Expand DeviceObject"') do set "globalpath=%%a"  
mklink /d %ShadowMountPoint% %globalpath%\
ping -n 5 localhost>nul

cls
echo Sollen die gefundenen Dateien geloescht und aus dem Shadow Volume wiederhergestellt werden?
choice /M "Eingabe:"  
if errorlevel 2 (
  goto eof
) 	else if errorlevel 1 (
	cls
	echo Dateien werden wiederhergestellt...bitte warten
	for /f "usebackq delims=" %%i in ("%EncryptedFiles%") do set "Line=%%i" & del /Q "!Line!" & set "Line=!Line:%ZielLaufwerk%=%Nach2%!" & copy /Y "%ShadowMountPoint%!Line!" "%ZielLaufwerk%!Line!"  && echo "%ZielLaufwerk%!Line!">>"%RecoveredFiles%"  
	echo Vorgang beendet. 
	echo Die Dateien wurden wiederhergestellt, bitte kontrollieren.
	start notepad "%RecoveredFiles%"  
 	rd %ShadowMountPoint%
	echo.
	)


echo Moechten Sie das Laufwerk bzw. Pfad nach weiteren, vom Virus angelegten, 
echo Dateien durchsuchen und loeschen?
choice /M "Eingabe:"  
if errorlevel 2 (
  goto eof
) 	else if errorlevel 1 (
	cls
	echo Bitte Dateiname angeben der gesucht werden soll ( Beispiel:   HELP_RECOVER   )
	echo.
	set /p "Dateiname=Eingabe:"  
	cls
	echo "%ZielLaufwerk%%Pfad%" wird nach Dateien mit Namen "%Dateiname%*" durchsucht.  
	echo Bitte warten.
	%ZielLaufwerk%
	cd\ 
	cd "%Pfad%"  
	dir /s /b *%Dateiname%*>"%VirusFilesToDelete%"  
	start notepad "%VirusFilesToDelete%"  
	echo.
	)
	
	
cls
echo Sollen die gefundenen Dateien geloescht werden?
choice /M "Eingabe:"  
if errorlevel 2 (
  goto eof
) 	else if errorlevel 1 (
	cls
	echo Dateien werden geloescht...bitte warten
	for /f "usebackq delims=" %%I in ("%VirusFilesToDelete%") do del /Q "%%I" && echo %%I>>"%VirusFilesDeleted%"  
	cls
	color A
	echo Vorgang beendet. 
	echo Die Dateien wurden geloescht, bitte kontrollieren.
	echo Have a nice day.
	start notepad "%VirusFilesDeleted%"  
	)
pause
exit


:eof
cls
color C
echo Vorgang abgebrochen. Have a nice day.
pause
exit

Content-ID: 295802

Url: https://administrator.de/contentid/295802

Ausgedruckt am: 25.11.2024 um 10:11 Uhr

114757
114757 11.02.2016 aktualisiert um 16:15:20 Uhr
Goto Top
6. genau hier bräuchte ich Hilfe!
Powershell mit Parsen der Ausgabe von vssadmin:
[regex]::matches(((vssadmin list shadows /for=C:) | out-string),'(?is)Erstellungszeit: ([\d\.]+ [\d:]+).*?Schattenkopievolume: ([^\s]+)').Captures | select @{n="Datum";e={get-date $_.Groups[1].Value}},@{n="Pfad";e={$_.Groups[2].Value}} | sort Datum -Descending  
oder besser gleich per PS und WMI nehmen:
gwmi win32_shadowcopy | select @{n="Drive";e={$v=$_.Volumename;(gwmi win32_volume | ?{$_.DeviceId -eq $v}).Driveletter}},DeviceObject,@{n="Datum";e={$_.ConvertToDateTime($_.InstallDate)}}  

Gruß jodel32
Kangaroojack
Kangaroojack 11.02.2016 um 17:25:13 Uhr
Goto Top
Hallo jodel32,

danke für dein Post.

Ich hab meinen Code oben erweitert und bereits getestet. Funktioniert 1A wenn man das Schattenkopievolume manuell verlinkt.

Wie bekomme ich deine Teillösung in die Batch integriert?

Kloppe ich den unteren Code mal in die Shell bekomme ich eine Liste aller verfügbaren Schattenkopievolumes inkl. Datum und Zeit.
Bild

Gruß
KangarooJack
114757
Lösung 114757 11.02.2016, aktualisiert am 12.02.2016 um 11:35:51 Uhr
Goto Top
Wie bekomme ich deine Teillösung in die Batch integriert?
Mit FOR-Schleife...
for /f "delims=" %%a in ('powershell -Executionpolicy Bypass -command "gwmi win32_shadowcopy | select @{n='Drive';e={$v=$_.Volumename;(gwmi win32_volume | ?{$_.DeviceId -eq $v}).Driveletter}},DeviceObject,@{n='Datum';e={$_.ConvertToDateTime($_.InstallDate)}} | ?{$_.Datum.Date -eq (get-date '%datum%') -and $_.Drive -eq '%Ziellaufwerk%'} | select -Expand DeviceObject"') do set "globalpath=%%a"  
echo %globalpath%
Kloppe ich den unteren Code mal in die Shell bekomme ich eine Liste aller verfügbaren Schattenkopievolumes inkl. Datum und Zeit.
Das war ja die Intention, Filtern nach Zeit und oder Laufwerk lässt sich das ja dann problemlos da es Powershell-Objekte mit Eigenschaften sind face-wink. Siehe im BatchCode hinzugefügter Filter nach DriveLetter und Datum.

Nun viel Spaß
jodel
Kangaroojack
Kangaroojack 12.02.2016 um 11:33:52 Uhr
Goto Top
Klasse!!! Funktioniert alles einwandfrei, so wie es soll.
Vielen herzlichen Dank!

Habe das komplette Skript eingestellt, evtl. kann ja noch sonst jemand was damit anfangen!
Konnte damit wirklich easy bereits ca 120000 Dateien wiederherstellen! ;)

(Achtung: Fehleingaben sind im Skript !!!NICHT!!! abgefangen, also aufpassen!)
Kangaroojack
Kangaroojack 22.02.2016 um 17:30:00 Uhr
Goto Top
Hallo Leute,

leider gibt es mit dem Skript noch ein kleines Problem.

Es gibt bei uns im Filesystem diverse Ordner und/oder Dateien die ein Ausrufezeichen (!) (gg. auch andere Sonderzeichen) im Namen tragen.
Diese werden vom Skript nicht berücksichtigt - das Aufrufezeichen wird einfach verschluckt - somit schlägt der copy Befehl natürlich fehl.

Gibt es da einen Weg das abzuändern?

Gruß
KangarooJack
114757
114757 22.02.2016 aktualisiert um 19:29:25 Uhr
Goto Top
Zitat von @Kangaroojack:

Hallo Leute,

leider gibt es mit dem Skript noch ein kleines Problem.

Es gibt bei uns im Filesystem diverse Ordner und/oder Dateien die ein Ausrufezeichen (!) (gg. auch andere Sonderzeichen) im Namen tragen.
Diese werden vom Skript nicht berücksichtigt - das Aufrufezeichen wird einfach verschluckt - somit schlägt der copy Befehl natürlich fehl.
Klar weil du mit
setlocal enabledelayedexpansion 
verzögerte Variablenerweiterung verwendest!
Gibt es da einen Weg das abzuändern?
Ja, dort wo du keine Ausrufezeichen verschluckt haben willst die verzögerte Variablenerweiterung vorher ausschalten
setlocal disabledelayedexpansion
Gruß jodel32
Kangaroojack
Kangaroojack 22.02.2016 um 20:01:17 Uhr
Goto Top
Eine ähnliche Formulierung hatte ich dazu in einem anderen Thread schon gefunden.
Kann ich denn bei dem Codeblock hier so einfach das
setlocal enabledelayedexpansion 

rausnehmen?

Glaube eher nicht? Dann kann ich wahrscheinlich die Variablen nicht mehr ansprechen, oder?

for /f "usebackq delims=" %%i in ("%EncryptedFiles%") do set "Line=%%i" & del /Q "!Line!" & set "Line=!Line:%ZielLaufwerk%=%Nach2%!" & copy /Y "%ShadowMountPoint%!Line!" "%ZielLaufwerk%!Line!"  && echo "%ZielLaufwerk%!Line!">>"%RecoveredFiles%"   
114757
114757 22.02.2016 aktualisiert um 20:20:22 Uhr
Goto Top
Doch ... wie ich geschrieben habe gezielt setzen face-wink
Mal hier schlau lesen: http://ss64.com/nt/delayedexpansion.html

Der Block hier setzt voraus das du die verzögerte Variablenerweiterung global in der ersten Zeile zuerst "deaktivierst" und nur dort aktivierst wo du es benötigst, und danach wieder deaktivierst !
for /f "usebackq delims=" %%i in ("%EncryptedFiles%") do   
    set "Line=%%i"  
    setlocal enabledelayedexpansion
    del "!Line!"  
    set "Line=!Line:%ZielLaufwerk%=%Nach2%!"  
    copy /Y "%ShadowMountPoint%!Line!" "%ZielLaufwerk%!Line!"  && echo "%ZielLaufwerk%!Line!">>"%RecoveredFiles%"  
    setlocal disabledelayedexpansion
)

Aber warum du das nicht direkt alles gleich mit der PS machst verstehe wer will ...
Kangaroojack
Kangaroojack 22.02.2016 um 20:30:17 Uhr
Goto Top
Okay, werde es morgen früh gleich probieren. Dank dir!

Ja, könnte man natürlich bestimmt auch in Powershell machen - aber die PS "beherrsche" ich noch weniger...
So ist das Admin-Leben bei uns. Man werkelt hier, man werkelt da, klickt hier und da - aber man kann halt einfach nicht alles können.
Alle paar Monate brauche ich mal ein Skript, was ich mir dann tagelang zusammenstricke. Dann ist wieder Wochen oder Monate Ruhe und dann braucht man es mal wieder - ist aber eigentlich wieder raus aus dem Thema, bevor man richtig drin war ;)

Bin froh, dass es hier Spezis gibt, die auf dem Gebiet fitter sind und einem weiterhelfen. Danke!

Gruß
KangarooJack