Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Updates (https://www.delphipraxis.net/183975-windows-shutdown-mittels-initiatesystemshutdown-ohne-installieren-von-windows-updates.html)

devidespe 17. Feb 2015 10:53

Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Updates
 
Hallo,

ich habe eine Funktion, die Windows mittels InitiateSystemShutdown herunterfährt und diesen Vorgang auch erzwingt, unabhängig von den offenen Applikationen. Da dieser Shutdown allerdings bei 10 Prozent Restladung der Notebook-Batterie stattfinden soll, ist es nicht in Ordnung, wenn Windows die inzwischen im Hintergrund heruntergeladenen Updates während des Shutdowns installieren möchte - dafür könnte die Restladung nicht ausreichen.

Daher nun die Frage, wie ich möglichst mit der gleichen Funktion InitiateSystemShutdown den Shutdown durchführen kann, ohne eventuell heruntergeladene Windows-Updates zu installieren? Im Startmenü existiert so eine Option ja, da stelle ich mir vor, dass es einen entsprechenden API-Aufruf dafür geben muss.

Vielen Dank für Eure Hilfe.

Delphi-Quellcode:
function WindowsShutDown(Computer : string; Msg : string; Time: Word; Force : Boolean; Reboot: Boolean) : Boolean;
var rl, hToken : Cardinal;
    tkp       : TOKEN_PRIVILEGES;
begin
  Result:=False;
  if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  ShowMessage('Fehler beim Windows-Shutdown aufgetreten.') else
  begin
    if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
    begin
      tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
      tkp.PrivilegeCount:=1;
      AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
      if GetLastError <> ERROR_SUCCESS then
      ShowMessage('Fehler beim Windows-Shutdown aufgetreten.') else
      begin
        Result:=InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot);
        if Result = False then
        ShowMessage('Fehler beim Windows-Shutdown aufgetreten.');
      end;
    end else ShowMessage('Fehler beim Windows-Shutdown aufgetreten.');
  end;
end;

Der schöne Günther 17. Feb 2015 11:03

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Bevor Sir Rufo damit kommt, sage ich es mal:
Mit dem
Delphi-Quellcode:
ShowMessage('Fehler beim Windows-Shutdown aufgetreten.')
tust du dir keinen Gefallen. Der Benutzer bekommt eine harmlos aussehende Info-Box, dass es einen Fehler gab. Wenn er dir das mitteilt, wie sehr hilft dir diese Info weiter? Würdest du
Delphi-Quellcode:
RaiseLastOSError()
benutzen könnte die übergeordnete Methode nicht nur auf eine EOSError-Exception lauschen und diese behandeln, du bekommst weiterhin noch einen Windows-Errorcode (den konkreten Grund) der dir einiges mitteilen kann.


Die eigentliche Frage finde ich ziemlich interessant und habe leider auch keine Antwort. Ich benutze statt
Delphi-Quellcode:
InitateSystemShutdown
Delphi-Quellcode:
ExitWindowsEx
, aber das wird im Endeffekt wohl keinen Unterschied machen. Auf StackOverflow hatte jemand die gleiche Frage wie du, aber ebenso keine Antwort.

himitsu 17. Feb 2015 11:18

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Die Einzige Lösung, welche ich da kenn: Nicht runterfahren, sondern "nur" in den Ruhezustand versetzen.

Geht schneller, beendet keine Programme und startet keine Updates. :stupid:

Zitat:

Da dieser Shutdown allerdings bei 10 Prozent Restladung der Notebook-Batterie stattfinden soll,
Macht das Windows nicht schon von sich aus?

Selbst das Notrunterfahren bei niedrigem Akku, von Windows, baut diesen Scheiß.
Mein Schlepptop ist so eingestellt, daß er bei 3% "runterfährt". (Es würde auch 1% reichen, aber weniger lies sich nicht einzistellen und dann das Problem mit den Updates)

devidespe 17. Feb 2015 11:25

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Die Lösung mit ShowMessage ist der hier vereinfachte Weg, im eigentlichen Code kommt dort zusätzlich ein Logging mit mehr Statusdetails zum Einsatz. Das ist aber garnicht das Problem, da der Shutdown mittels InitiateSystemShutdown ja fehlerfrei gelingt.

Aber die Update-Installation kann ich nicht umgehen, und das ist der Kern des Übels.

Selbst wenn ich das Notebook in den Ruhezustand schicke (bei 5 oder 3 Prozent), zwinge ich den Anwender kurzfristig auf Netzstrom zu wechseln. Das wollte ich mit dem vollständigen Shutdown umgehen.

himitsu 17. Feb 2015 11:31

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Zitat:

Zitat von devidespe (Beitrag 1290169)
zwinge ich den Anwender kurzfristig auf Netzstrom zu wechseln

Wieso?

Das Einzige Problem, was ich damit hatte ..
Wenn man den Schlepptop wieder anschaltet und dabei nicht am Netz hängt oder zwischenzeitlich aufgeladen hat, dann fährt das Ding hoch, stürzt eventuell wegen zu wenig Baterie gleich wieder ab und man hat einen Datenverlust, aber das wäre auch passiert, wenn man das Ding hart runterfährt und alles abschießen lässt. :stupid:

devidespe 17. Feb 2015 11:35

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Hmm, ich muss Datenverlust durch solche Aktionen ausschließen können und wenn ich Windows in den Ruhezustand schicke, inzwischen die Restladung komplett auf 0 % geht, und ich danach wieder einschalte, dann habe ich Datenverlust.

Das wäre ich umgangen, wenn ich Windows ohne Updateinstallation sauber heruntergefahren hätte.

himitsu 17. Feb 2015 11:40

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Ruhezustand <> Standby <> Hybrid

die Kurzfassungen:

Ruhezustand:
* speichere RAM auf Festplatte
* schalte Computer aus

* beim Einschalten wird der RAM wieder geladen


Hybrid = wie Ruhezustand und Standby zusammen
* RAM speichern
* nicht runterfahren ... nur Stromsparmodus (wie Standby)

* wenn zwischendurch ganz aus, dann von HDD laden (wie Ruhezustand)
* ansonsten direkt weiter (wie Standby)

devidespe 17. Feb 2015 12:00

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Hmm es sieht so aus, dass der Ruhezustand tatsächlich in Frage kommen könnte, ohne Datenverlust. Die Caches scheinen geleert zu werden und der RAM auf die Festplatte geschrieben und unabhängig von einem kompletten Stromabfall wieder beim nächsten Start geladen zu werden.

Klingt nach einer interessanten Alternative. Nun die Frage des wie?

Der schöne Günther 17. Feb 2015 12:16

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Ruhezustand?
http://stackoverflow.com/q/4095021/2298252
oder
http://www.delphipraxis.net/856700-post10.html

Aber irgendwie schade wenn es keine Lösung für das "Update-Problem" gäbe.

baumina 17. Feb 2015 12:23

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Also bei InitiateShutdown statt InitiateSystemShutdown gibt's ein Flag SHUTDOWN_INSTALL_UPDATES, habs nur kurz überflogen und kann nicht sagen ob das wirklich hilft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz