Wann schreibt Windows Registrierungsänderungen auf die Festplatte?

43

TL; DR:

Ich habe festgestellt, dass die Registrierungsänderung nach dem Neustart nicht angezeigt wird, wenn ich eine Registrierungsänderung vornehme und dann mein Windows 10-System herunterfahre.

Mir ist auch aufgefallen, dass das Löschen einer Ruhezustandsdatei die Fähigkeit eines Linux-Wiederherstellungstools beeinträchtigen kann, Änderungen an der Windows-Registrierung im Offlinestatus vorzunehmen. Das Tool scheint nach dem Löschen einer Ruhezustandsdatei keine dauerhaften Änderungen vornehmen zu können. Ich werde unten spezifische Beispiele auflisten.

Beispiel 1:

  • Ich füge einen Schlüssel mit dem Namen "1111" in "HKLM \ SOFTWARE" ein. Ich schalte meine Box dann hart aus, indem ich den Ein- / Ausschalter 5 Sekunden lang gedrückt halte.
  • Testschlüssel
  • Wenn ich die Registrierung zurückziehe, sind dieser Schlüssel und seine Werte weg:
  • Test Key Gone
  • (Diese Bilder wurden zu Formatierungszwecken bearbeitet.)

Beispiel 2 :

  • Nehmen Sie eine Änderung in der Registrierung vor (mit regedit)
  • Schalten Sie das System in den Ruhezustand
  • Starten Sie ein Linux-Wiederherstellungstool
  • Löschen Sie die Ruhezustandsdatei, um den Datenträger bereitzustellen.
  • Lesen Sie die Windows-Registrierung (aus dem Wiederherstellungstool)
  • Die Registrierungsänderung ist weg.

Dies scheint gleichbedeutend mit einem harten Herunterfahren der Box zu sein.

Beispiel 3:

Ich sehe fremdes Verhalten, wenn ich:

  • Hibernate die Box
  • Booten Sie mit einem Linux-Wiederherstellungstool und löschen Sie die Ruhezustandsdatei
  • Nehmen Sie Änderungen an der Registrierung vor (über das Wiederherstellungstool).
  • Starten Sie die Box neu

Diese Änderungen werden auch in der Registrierung nicht berücksichtigt.

Also, was ist hier los?

  • Wann schreibt Windows 10 die Registrierungsänderungen auf die Festplatte?
  • Warum verhindert das Löschen einer Ruhezustandsdatei (in Beispiel 3), dass vom Wiederherstellungstool vorgenommene Registrierungsänderungen beim nächsten Start übernommen werden?

In der Hoffnung, eine Klarstellung zu bekommen!

Shrout1
quelle
2
"Die Registrierungsänderung wird nach dem Neustart nicht angezeigt." - Die Registrierungsänderung wird erst nach dem Neustart wirksam. In der Regel muss nur der Datei-Explorer neu gestartet werden. Es hängt alles davon ab, welches Verhalten die Registrierungsänderung bewirken soll, wenn tatsächlich ein Neustart erforderlich ist. Der eigentliche Schlüssel wird geändert, wenn er geändert wird, wodurch Ihre Frage beantwortet wird.
Ramhound
8
Was meinst du mit einem harten Shutdown? Halten Sie den Netzschalter gedrückt, bis er sich ausschaltet? Dieser Prozess umgeht das Ausschreiben ausstehender Schreibvorgänge im Festplatten-Cache.
DavidPostill
2
@Ramhound Ich verstehe, dass es nicht in Kraft tritt, aber warum wurde es nicht auf die Festplatte geschrieben? Ich bearbeite, schalte hart aus und ändere mich dann nicht mehr. Ob es im Gedächtnis in Kraft getreten ist oder nicht, spielt zu diesem Zeitpunkt keine Rolle
Shrout1
2
@ Shrout1 - Warum zwingen Sie die Maschine zum Ausschalten, anstatt die Maschine sicher abzuschalten?
Ramhound
6
@Ramhound Ich führe Tests durch, um festzustellen, was passiert, wenn das System nicht ordnungsgemäß heruntergefahren wird. Zufällig, ich weiß, aber ich muss genau wissen, wie dies auf den Speicher angewendet wird, damit wir nichts auf unseren Systemen verlieren, wenn es nicht richtig gehandhabt wird.
Shrout1

Antworten:

54

TL; DR: Fahren Sie Ihr System ordnungsgemäß herunter.


Der Ruhezustand hat nichts mit dem Herunterfahren zu tun. Er hängt eng mit dem Suspend-to-RAM (Ruhezustand) zusammen, außer mit dem Inhalt des Arbeitsspeichers, der auf die Festplatte verschoben wird, damit er wieder eingelesen und der Betrieb genau dort fortgesetzt werden kann, wo das System aufgehört hat .

Wenn Sie möchten, dass die Änderungen beibehalten werden, müssen Sie den Ruhezustand und den Windows-Schnellstart (eine Teilmenge des Ruhezustands) deaktivieren . Oder Sie können den Computer neu starten, anstatt ihn in den Ruhezustand zu versetzen und neu zu starten.

Der Grund, warum Änderungen nicht beibehalten werden, liegt darin, dass sie nur in der Ruhezustandsdatei auf die Festplatte geschrieben werden. Was Sie löschen, was bedeutet, dass das Dateisystem sich möglicherweise selbst reparieren und in einen Zustand zurückkehren muss, in dem es zuletzt als fehlerfrei bekannt war.

Während das System in den Ruhezustand versetzt wird, gibt es mehrere wichtige Dateisystemstrukturen, die möglicherweise nicht auf die Festplatte geschrieben wurden und sich stattdessen im RAM befinden. Das System erwartet, dass sich der Datenträger nach dem Reaktivieren aus dem Ruhezustand in einem bestimmten Zustand befindet, und es ist möglich, dass Datenträgercaches und wichtige Systemdateien in der Ruhezustandsdatei und nicht auf dem tatsächlichen Datenträger gespeichert werden.

Wenn Sie das System ordnungsgemäß herunterfahren, wird der Arbeitsspeicher von Windows ordnungsgemäß auf die Festplatte übertragen und die Bereitstellung der Festplatte vor dem Herunterfahren aufgehoben.

Um ein ordnungsgemäßes Herunterfahren zu erzwingen, öffnen Sie eine Eingabeaufforderung und geben Sie Folgendes ein

shutdown /s /f /t 0

/sist "Herunterfahren", /ferzwingen und /t 0"jetzt" bedeuten (Zeit = 0 Sekunden)

Oder Sie können einfach den Schnellstart und den Ruhezustand deaktivieren.

Weitere Informationen finden Sie unter HowtoGeek: Beim Herunterfahren wird Windows 10 nicht vollständig heruntergefahren (aber beim Neustart)


Wenn Sie einen Hard-Shutdown durchführen, besteht das Problem darin, dass Windows nicht garantiert alle Änderungen in derselben Millisekunde (oder sogar in der Minute) auf die Festplatte schreibt, in der Sie die Änderung vorgenommen haben. Es wird mit ziemlicher Sicherheit innerhalb weniger Minuten geschrieben, aber die Wahrscheinlichkeit, dass es tatsächlich geschrieben wurde, wird mit der Zeit zunehmen. Es ist unwahrscheinlich , sofort geschrieben wird, dann in der Nähe von der Zeit , Sie die Änderung steigt die Wahrscheinlichkeit stark zu machen, und wird mit ziemlicher Sicherheit innerhalb einer Stunde geschrieben worden ist.

Die Sache ist jedoch, dass Sie dem System nicht die Möglichkeit geben, Änderungen sicher auf die Festplatte zu schreiben, indem Sie ein hartes Herunterfahren erzwingen.

Die meisten modernen Dateisysteme sind so geschrieben, dass Änderungen so sicher wie möglich vorgenommen werden. In der Vergangenheit wurden sie als "atomar" bezeichnet, wie bei der Änderung entweder geschehen ist oder nicht.

Heute wissen wir, sie als Journaling - Dateisysteme , weil sie ein Protokoll der Operationen halten, der wird , dass entweder rückgängig gemacht werden kann passieren , oder vorwärts im Falle eines Systemausfalls und Neustart rollte. Beim Start nach einem Stromausfall prüft das System das Journal und prüft bei jeder Transaktion, ob die tatsächlichen Dateidaten auf die Festplatte geschrieben wurden und "gut" sind. Wenn dies der Fall ist, wird die Übertragung vorwärts ausgeführt und abgeschlossen. Wenn dies nicht der Fall ist, wird auf die alten Daten zurückgesetzt.

In dieser Reihenfolge befindet sich die Festplatte fast immer in einem leicht zu reparierenden Zustand.

Wenn Sie Ihr System jedoch zum unerwarteten Herunterfahren zwingen, können Sie nicht garantieren, dass die Transaktion so weit fortgeschritten ist, dass sie bei der Reparatur vorwärts rollen kann, und es besteht die Möglichkeit, dass ein Betriebssystem wie Linux die Transaktionshistorie weniger beachtet als Windows und wahrscheinlicher ist als nicht nur Änderungen vorzunehmen, die alles zurück und nicht vorwärts rollen.

Wenn Sie Windows neu gestartet haben, wird möglicherweise versucht, die Festplatte ordnungsgemäß zu reparieren, da das Dateisystem besser bekannt ist.

Mokubai
quelle
Danke! Ich freue mich über Ihre Antwort :) Ich habe den Ruhezustand deaktiviert, neu gestartet und den gleichen Test erneut ausgeführt. Beispiel 1 hat das gleiche Ergebnis, es ist keine Ruhezustandsdatei beteiligt. Es scheint, dass Registrierungsänderungen nur zu einem bestimmten Zeitpunkt während des Abmeldens / Herunterfahrens geschrieben werden ... Ich stimme auch zu, dass das System möglicherweise nach einem "letzten Zustand" sucht, wenn es aus einem beschädigten Ruhezustand aufwacht - es führt in der Regel Integritätsprüfungen durch.
Shrout1
1
Hmmm ... Also habe ich sysinternals "sync" heruntergeladen, wodurch der Schreibcache auf die Festplatte gezwungen wird und das hat nichts gebracht (immer noch die Schlüssel / Werte beim Abschalten verloren). Ich habe auch Process Explorer ausgeführt und mir die Datenträger-E / A in den Eigenschaften für Regedit angesehen. Es hatte E / A gelesen, aber keine E / A geschrieben. Das lässt mich denken, dass es auf das Herunterfahren warten könnte ... Kennen Sie eine überaus trockene M $ -Dokumentation, die dies deutlich machen könnte? Danke nochmal für all deine Hilfe!!
Shrout1
11
Das NTFS-Journal übernimmt keine Garantie für Dateidaten. Es geht lediglich darum, die NTFS-Metadaten konsistent zu halten, damit Sie nicht mit einem kaputten Dateisystem enden . Bei einzelnen Dateien können noch teilweise Änderungen aufgezeichnet werden, die die Datei beschädigen. Es gibt Transactional NTFS, dies wird jedoch nicht empfohlen und nur sehr selten verwendet. Aus diesem Grund führen Datenbank-Engines auch ein eigenes Journal, um die Datenkonsistenz zu gewährleisten. Siehe auch blogs.msdn.microsoft.com/oldnewthing/20130101-00/?p=5673
Bob,
2
@ Shrout1 Das setzt voraus, dass die Registrierungsänderungen im Write-Back-Cache anstehen. Es ist durchaus möglich, dass sie stattdessen separat verwaltet werden und dass dies nichts mit dem Dateisystem, dem Caching oder auf andere Weise zu tun hat. Beispielsweise wird die letzte als funktionierend bekannte Konfiguration nur bei erfolgreichem Start aktualisiert. (Ich weiß nicht genug über Registry-Interna, um sicherzugehen , wann Änderungen gespeichert werden. Dann könnte TxR beteiligt sein.)
Bob
1
Gibt es einen Grund, warum Sie das Herunterfahren erzwingen? AFAIK erzwingt nur das Schließen von laufenden Anwendungen. Dies führt nur zum Beenden von Anwendungen, die Sie ansonsten nicht schließen können, und erhöht die Wahrscheinlichkeit, dass Sie nicht gespeicherte Änderungen irgendwo verlieren, wenn Sie nicht wissen, was Sie sind Wenn Sie dies tun oder eine Anwendung in einen nicht wiederherstellbaren Zustand versetzen würden, würde ich das nicht wirklich als "richtiges" Herunterfahren bezeichnen.
NotThatGuy
39

Wie auf der MSDN-SeiteRegFlushKey dokumentiert für :

Das Aufrufen von RegFlushKey ist ein teurer Vorgang, der die systemweite Leistung erheblich beeinträchtigt, da er Festplattenbandbreite beansprucht und Änderungen an allen Schlüsseln durch alle Prozesse in der Registrierungsstruktur blockiert, die bis zum Abschluss des Löschvorgangs gelöscht werden . RegFlushKey sollte nur dann explizit aufgerufen werden, wenn eine Anwendung gewährleisten muss, dass Registrierungsänderungen sofort nach der Änderung auf der Festplatte gespeichert werden. Alle an Schlüsseln vorgenommenen Änderungen sind für andere Prozesse sichtbar, ohne dass sie auf die Festplatte geschrieben werden müssen.

Alternativ verfügt die Registrierung über einen "Lazy-Flush" -Mechanismus, mit dem Registrierungsänderungen in regelmäßigen Abständen auf die Festplatte geschrieben werden. Zusätzlich zu diesem regulären Löschvorgang werden Registrierungsänderungen beim Herunterfahren des Systems auch auf die Festplatte gelöscht. Das Löschen von Registrierungsänderungen durch "Lazy Flush" ist die effizienteste Methode zum Verwalten von Registrierungsschreibvorgängen in den Registrierungsspeicher auf der Festplatte.

Dies deutet darauf hin, dass abgesehen vom sofortigen Löschen eines bestimmten Schlüssels auf die Festplatte (wodurch alle anderen Benutzer bis zum Abschluss des Löschvorgangs aus der Registrierung ausgeschlossen werden) die Registrierung automatisch in regelmäßigen Abständen gelöscht wird Zeit, die Sie zwischen dem Schreiben des Schlüssels und dem Herunterfahren gewartet haben. Außerdem wird es beim Herunterfahren gespült, wie Sie bereits herausgefunden hatten.

Sie können die RegFlushKeyFunktion in der Software verwenden, die den Schlüssel manipuliert, oder ein zusätzliches Tool damit erstellen, um das sofortige Schreiben eines Registrierungsschlüssels auf die Festplatte zu erzwingen, wenn dies für Ihren Anwendungsfall von entscheidender Bedeutung ist.

user914877
quelle
Hallo! Ich gebe Ihnen dieses, wenn Sie einen Link in den folgenden MSDN-Artikel einfügen : Speichern von Änderungen an der Anwendungsregistrierung unter Windows 8 oder Windows Server 2012 und Hinzufügen einer kurzen Blockquote. Ihre Antwort hat mich durch das Kaninchenloch zu diesem Artikel geführt, und darin steht im Grunde dasselbe, was Sie getan haben. Vielen Dank!
Shrout1
Aber weiß jemand, wie ein Benutzer RegFlushKey aufrufen kann ?
Scott
@Scott Es scheint, dass dies in Code erfolgen muss ... Der im Beitrag aufgeführte MSDN-Artikel enthält ein C ++ - Beispiel, und ich habe gesehen, dass es in C # an anderer Stelle implementiert ist. Ich bin nicht sicher, ob dies über die Befehlszeile erfolgen kann.
Shrout1
3
@ Scott: Ich würde schockiert, wenn sync tat bündig auf die Festplatte der Registrierung. Es würde einfach keinen Sinn ergeben. Warum sollte das Leeren des Dateisystemcaches (der vom Konfigurationsmanager verwendet wird , nicht umgekehrt) plötzlich den eigenen Cache des Konfigurationsmanagers leeren? Es weiß nicht einmal, wie der Cache auf höherer Ebene aufgebaut ist, wenn überhaupt einer vorhanden ist.
Mehrdad
1
@Scott Es gibt einen Weg. Die API wurde bereits verlinkt. Es gibt Tools, mit denen Sie beliebige Win32-Funktionen aufrufen können. Die Sache ist ... Es ist ein Implementierungsdetail. Wenn Sie es aussetzen, verlassen sich die Leute darauf, und dann können Sie es nicht ändern. Erwähnenswert ist auch, dass der Systemdatenträger ein völlig anderes Biest als Wechselmedien ist. Der Systemdatenträger wird für viele Dinge verwendet, bei denen ein Handle immer geöffnet sein muss (z. B. Auslagerungsdatei). Windows unterstützt das Aufheben der Bereitstellung der Systempartition nicht und benötigt diese "Funktion" daher nicht. Plus ... versuchen Sie, die Kommentare neutral zu halten. Sie hassen Windows, wir verstehen es.
Grundlegende
14

TL; DR: Es ist sehr vorsichtig, dies zum richtigen Zeitpunkt zu tun .

Die Dokumentation zu FSCTL_MARK_AS_SYSTEM_HIVEhat folgendes zu sagen:

Der FSCTL_MARK_AS_SYSTEM_HIVESteuercode informiert das Dateisystem, dass die angegebene Datei die Systemstruktur der Registrierung enthält. Das Dateisystem muss die System-Hive-Daten zum richtigen Zeitpunkt auf die Festplatte übertragen , um Deadlocks zu vermeiden und die Datenintegrität sicherzustellen.

Ich glaube nicht, dass mehr Details öffentlich verfügbar sind.

Beachten Sie, dass die Spülung Dateisystem bedeutet nicht , die Spülung Registrierung , weil die Registrierung Caching auf ausführen können oben des Dateisystems. Um die Registrierung zuerst zu leeren , müssen Sie auf Ihren interessierenden Schlüssel hinweisen NtFlushKeyoder ZwFlushKeyangerufen werden.

Mehrdad
quelle
Oh, guter Fang! Das ist mein neuer Lieblings-MSDN: genau der richtige Moment . Mein vorheriger Favorit war "Vorsicht beim Angeben der TOP-Klausel in einer Abfrage, die einen UNION-, UNION ALL-, EXCEPT- oder INTERSECT-Operator enthält. Es ist möglich, eine Abfrage zu schreiben, die unerwartete Ergebnisse zurückgibt ", was ein Euphemismus für "diese Funktion ist schlecht gebrochen und macht nicht das, was eine vernünftige Person erwarten würde und anstatt es zu reparieren, werden wir es dokumentieren ".
Davidbak
@davidbak: lol, gut in der Verteidigung von MSDN, ich verstehe nicht wirklich, auf welche detaillierteren Informationen sich ein Benutzer verlassen sollte.
Mehrdad
Oh, du hast Recht; Offensichtlich war dies nur ein Dokument, das als Ergebnis der vor langer Zeit abgeschlossenen EU-Vereinbarung gedient hat, in der Microsoft alle APIs dokumentieren musste - unabhängig davon, wie intern sie sind. Auf dieser Seite, die Sie verlinkt haben, heißt es sogar "Nur Kernel-Komponenten können diesen Dateisystem-Steuercode verwenden". Trotzdem " genau zum richtigen Zeitpunkt " - eines Tages werde ich einige meiner APIs mit "Diese Methode nur zum richtigen Zeitpunkt aufrufen" dokumentieren und sehen, was passiert ....
davidbak
@davidbak: Ich denke, du bist ein bisschen ... aufgeregt. :-P Ich vermute, dass dies dokumentiert wurde, um Dateisystemtreibern mitzuteilen , welche Datei die SYSTEM-Registrierungsstruktur enthält. Dies kann insofern wichtig sein, als sie nicht gleichzeitig mit dieser Datei versuchen würden, etwas in die Registrierung zu schreiben wird auf die Festplatte gespült. Ich habe jedoch keinen Beweis dafür; Das ist nur ein Grund, warum ich es für denkbar halte. Ein Zweifel, den ich daran habe, ist, warum ein Plattentreiber dies auch nicht wissen müsste.
Mehrdad