AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Nicht durchgeführten Neustart nach Windowsupdate detektieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nicht durchgeführten Neustart nach Windowsupdate detektieren

Ein Thema von Markus Effenberger · begonnen am 14. Jan 2019 · letzter Beitrag vom 14. Jan 2019
Antwort Antwort
Markus Effenberger

Registriert seit: 2. Jul 2014
44 Beiträge
 
Delphi 10.3 Rio
 
#1

Nicht durchgeführten Neustart nach Windowsupdate detektieren

  Alt 14. Jan 2019, 09:29
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
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren

  Alt 14. Jan 2019, 09:51
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.
  Mit Zitat antworten Zitat
Markus Effenberger

Registriert seit: 2. Jul 2014
44 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren

  Alt 14. Jan 2019, 10:59
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.
Habe mit deinem Hinweis etwas gesucht. Mit dem überarbeitetem Code
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:
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;
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren

  Alt 14. Jan 2019, 11:07
Also ich lese die Registry (W7 64Bit) so aus (Die Angabe des Programmpfads in der Registry wird ausgelesen):

Delphi-Quellcode:
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;
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?

Aber schau mal hier (Google sagt): https://www.delphipraxis.net/1189319-post8.html
Anscheinend kann man hier "nur lesend" zugreifen?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (14. Jan 2019 um 11:26 Uhr)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren

  Alt 14. Jan 2019, 11:25
Also bei mir einwandfrei (Lazarus, aber TRegistry sollte 100% kompatibel sein) ein paar Tests:

Code:
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.
Und sonst: OutputDebugString(PChar(SysErrorMessage(GetLastErr or)))... prüf doch einfach, warum es nicht geht
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Nicht durchgeführten Neustart nach Windowsupdate detektieren

  Alt 14. Jan 2019, 12:40
Ich hab den source von CCRDUDE für D7 und W8 angepasst:
Delphi-Quellcode:
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.
Das funktioniert!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:30 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