AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Windows beenden und dabei Updates installieren

Windows beenden und dabei Updates installieren

Ein Thema von TUX_der_Pinguin · begonnen am 22. Jul 2015 · letzter Beitrag vom 2. Dez 2015
Antwort Antwort
Seite 2 von 2     12
boeseboese

Registriert seit: 23. Nov 2015
8 Beiträge
 
#11

AW: Windows beenden und dabei Updates installieren

  Alt 23. Nov 2015, 15:14
Hallo,

wäre evtl. jemand so freundlich das geschilderte Programm in der kompletten endgültigen Fassung zu quoten, so dass man es seinem Compiler vor die Füße werfen kann?

Danke und Gruß
boese²
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
603 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Windows beenden und dabei Updates installieren

  Alt 24. Nov 2015, 09:50
Hallo,

wäre evtl. jemand so freundlich das geschilderte Programm in der kompletten endgültigen Fassung zu quoten, so dass man es seinem Compiler vor die Füße werfen kann?

Danke und Gruß
boese²
Hier ein kleines Programm welches nur den Rechner veranlasst herunterzufahren. Es sollten dann auch die Updates installiert werden.
Im Anhang befindet sich die Projekt Dateien samt Quelltext und EXE-File.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm15 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form15: TForm15;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm15.Button1Click(Sender: TObject);
begin
  WindowsShutDown(nil, nil, 0, True, False);
end;

end.
Delphi-Quellcode:
unit Unit2;

interface
uses
  Windows,
  SysUtils;

const
  SHUTDOWN_FORCE_OTHERS = $00000001;
  SHUTDOWN_FORCE_SELF = $00000002;
  SHUTDOWN_GRACE_OVERRIDE = $00000020;
  SHUTDOWN_HYBRID = $00000200;
  SHUTDOWN_INSTALL_UPDATES = $00000040;
  SHUTDOWN_NOREBOOT = $00000010;
  SHUTDOWN_POWEROFF = $00000008;
  SHUTDOWN_RESTART = $00000004;
  SHUTDOWN_RESTARTAPPS = $00000080;

function WindowsShutDown(Computer: PChar; Msg: PChar; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
function InitiateShutdown(lpMachineName, lpMessage: PWideChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdown}
function InitiateShutdownA(lpMachineName, lpMessage: PAnsiChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdownA}
function InitiateShutdownW(lpMachineName, lpMessage: PWideChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdownW}

implementation

function InitiateShutdown; external advapi32 name {$IFDEF UNICODE}'InitiateShutdownW'{$ELSE}'InitiateShutdownA'{$ENDIF};
function InitiateShutdownA; external advapi32 name 'InitiateShutdownA';
function InitiateShutdownW; external advapi32 name 'InitiateShutdownW';

function WindowsShutDown(Computer: PChar; Msg: PChar; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
  rl: Cardinal;
  hToken: Cardinal;
  tkp: TOKEN_PRIVILEGES;
  flags: DWORD;

begin
  Result:=False;
  if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    RaiseLastOSError
  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
        RaiseLastOSError
      else
      begin

        if Win32MajorVersion >= 6 then
        begin
          //Flags
          if Reboot then
            flags := SHUTDOWN_FORCE_SELF or SHUTDOWN_GRACE_OVERRIDE or SHUTDOWN_RESTART
          else
            flags := SHUTDOWN_FORCE_SELF or SHUTDOWN_GRACE_OVERRIDE or SHUTDOWN_INSTALL_UPDATES;

          //Befehl ausführen
          if InitiateShutdown(Computer, Msg, Time, flags, 0) = ERROR_SUCCESS then
            result := True
          else
            RaiseLastOSError;
        end
        else
        begin
          if InitiateSystemShutdown(Computer, Msg, Time, Force, Reboot) then
            result := True
          else
            RaiseLastOSError;
        end;{else}

      end;{else}
    end
    else
      RaiseLastOSError;
  end;{else}

end;

end.
Angehängte Dateien
Dateityp: zip WindowsShutdown.zip (258,1 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
boeseboese

Registriert seit: 23. Nov 2015
8 Beiträge
 
#13

AW: Windows beenden und dabei Updates installieren

  Alt 24. Nov 2015, 10:36
Hey,

vielen Dank für die Antwort.

Das Programm hat tatsächlich die Windows Mimik angeschmissen und beim Herunterfahren Updates installiert.

Damit ich das Programm aber nun in meiner Aufgabenplanung nutzen kann bräuchte ich eine direkte Ausführung des Befehls bei Aufruf der *.exe ohne Umweg über die GUI bzw. einen entsprechenden Schalter.

Wärst du nochmal so freundlich?

Gruß
boese²
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
603 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Windows beenden und dabei Updates installieren

  Alt 24. Nov 2015, 13:28
Das Forum soll ja eigentlich nur als eine Art Hilfestellung dienen und nicht das andere einem die Arbeit abnehmen.
Aus dem Beispiel Programm eine Konsolen Anwendung zu erstellen die beim Aufruf direkt den Befehl ausführt ist nur eine Sache von ein paar Minuten.

Aber ich will heute mal nicht so sein und habe so eine kleine Konsolen Anwendung erstellt, die sich mit den entsprechenden Parametern aufrufen lässt.

Über Folgenden Befehl fährt der Rechner herunter und sollte dabei die Updates installieren...
Zitat:
WinShutdown -s -f
Angehängte Dateien
Dateityp: zip WinShutdown2.zip (340,5 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
boeseboese

Registriert seit: 23. Nov 2015
8 Beiträge
 
#15

AW: Windows beenden und dabei Updates installieren

  Alt 24. Nov 2015, 14:27
Hi,

vielen Dank für die Bereitstellung.

Leider habe ich weder die Umgebung dafür den Code zu kompilieren noch das Know-How Anpassungen daran vorzunehmen.

Ich hatte halt nur das Glück beim Forschen nach einer Lösung über "InitiateShutdown" gestolpert zu sein und dann noch mehr Glück, dass hier jemand mit Programmier-Erfahrung in dem Bereich das gleiche Vorhaben hatte.

Nochmals vielen Dank für die Bereitstellung dieser Lösung.

Gruß
boese²
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
603 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Windows beenden und dabei Updates installieren

  Alt 27. Nov 2015, 11:27
So Version 1.0.1 mit optimiertem Code.
Angehängte Dateien
Dateityp: zip WinShutdown.zip (340,4 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
603 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Windows beenden und dabei Updates installieren

  Alt 2. Dez 2015, 12:52
Version 1.0.2 mit 'SeRemoteShutdownPrivilege' anstatt von 'SeShutdownPrivilege'
Angehängte Dateien
Dateityp: zip WinShutdown3.zip (340,4 KB, 20x aufgerufen)
  Mit Zitat antworten Zitat
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 03:22 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