![]() |
Nicht durchgeführten Neustart nach Windowsupdate detektieren
Bei Benutzung von Dateilockings von Datenbanken kann es zu erheblichen Datenschädigungen, wenn nach einem Windowsupdate kein Neustart durchgeführt wurde. Deshalb soll ein Programm dem Benutzer melden, wenn das Windows nach einem Update nicht neugestartet wurde. Nach viel Recherche und etwas Ausprobieren, habe ich herausgefunden, dass es einen Registry-Ordner namens 'HKLM\Software\Microsoft\Windows\CurrentVersion\Wi ndowsUpdate\Auto Update\RebootRequired' gibt, welcher genau diese Aussage macht. Diesen möchte ich nun in meiner Delphianwendung abfragen (siehe Code unten), ob dieser existiert, denn die reine Existenz dieses Ordners gibt die entscheidende Antwort.
Das funktioniert aber nicht. Man ließt in anderen Beiträgen, dass es an fehlenden Adminrechten liegen kann, aber selbst, wenn man die Anwendung manuell als Admin startet, funktioniert es hier nicht. Die Funktion liefert immer false zurück. Zum Testen habe ich den Key immer etwas gekürzt zu '\SOFTWARE\Microsoft\Windows\CurrentVersion\Window sUpdate\', weil dieser Ordner ja vorhanden ist. Aber auch das funktioniert einfach nicht. Hat jemand eine Idee, wie man das hinbekommt?
Code:
function RechnerNeustart_nach_WindowsUpdates_ausstehend : boolean; // 'HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
var reg : TRegistry; begin result:= false; reg:= TRegistry.Create(KEY_READ); try reg.RootKey:= HKEY_Local_Machine; // reg.RootKey:= HKEY_CURRENT_USER; <- geht // if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate') then // if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\', False) = True then // if reg.OpenKey('\SOFTWARE\Adobe\', False) = True then <- geht if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired') then begin result:= True; end else begin end; finally reg.Free; end; end; Markus |
AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren
Geht es um eine 32-bit-Anwendung auf einem 64-bit-System? Bei Zugriffen auf HKLM ist dann auch KEY_WOW64_64KEY als Flag anzugeben, und nicht nur KEY_READ.
|
AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren
Zitat:
kommt man schon bis zu 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\'. Sobald man tiefer geht bis 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Wi ndowsUpdate\Auto Update\', geht es immer noch nicht.
Code:
:wall:
function RechnerNeustart_nach_WindowsUpdates_ausstehend : boolean; // 'HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
var reg : TRegistry; begin result:= false; reg:= TRegistry.Create(KEY_READ OR $0100 ); // KEY_WOW64_64KEY try reg.RootKey:= HKEY_Local_Machine; // reg.RootKey:= HKEY_CURRENT_USER; <- geht // if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\') then <- geht if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\') then // <- geht NICHT // if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\', False) = True then // if reg.OpenKey('\SOFTWARE\Adobe\', False) = True then <- geht // if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired') then begin result:= True; end else begin end; finally reg.Free; end; end; |
AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren
Also ich lese die Registry (W7 64Bit) so aus (Die Angabe des Programmpfads in der Registry wird ausgelesen):
Delphi-Quellcode:
Edit: Aber bei deinem Reg-Key bekomme ich auch keine Ausgabe. Kann es sein das Windoof den Zugriff hierzu sperrt bzw. du mit bestimmten Berechtigungen hier ran musst?
procedure HiPathClick(Sender: TObject);
var Reg : TRegistry; //... in diesem Context unwichtige Variablen begin //... in diesem Context unwichtiger Code reg := TRegistry.Create; Reg.Rootkey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\App Paths\Ass_150e.exe\', false) then begin ShellExecute(Handle, 'open', PChar(reg.ReadString('Path') + '\Ass_150e.exe'), Pchar('"geheime" Parameter'), nil, SW_SHOW); end else showmessage('"HiPath Manager 3000 E" wurde nicht gefunden!'); Reg.Free; end; Aber schau mal hier (Google sagt): ![]() Anscheinend kann man hier "nur lesend" zugreifen? |
AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren
Also bei mir einwandfrei (Lazarus, aber TRegistry sollte 100% kompatibel sein) ein paar Tests:
Code:
Und sonst: OutputDebugString(PChar(SysErrorMessage(GetLastErr or)))... prüf doch einfach, warum es nicht geht :)
program regwinupdate;
uses Registry; var reg: TRegistry; begin reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\') then begin WriteLn('[+] Key exists.'); end else begin WriteLn('[-] Key missing.'); end; if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\', False) then begin WriteLn('[+] Key opened.'); end else begin WriteLn('[-] Unable to access.'); end; if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired') then begin WriteLn('[i] Reboot required.'); end else begin WriteLn('[i] No reboot required.'); end; finally reg.Free; end; ReadLn; end. |
AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren
Ich hab den source von CCRDUDE für D7 und W8 angepasst:
Delphi-Quellcode:
Das funktioniert!
program Project1;
{$APPTYPE CONSOLE} uses SysUtils,registry,windows; var reg: TRegistry; begin //reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); reg:=TRegistry.Create(KEY_READ or $0100); try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\') then begin WriteLn('[+] Key exists.'); end else begin WriteLn('[-] Key missing.'); end; if reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\', False) then begin WriteLn('[+] Key opened.'); end else begin WriteLn('[-] Unable to access.'); end; if reg.KeyExists('\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired') then begin WriteLn('[i] Reboot required.'); end else begin WriteLn('[i] No reboot required.'); end; finally reg.Free; end; ReadLn; end. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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