Wie kann ich den Grund für den letzten Neustart von Windows ermitteln?

72

Ich möchte wissen, welche Windows-API-Funktion (falls vorhanden) Informationen zur letzten Windows-Neustartquelle enthält. Es gibt drei mögliche Hauptursachen:

  1. Der Computer stürzte auf einem blauen Bildschirm ab
  2. Ein Benutzer oder ein Programm hat den Computer heruntergefahren / neu gestartet
  3. Eine verlorene Kraft

Je mehr Details ich bekommen kann, desto besser. Ich muss jedoch zumindest wissen, welcher Grund von den Hauptgründen stammt.

Ich muss Windows Vista und Windows 7 unterstützen.

Antworten:

Es scheint, dass es keine direkte API gibt, um diese Informationen zu erhalten. Stattdessen müssen wir das Windows-Ereignisprotokoll abrufen. Informationen zum Neustart des Systems finden Sie in der Ereignisanzeige / Windows-Protokolle / System. Hier sind die verschiedenen Informationen, die von den Ereignis-IDs bereitgestellt werden:

  • 6005: Windows-Start
  • 6006: Windows herunterfahren (richtig)
  • 6008: Windows herunterfahren (unerwartet)

Ich verstehe den Unterschied zwischen Stromausfall und Systemabsturz noch nicht, aber es ist ein guter Anfang.

Frederic
quelle
Mögliches Duplikat: stackoverflow.com/questions/1315858/…
George Johnston
3
Dieser Beitrag ist über C #, ich brauche Windows API (C / C ++)
Frederic

Antworten:

77

In diesem Artikel wird ausführlich erläutert, wie Sie den Grund für das letzte Starten / Herunterfahren ermitteln. In meinem Fall lag dies daran, dass Windows SCCM Updates übertrug, obwohl ich es lokal deaktiviert hatte. Besuchen Sie den Artikel für alle Details mit Bildern. Als Referenz sind hier die Schritte aufgeführt, die von der Website kopiert / eingefügt wurden:

  1. Drücken Sie die Tasten Windows+ R, um das Dialogfeld Ausführen zu öffnen eventvwr.msc, geben Sie ein und drücken Sie Enter.

  2. Wenn Sie von der Benutzerkontensteuerung dazu aufgefordert werden, klicken / tippen Sie auf Ja (Windows 7/8) oder Weiter (Vista).

  3. Doppelklicken / tippen Sie im linken Bereich der Ereignisanzeige auf Windows-Protokolle , um sie zu erweitern, klicken Sie auf System , um sie auszuwählen , klicken Sie mit der rechten Maustaste auf System und klicken / tippen Sie auf Aktuelles Protokoll filtern .

  4. Führen Sie entweder Schritt 5 oder 6 aus, um festzustellen, welche Abschaltereignisse Sie sehen möchten.

  5. Anzeigen der Daten und Zeiten aller Benutzerabschaltungen des Computers

    A) Klicken / tippen Sie in Ereignisquellen auf den Dropdown-Pfeil und aktivieren Sie das Kontrollkästchen USER32.

    B) Geben Sie im Feld Alle Ereignis-IDs Folgendes ein1074 und klicken Sie auf OK .

    C) Auf diese Weise erhalten Sie eine Liste der Ereignisse zum Ausschalten (Herunterfahren) und Neustarten des Herunterfahren. Ereignistyp oben im mittleren Bereich der Ereignisanzeige.

    D) Sie können durch diese aufgelisteten Ereignisse scrollen, um die Ereignisse mit ausgeschaltetem Gerät als Abschalttyp zu finden. Sie werden das Datum und die Uhrzeit sowie den Benutzer bemerken, der für das Herunterfahren des Computers pro aufgeführtem Ausschaltereignis verantwortlich war.

    E) Weiter mit Schritt 7.

  6. Anzeigen der Daten und Zeiten aller unerwarteten Herunterfahren des Computers

    A) Geben Sie im Feld Alle Ereignis-IDs Folgendes ein6008 und klicken Sie auf OK .

    B) Dadurch erhalten Sie eine Liste unerwarteter Abschaltereignisse oben im mittleren Bereich der Ereignisanzeige . Sie können durch diese aufgelisteten Ereignisse scrollen, um Datum und Uhrzeit der einzelnen Ereignisse anzuzeigen.

Mahesh Neelakanta
quelle
Perfekt. Ich habe den Ereignisquellenfilter mit USER32 verwendet und festgestellt, dass die Dell-Wiederherstellung mein System neu startet.
Max
Vielen Dank! Durch Filtern von Systemereignissen mit Ereignis-IDs von 6008 werden die kritischen Ereignisse aufgelistet, die das Herunterfahren verursacht haben.
Noam Manos
Dies ist im Wesentlichen eine reine Linkantwort. Falls auf den Link nicht mehr zugegriffen werden kann, enthält diese Antwort keine nützlichen Informationen mehr. Außerdem fordert das OP einen API-Aufruf an. Ihr Link liefert die Antwort, indem Sie den Benutzer durch eine Reihe manueller Schritte navigieren. Dies ist keine Lösung für das gestellte Problem.
IInspectable
Es ist seltsam. Es sagt mir, dass der Administrator das Herunterfahren anruft. Es ist in letzter Zeit häufiger vorgekommen und hat dies sogar mehr als einmal einige Minuten nacheinander bemerkt. Ich muss kompromittiert worden sein :(
Piotr Kula
Wenn das System aufgrund eines Bugchecks / BSOD neu gestartet wird, lautet die Ereignis-ID 1001 und nicht 6008. Dieser Link enthält Erläuterungen zu den verschiedenen Bugcheck-Codes, die Sie möglicherweise in der Ereignisanzeige finden .
aviraldg
17

Schauen Sie sich die Ereignisprotokoll-API an . Fall a) (Bluescreen, Benutzer hat das Netzkabel durchtrennt oder das System hängt) bewirkt, dass beim nächsten Neustart des Systems ein Hinweis ("System wurde nicht ordnungsgemäß heruntergefahren" oder ähnliches) im Ereignisprotokoll "System" belassen wird. Sie sollten in der Lage sein, programmgesteuert mit der oben genannten API darauf zuzugreifen (ehrlich gesagt habe ich es nie verwendet, aber es sollte funktionieren).

Alexander Gessler
quelle
2
Gefunden, im Systemereignisprotokoll.
Frederic
3
Ich habe festgestellt, dass diese Meldung angezeigt wird, wenn das System einfriert: "Das System wurde neu gestartet, ohne zuvor sauber heruntergefahren zu werden. Dieser Fehler kann verursacht werden, wenn das System nicht mehr reagiert, abstürzt oder unerwartet die Stromversorgung verliert." Dies scheint eine generische Nachricht zu sein. Weiß jemand, ob es eine Möglichkeit gibt, zwischen Bluescreens und Systemfrieren zu unterscheiden?
Luiz C.