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
in der Console erhält man folgende Ausgabe:
6. Hat man das Schattenkopievolume kann man es ins Dateisystem mounten mit
(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:
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:
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 295802
Url: https://administrator.de/contentid/295802
Ausgedruckt am: 25.11.2024 um 10:11 Uhr
9 Kommentare
Neuester Kommentar
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
gwmi win32_shadowcopy | select @{n="Drive";e={$v=$_.Volumename;(gwmi win32_volume | ?{$_.DeviceId -eq $v}).Driveletter}},DeviceObject,@{n="Datum";e={$_.ConvertToDateTime($_.InstallDate)}}
Gruß jodel32
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 . Siehe im BatchCode hinzugefügter Filter nach DriveLetter und Datum.Nun viel Spaß
jodel
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 mitHallo 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.
setlocal enabledelayedexpansion
Gibt es da einen Weg das abzuändern?
Ja, dort wo du keine Ausrufezeichen verschluckt haben willst die verzögerte Variablenerweiterung vorher ausschaltensetlocal disabledelayedexpansion
Doch ... wie ich geschrieben habe gezielt setzen
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 !
Aber warum du das nicht direkt alles gleich mit der PS machst verstehe wer will ...
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 ...