AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Updates

Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Updates

Ein Thema von devidespe · begonnen am 17. Feb 2015 · letzter Beitrag vom 17. Feb 2015
Antwort Antwort
Seite 1 von 2  1 2   
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
433 Beiträge
 
Delphi 10.4 Sydney
 
#1

Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Updates

  Alt 17. Feb 2015, 11:53
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;
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.963 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 17. Feb 2015, 12:03
Bevor Sir Rufo damit kommt, sage ich es mal:
Mit dem 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 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 InitateSystemShutdown ExitWindowsEx , aber das wird im Endeffekt wohl keinen Unterschied machen. Auf StackOverflow hatte jemand die gleiche Frage wie du, aber ebenso keine Antwort.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.494 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 17. Feb 2015, 12:18
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.

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu (17. Feb 2015 um 12:26 Uhr)
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
433 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 17. Feb 2015, 12:25
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.494 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 17. Feb 2015, 12:31
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
433 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 17. Feb 2015, 12:35
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.494 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 17. Feb 2015, 12:40
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu (17. Feb 2015 um 13:08 Uhr)
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
433 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 17. Feb 2015, 13:00
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?
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.963 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

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

  Alt 17. Feb 2015, 13:16
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.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 17. Feb 2015, 13:23
Also bei InitiateShutdown statt InitiateSystemShutdown gibt's ein Flag SHUTDOWN_INSTALL_UPDATES, habs nur kurz überflogen und kann nicht sagen ob das wirklich hilft.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf