Delphi-PRAXiS

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.

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

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Ja! Das sieht doch genau richtig aus!

Warum haben wir das alle bis grade übersehen? ExitWindows, ExitWindowsEx, InitiateShutdown, InitiateSystemShutdown, InitiateSystemShutdownEx, ... Wie viele braucht man eigentlich?

devidespe 17. Feb 2015 14:53

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Hmm, das Flag SHUTDOWN_INSTALL_UPDATES sagt laut MSDN:

The computer installs any updates before starting the shutdown.

was ich so interpretiere, dass Updates grundsätzlich nicht installiert werden, wenn ich dieses Flag nicht aktiv setze. Mit gesetzten Flag sollten dann evtl. heruntergeladene Updates installiert werden.

Seltsame Auslegung. Das muss ich mal ausprobieren.

hathor 17. Feb 2015 15:11

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Registry ändern:
siehe
https://technet.microsoft.com/de-de/...=ws.10%29.aspx
Code:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAUShutdownOption"=dword:00000001
"NoAUAsDefaultShutdownOption"=dword:00000001
"NoAutoRebootWithLoggedOnUsers"=dword:00000001
Rückgängig machen:

Code:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAUShutdownOption"=-
"NoAUAsDefaultShutdownOption"=-
"NoAutoRebootWithLoggedOnUsers"=-
In 2 Batch-Files kopieren, doppelklick - fertig.

Dalai 17. Feb 2015 15:34

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

Zitat von hathor (Beitrag 1290227)
Registry ändern:

Dafür braucht man sehr wahrscheinlich Adminrechte, weil die Einstellungen zwar im HKCU stehen, aber im Zweig Policies. Sonst könnte ja jeder Nutzer an den Policies drehen, die ihm vom Admin verpasst wurden.

MfG Dalai

devidespe 17. Feb 2015 17:23

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
Admin-Rechte hätte ich und die Registry wäre auch ne Option, ich hätte aber gedacht, dass sich das mit einem Flag einfacher und ohne dauerhafte Rückstände durchführen lässt...

devidespe 17. Feb 2015 18:28

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
So, ich habe InitiateShutdown mit folgendem Aufruf getestet, und das Startmenü wies zu diesem Zeitpunkt eine Option zum Herunterfahren mit Updates aus - also genau die Situation die ich meinte:

Delphi-Quellcode:
Result:=InitiateShutdown(nil, nil, Time, SHUTDOWN_FORCE_SELF or SHUTDOWN_GRACE_OVERRIDE or SHUTDOWN_POWEROFF, 0);
Zunächst einmal das Positive: der Shutdown funktioniert ohne das Installieren der Updates. Allerdings liefert Result immer False zurück und eine abschließende GetLastError-Abfrage dann wiederum 0.

HolgerX 17. Feb 2015 18:52

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

erstmal:
InitiateShutdown liefert kein Bool als Result, sondern nen DWORD mit dem FehlerCode.

Desweiteren:
Welchen Wert hat den in deinem Aufruf 'Time'?

Zitat:

If the value of this parameter is greater than zero, and the dwShutdownFlags parameter specifies the flag SHUTDOWN_GRACE_OVERRIDE, the function fails and returns the error code ERROR_BAD_ARGUMENTS.
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

Holger

Zacherl 17. Feb 2015 20:48

AW: Windows-Shutdown mittels InitiateSystemShutdown ohne installieren von Windows-Upd
 
[OT] Wenn gar nichts hilft, probiers mal mit MSDN-Library durchsuchenNtShutdownSystem :stupid: [/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr.

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