![]() |
Wie am Besten Shutdowns protokollieren?
Hallo,
bezgl. des oben erwähnten Themas gibt es ja seit W2k folgenden Ablauf bzw. damit verbundenes Problem: Bei einem ausgelösten Shutdown wird jedes zu dieser Zeit noch laufende Programm jeweils zuerst mit der WM_QueryEndSession-Message beschickt. Als nächstes, sofern der Shutdown davor durch die Query nicht abgelehnt wurde, bekommt es dann schon die WM_EndSession-Message, woraufhin das Prog beendet wird. DANACH ERST wird das nächste noch laufende Programm auf die gleiche Weise behandelt. Da man so ein Shutdown-Protokoll-Programm normalerweise aber über den Run-Schlüssel der Registry startet und die Programme beim Shutdown dann in der gleichen Reihenfolge aufgerufen werden, in der sie auch gestartet wurden, kann also leicht folgende Situation entstehen: Dieses besagte Protokoll-Programm wird als erstes aufgerufen, protokolliert den Zeitpunkt des Shutdowns und wird dann beendet. Danach kommt das nächste noch laufende Programm dran, kriegt die WM_QueryEndSession-Message und lehnt den Shutdown aber ab. Folge: Der Shutdown wurde protokolliert, das dafür zuständige Programm beendet und danach wurde der Shutdown-Vorgang aber selbst abgebrochen!!! :? Als Lösung habe ich mir dabei schon überlegt: 1.) ...dass sich das Protokollprogramm in dieser Situation einfach selbst nochmal aufruft, um so ans "Ende" aller momentan noch laufenden Programme zu gelangen ...und damit Shutdown-mäßig auch erst dann angesprochen zu werden, wenn es nach ihm auch wirklich zum Shutdown kommt. 2.) ...man müsste diesem Protokollprogramm so einen Status verpassen können, wie Systemprogrammen ala, svchost.exe,WinMgmt.exe o. spoolsv.exe. ...die ja auch irgendwie nicht abgefragt werden und Shutdown-mäßig auch erst irgendwie "später" dran sind. Nur wie das am Besten bewerkstelligen??? ...oder gibt's da event. noch andere/bessere Möglichkeiten? Thx. |
Re: Wie am Besten Shutdowns protokollieren?
Nach WM_QueryEndSession wird doch noch ein WM_ENDSESSION gesendet, dessen wparam true ist, wenn Windows tatsächlich heruntergefahren wird.
EDIT: Zu 2): Diese Programme sind allesamt Dienste, sprich du müsstest einen solchen schreiben, um selbigen Status zu bekommen. |
Re: Wie am Besten Shutdowns protokollieren?
Moin TStringList,
ich weiss zwar nicht, ob das für Deinen Zweck brauchbar ist aber, das System protokolliert einen Shutdown im Eventlog. Es handelt sich hier um das Systemlog, EventID 6006 "Der Ereignisprotokolldienst wurde beendet.". Das müsste, IMHO, die letzte Aktion sein. |
Re: Wie am Besten Shutdowns protokollieren?
hallo & thx (@both)
Zitat:
Zitat:
Zitat:
|
Re: Wie am Besten Shutdowns protokollieren?
Bei mir (WinXP SP2) wird WM_ENDSESSION nur bei einem tatsächlichen herunterfahren/abmelde etc. mit Message.result = 0 ausgelöst, bei Abbruch oder normalem beenden des Programms nicht. WM_ENDSESSION ist auch in der PSDK eindeutig mit WM_QueryEndSession verknüpft.
Zitat:
|
Re: Wie am Besten Shutdowns protokollieren?
Zitat:
Zitat:
Schreib doch mal bitte folgendes kleine Programm:
Delphi-Quellcode:
...und starte es danach 3 mal im Abstand von mindestens 1 Sekunde, so dass alle 3 Progs dann gleichzeitig auf dem Screen zu sehen sind. Danach führe einen Shutdown aus. Ergebnis (jedenfalls bei mir): Solange ich einen MessageDlg mit "Yes" beantworte, bekomme ich auch immer schon unmittelbar danach einen hohen Ton zurück; dieses jeweilige Programm verschwindet dann und danach erst erscheint der MessageDlg des jeweils eins o. zwei Sekunden später gestarteten Programms! Den MessageDlg des dritten Progs kann ich dann schließlich mit "No" beantworten und der Shutdown-Vorgang wird dadurch insgesamt abgebrochen! ...Was doch also heißen muss, dass WM_EndSession-Messages davor keine gültige Information über den wirklichen Ausgang des Shutdown-Vorgangs haben können (sondern höchsten über eine diesbezügliche Absicht des Systems).
...
private { Private-Deklarationen } procedure QueryEndSessionHandler(var Msg : TMessage); message WM_QueryEndSession; procedure EndSessionHandler(var Msg : TMessage); message WM_EndSession; public ... procedure TForm1.QueryEndSessionHandler(var Msg : TMessage); begin if MessageDlg('Prog: '+Application.Title+#13#13'WM_QueryEndSession is arrived! Agree?', mtWarning,mbYesNoCancel,0) <> mrYes then Msg.Result := integer(False) else Msg.Result := integer(True); end; procedure TForm1.EndSessionHandler(var Msg : TMessage); begin if Msg.WParam = integer(true) then windows.beep(2000,1000); if Msg.WParam = integer(false) then windows.beep(500,1000); end; procedure TForm1.FormCreate(Sender: TObject); begin Form1.Caption := TimeToStr(Now); Application.Title := TimeToStr(Now); end; So das Ganze jedenfalls bei Windows 2000 Pro. Ich kann mir aber irgendwie nur schlecht vorstellen, dass bei WinXP das anders läuft. Bei Windows Me/98/95 jedoch scheint es noch anders gewesen zu sein, aber aus irgendwelchen unerfindlichen Gründen haben sie das dann wohl geändert. WM_QueryEndSession -> PSDK: Zitat:
|
Re: Wie am Besten Shutdowns protokollieren?
Jetzt ist klar, was du meinst (denke ich): Programme, die sich nicht mit einer Antwort auf WM_QueryEndSession "wehren", werden teilweise beendet, bevor ein anderes Programm den Shutdown ablehnt.
Ich konnte dies zwar mit dem Test-Protokollprogramm, das kein WM_QueryEndSession sondern nur WM_EndSession behandelt, nicht reproduzieren, aber eventuell ist ein Dienst tatsächlich sicherer, bzw. die Auswertung des Eventlog. |
Re: Wie am Besten Shutdowns protokollieren?
Sofern du dieses Test-Protokollprogramm früher gestartet hast als dasjenige, welches dann den Shutdown ablehnt, sollte dieses Test-Prog einfach schon aus der Taskbar (oder auch dem Taskmanager) verschwunden sein. Müsste also eher leicht feststellbar sein. (Wenn die WM_QueryEndSession nicht extra behandelt wird, schickt nämlich die DefWindowProc damit ein True zurück).
Zum Dienst: Sowas können wir ja leider mit einer D7PE nicht erzeugen :wall: , oder? Dazu fehlt uns neben den Menue-Einträgen in der Objektgalerie nämlich auch noch das TService-Objekt bzw. die SvcMgr-Unit. Trifft das eigentlich auch noch auf D2005PE zu? Gemäß 'Klatsch & Tratsch' hast du doch beide Versionen und bestimmt auch eine davon installiert :) . Wäre jedenfalls cool wenn die das vielleicht irgendwann mal zufälligerweise geändert hätten... :drunken: |
Re: Wie am Besten Shutdowns protokollieren?
Sieh Dir mal
![]() |
Re: Wie am Besten Shutdowns protokollieren?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz