Wie erhält man den 'NextUSN'-Journaleintrag für einen VSS-Snapshot?

8

Nach dem Erstellen eines VSS-Snapshots möchte ich das USN-Journal abfragen können. Ist dies möglich oder ist das USN-Journal nicht über einen VSS-Snapshot zugänglich?

Mein Ziel ist die Verwendung des USN-Journals in einer inkrementellen Sicherung zwischen zwei VSS-Snapshots . Der Prozess für die Sicherung wäre

  1. Nehmen Sie einen VSS-Snapshot und sichern Sie das Volume, indem Sie die USN-Einträge für jede Datei
  2. notieren
  3. ... das Dateisystem verwenden, Dateien hinzufügen / löschen / ändern
  4. Nehmen Sie einen zweiten VSS-Snapshot und suchen Sie dann mit dem USN-Journal nach, was sich in Schritt 2
  5. geändert hat

Was mir gerade fehlt, ist der Teil, wo ich versuche, den höchsten USN-Eintrag im VSS-Snapshot zu ergattern

  1. Erstellen Sie VSS-Snapshot
  2. Öffnen Sie den Snapshot mit CreateFile (\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy25)
  3. DeviceIoControl (FSCTL_QUERY_USN_JOURNAL) - dies schlägt fehl mit GLE: 1179 "das Volumenänderungsprotokoll ist nicht aktiv"

Ich kann dies von der Kommandozeile aus wie folgt simulieren

%Vor%

Irgendwelche Ideen was ich falsch mache, wenn das möglich ist?

    
stuck 11.05.2012, 01:58
quelle

4 Antworten

5

Diese Frage war sehr wichtig für das Projekt, an dem ich gerade arbeite, also habe ich es (fast) zu 100% geschafft.

Hinweis: Alle folgenden Codefragmente befinden sich in C #

Dank der vorherigen Antworten von Hannes de Jager, die mich auf die richtige Richtung und Dokumentation hingewiesen haben, kann ich nun ein USN-Journal aus einem VSS-Snapshot oder einem anderen speziellen Gerät lesen, mit dem die reguläre API nicht arbeiten kann; in meinem Fall meine ich VMware-Snapshots, die mit VDDK (VMware SDK für VM-Festplatten) gemountet wurden.

Ich habe auch Code aus großartigen Projekten wiederverwendet oder importiert:

  • USN-Journal-Explorer in C #, von StCroixSkipper ( Ссылка ). Liest nur USN mit der offiziellen API (also hier kein VSS), bietet aber nützliche Pinvokes und Win32-API-Strukturen sowie allgemeine Informationen zur Funktionsweise von USN

  • AlphaFS ( Ссылка ), das große Teile des Namensraums System.IO nachahmt, aber den Zugriff auf special ermöglicht Windows-Pfade (VSS-Snapshots, Raw-Geräte) und bietet auch nützliche Erweiterungen.

Falls jemand anderes interessiert ist, teile ich den Code, den ich jetzt benutze, immer noch in einem ziemlich kruden Zustand, aber arbeite.

Wie funktioniert es?

Zuerst müssen Sie auf die erforderlichen Usn-Journalkomponenten zugreifen. Sie sind die Wurzel des Geräts als ADS (alternative Datenströme) in einem versteckten Eintrag. Sie können nicht mit dem Standard System.IO Namespace zugegriffen werden, deshalb habe ich vorher gesagt, dass ich das AlphaFS-Projekt verwendet habe, aber pinvoking CreateFile() und ReadFile() sollten genug sein.

1/2

Der Eintrag $Extend$UsnJrnl:$Max enthält globale Informationen über den aktuellen Status des Journals. Die wichtigsten Teile sind die USN-Journal-ID (mit der Sie überprüfen können, dass das Journal nicht zurückgesetzt wurde, wenn Sie mehrere VSS-Snapshots vergleichen möchten) und die niedrigste gültige USN-Journalfolgenummer.

USN Journalstruktur:

%Vor%

2/2

Der Eintrag $Extend$UsnJrnl:$J enthält die Journalsätze. Es ist eine Sparse-Datei, daher ist die Festplattenbelegung viel niedriger als ihre Größe.

Um die erste Frage zu beantworten, wie kann man die von Max verwendete USN-Sequenz aus einem früheren VSS-Snapshot kennen und mit einem anderen Snapshot vergleichen? Nun, der NextUsn-Wert ist einfach gleich der Größe des $Usnjrnl:$J -Eintrags.

In Ihrem "neuen" vss snapshot USN journal können Sie nach dem "Referenz" VSS snapshot max USN suchen, bevor Sie Datensätze analysieren, wenn Sie die zwischen den beiden Snapshots geänderten Datensätze analysieren wollen.

Im Allgemeinen jeder USN-Journaleintrag als eindeutige ID (USN-Nummer), die der Versatz innerhalb von $J ist, an dem sich der Journaleintrag selbst befindet. Jeder Eintrag hat eine variable Größe, so dass wir sequentiell lesen müssen:

%Vor%

Glücklicherweise ist die Datensatzlänge auch ein Feld des USN-Eintrags. Genug gesagt, hier ist die USN-Rekordklasse:

%Vor%

Ich habe versucht, den kleinsten Teil des Codes zu isolieren, der ein USN-Journal parsen und seine Einträge extrahieren kann, beginnend mit dem niedrigsten gültigen. Denken Sie daran, dass ein Datensatz eine variable Länge hat; Beachten Sie auch, dass einige Datensätze auf einen nächsten Datensatz zeigen, der leer ist (die ersten 4 Byte, normalerweise die Datensatzlänge, werden auf Null gesetzt). In diesem Fall suche ich 4 Bytes und wiederhole das Parsen, bis ich den nächsten Datensatz bekomme. Dieses Verhalten wurde auch von Leuten berichtet, die in Python ähnliche Parsingtools geschrieben haben, also denke ich, dass ich hier nicht falsch liege.

%Vor%

Hier sind die Pinvokes, die ich benutze:

%Vor%

Das ist definitiv nicht das beste Stück Code auf der Welt, aber ich denke, es wird einen guten Ausgangspunkt für jeden bieten, der dasselbe tun muss.

    
mbarthelemy 24.09.2012, 12:56
quelle
2

Vielleicht möchten Sie Rubens Antwort einen zweiten Gedanken geben:

Das USN-Journal in einem Snap-Volume ist definitiv lesbar, indem eine spezielle Datei in dem Snapshot-VSS-Volume gelesen wird. Wenn die Windows-API es Ihnen nicht erlaubt, das USN-Journal eines Snapshot-Volumes zu lesen, dann ist dies möglicherweise eine praktikable Option , obwohl ich mir sicher bin, dass es sich wie ein Hack anfühlt.

Die Sache ist, obwohl NTFS keine offene Spezifikation hat, die von mehr als einem Projekt herausgefunden wurde, darunter die Linux-Implementierungen von NTFS-Treibern. Das Dokument, das Ruben für Sie gepostet hat, wurde ursprünglich geschrieben, um die Entwicklung dieses Treibers zu unterstützen.

Wie ich bereits erwähnt habe, befindet sich der Inhalt des USN-Journals in einer speziellen Datei auf Ihrem NTFS-Volume (wie viele Dinge in NTFS, z. B. Die NTFS-Hauptdateitabelle. Eigentlich heißt es, dass alles in NTFS eine Datei ist). Spezielle Dateien in NTFS beginnen mit einem Dollarzeichen $, und dasjenige, nach dem Sie suchen, heißt $ UsnJrnl, das wiederum in einem speziellen Verzeichnis namens $ Extend liegt. Also auf Ihrem C: Volume ist diese Datei

%Vor%

oder für Ihren Schnappschuss wäre es

%Vor%

Die von Ihnen gesuchte Information befindet sich in einem alternativen Datenstrom , der den $ J-Stream genannt wird und es hat Einträge in diesem Format (Siehe Rubens Dokument):

%Vor%

Sie könnten also den $ J-Stream dieser speziellen Datei lesen, um den gewünschten USN-Eintrag zu erhalten. Ich möchte Ihnen sagen, wie Sie die USN-Nummer ableiten, die Sie benötigen, aber ich bin ein bisschen eingerostet. Wenn ich es wieder herausfinde, werde ich diese Antwort aktualisieren. Aber sehen Sie sich spezielle Dateien auf diese Weise an, es macht ziemlich viel Spaß ;-). Ich habe diese Methode verwendet, um die Master-Dateitabelle (spezielle Datei $ MFT) in einer nicht angehängten VHD-Datei zu lesen, um alle Dateien auf dem Volume in der VHD aufzulisten.

    
Hannes de Jager 18.08.2012 22:53
quelle
1

Ich denke, dass es unmöglich ist, die WinAPI-Schnittstelle zu verwenden, um das USN-Journal abzufragen, während das Volume nicht geladen ist.

Sie können versuchen, die Datei "$ UsnJrnl" zu öffnen und die benötigten Informationen manuell zu analysieren.

Siehe:

NTFS-Dokumentation von Richard Russon und Yuval Fledel

    
Ruben 18.05.2012 20:57
quelle
0

Vielleicht kann das nützlich sein: Journaleinträge überschreiten keine Clustergrenzen. Jeder Cluster (normalerweise 8 Sektoren pro Cluster) beginnt mit einem neuen Eintrag. Wenn gegen Ende dieses Clusters der nächste Eintrag nicht in den verbleibenden Cluster-Raum passt, wird dieser Raum mit Null gefüllt, und der nächste Eintrag wird am Anfang des nächsten Clusters gespeichert (Es ist schade, dass dies nicht in der "Größe des Eintrags"). Sie müssen also diesen Bereich nicht analysieren - springen Sie einfach zum nächsten Cluster (! Vergessen Sie nicht, die RUNs des Journals zu verwenden, um den nächsten gültigen Plattencluster zu erhalten). Robert

Übrigens. Sie können die USN (Offset dieses Eintrags in $ J), die Cluster-Nummer und die Position dieses Eintrags innerhalb des Clusters verwenden, um die Gültigkeit des Eintrags zu überprüfen.

    
Robert 23.02.2017 21:29
quelle

Tags und Links