Delphi-PRAXiS
Seite 1 von 7  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Windows XP beenden (https://www.delphipraxis.net/13733-windows-xp-beenden.html)

Snooze 25. Dez 2003 17:09


Windows XP beenden
 
Hallo, kann ich irgendwie über mein Programm Windows XP beenden, neu starten oder User abmelden?

habe zu allen dreien eine Befehlszeile gefunden, aber nur abmelden funzt


Beenden:

ExitWindowsEx(EWX_SHUTDOWN, 0)

Neu starten:

ExitWindowsEx(EWX_REBOOT, 0)

Abmelden:

ExitWindowsEx(EWX_LOGOFF, 0)


wie gesagt letzteres klappt einwandfrei, nur beenden und rebooten klappt nicht


Danke für Hilfe

MFG Snooze :dp:

Matze 25. Dez 2003 17:11

Re: Windows XP beenden
 
Einfach folgenden 2. beitrag lesen: ;)
http://www.delphipraxis.net/internal...ghlight=reboot

Snooze 25. Dez 2003 17:26

Re: Windows XP beenden
 
Zitat:

Zitat von Matze
Einfach folgenden 2. beitrag lesen: ;)
http://www.delphipraxis.net/internal...ghlight=reboot


hm hab mit ähnlichem gerechnet... :(

aber jetzt kommt die peinliche Frage:

wo muss ich das einfügen, dass

a) Delphi mich nicht mit Error-Meldungen überschüttet :-D

b) es auch funzt


danke für hilfe

Snooze

Matze 25. Dez 2003 17:33

Re: Windows XP beenden
 
Ungetestet!!

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
    function ExitWin(flag:word): Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.ExitWin(flag:word): Boolean;
var vi     : TOSVersionInfo;
    hToken : THandle;
    tp     : TTokenPrivileges;
    h      : DWord;

begin
  //result := false;
  vi.dwOSVersionInfoSize:=SizeOf(vi);
  GetVersionEx(vi);
  if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then // Windows NT
  begin
    // Achtung bei Delphi 2 muß @hToken stehen ... !!!! ????? 
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hToken);
    LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
    tp.PrivilegeCount := 1;
    tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    h := 0;
    AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^,h);
    CloseHandle(hToken);
    result := ExitWindowsEx(flag,0);
  end
  else // Windows 95 
  begin
    Result := ExitWindowsEx(flag,0);
  end;
end;

//Abmelden:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ExitWin(EWX_LOGOFF);
end;

//Neustart:
procedure TForm1.Button2Click(Sender: TObject);
begin
  ExitWin(EWX_REBOOT);
end;

//Shutdown:
procedure TForm1.Button3Click(Sender: TObject);
begin
  ExitWin(EWX_SHUTDOWN);
end;

end.

phlux 25. Dez 2003 18:23

Re: Windows XP beenden
 
Irgendwie fehlt euch noch EWX_FORCE oda net?

MathiasSimmack 25. Dez 2003 18:33

Re: Windows XP beenden
 
Im Normalfall wohl
Zitat:

Zitat von phlux
oda net?

denn EWX_FORCE bedeutet doch "nur":
Zitat:

Zitat von PSDK
Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.

Windows XP: If the computer is locked and this flag is not specified, the shutdown process will fail.

btw: Für mich bietet sich hier
Delphi-Quellcode:
  if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then // Windows NT
  begin
    { ... }

    result := ExitWindowsEx(flag,0);
  end
  else // Windows 95
  begin
    Result := ExitWindowsEx(flag,0);
  end;
eigentlich eine Optimierungsmöglichkeit. ExitWindowsEx wird in jedem Fall aufgerufen, egal ob unter 9x oder NT. Warum also nicht den doppelten Befehl durch einen ersetzen, der vor dem Ende der Funktion aufgerufen wird?

phlux 25. Dez 2003 18:40

Re: Windows XP beenden
 
Zitat:

Zitat von MathiasSimmack
Im Normalfall wohl
Zitat:

Zitat von phlux
oda net?

denn EWX_FORCE bedeutet doch "nur":
Zitat:

Zitat von PSDK
Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.

Windows XP: If the computer is locked and this flag is not specified, the shutdown process will fail.


Notfall? Immer :mrgreen: kp wenn ich mein Shutdowntool nutze ists nen Notfall wenn ich das per Fernbedienung starte lieg ich meistens um 3 Uhr im Bett zu müde aufzustehn und lass den Rechner sich dann runterfahren ;)

Matze 25. Dez 2003 18:48

Re: Windows XP beenden
 
Hab ich was Falsches gepostet? :gruebel:

MathiasSimmack 25. Dez 2003 18:54

Re: Windows XP beenden
 
Nein, @Matze. Ich wollt´ halt nur meinen (Optimierungs-)Senf zu der von dir geposteten Routine aus der Code-Lib dazugeben. Meine private, die ich nutze, sieht nämlich so aus:
Delphi-Quellcode:
procedure CallLogOffSequence(ExitCode: dword);
var
  os   : TOSVersionInfo;
  Token : THandle;
  tkp  : TTokenPrivileges;
begin
  os.dwOSVersionInfoSize := sizeof(os);
  GetVersionEx(os);

  if(os.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin
    if(OpenProcessToken(GetCurrentProcess,
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token)) then
    try
      if(not LookupPrivilegeValue(nil,'SeShutdownPrivilege',
        tkp.Privileges[0].Luid)) then exit;

      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

      AdjustTokenPrivileges(Token,false,tkp,
        0,PTokenPrivileges(Nil)^,PDWord(Nil)^);

      if(GetLastError <> ERROR_SUCCESS) then exit;
    finally
      CloseHandle(Token);
    end;
  end;

  ExitWindowsEx(ExitCode,0);
end;
Wie du siehst, rufe ich "ExitWindowsEx" nur einmal auf.

Matze 25. Dez 2003 18:59

Re: Windows XP beenden
 
Cool! :thumb:

Merkt man das im späteren Programm? Kann ich mir ja nicht vorstellen... ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr.
Seite 1 von 7  1 23     Letzte »    

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