Delphi-PRAXiS
Seite 1 von 2  1 2      

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... ;)

MathiasSimmack 25. Dez 2003 20:22

Re: Windows XP beenden
 
Merken wird man´s nicht, allerdings ziehe ich "meinen" Weg (fairerweise muss ich sagen, dass ich ihn von einem anderen quasi abgeschrieben habe) vor.

Snooze 26. Dez 2003 07:54

Re: Windows XP beenden
 
hm hab das nun eingebaut, nur schreibt er mir hier:

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


folgende Error-Meldung:

Function needs result type



danke

Snooze

MathiasSimmack 26. Dez 2003 08:11

Re: Windows XP beenden
 
Bist du sicher, dass du das
Delphi-Quellcode:
: boolean;
angegeben hast? Der Fehler erscheint bei mir nämlich nur, wenn ich folgendes versuche:
Delphi-Quellcode:
function Irgendwas;
Du siehst (evtl.), dass das Rückgabeergebnis der Funktion fehlt.

Noch besser wär´s allerdings, wenn du die Funktion nicht von der Form abhängig machst:
Code:
[b]function[/b] [color=red][s]TForm1.[/s][/color]ExitWin(flag:word): Boolean;
Damit lässt sie sich bspw. in eine separate Unit auslagern und auch für andere Projekte verwenden. Darum verzichtet meine Prozedur ja auch auf die Angabe von irgendwelchen Forms, weil sie streng genommen ohnehin aus einem nonVCL-Projekt stammt.

Snooze 26. Dez 2003 08:19

Re: Windows XP beenden
 
ah toll jetzt funzt es :-D

zwar war die Lösung nicht die Entfernung von Tform1, sondern ich habe nicht beachtet, dass bei mir diese Form TForm3 heißt.

lasse ich das ganz weg, dann bekomme ich ne neue Error-Meldung.

Aber danke an alle, die mir bei diesem Prob so geholfen haben :dp:

malo 20. Okt 2004 15:36

Re: Windows XP beenden
 
Also, ich hab da meine Probleme mit. Hab auch WinXP und bei mir fährt und fährt der einfach nicht runter, obwohl ich alles eingebaut hab... Da kommt auch keine Fehlermeldung, gar nix.

Hier mal etwas von meinem Quelli:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //time = integer-variable. Im OnCreate des Forms auf 1 gesetzt.
  time := time + 1;
  if time = 12 then ExitWindowsEx(EWX_SHUTDOWN, 0);
  if time = 2 then Label2.Caption := '9';
  if time = 3 then Label2.Caption := '8';
  if time = 4 then Label2.Caption := '7';
  if time = 5 then Label2.Caption := '6';
  if time = 6 then Label2.Caption := '5';
  if time = 7 then Label2.Caption := '4';
  if time = 8 then Label2.Caption := '3';
  if time = 9 then Label2.Caption := '2';
  if time = 10 then label2.Caption := '1';
  if time = 11 then label2.Caption := '0';
end;
Wie man hier erkennen kann, soll es eine Art "Stoppuhr" werden, die nach ein paar Sekunden den Rechner hinunterfährt. Ich hab auch den ganzen "function Exitwin" kram drinne und alles. Ich kann nun das Programm starten, der Countdown wird wunderbar angezählt und wenn er bei 0 angekommen ist, passiert nichts :(

phlux 21. Okt 2004 17:10

Re: Windows XP beenden
 
1. Schonmal was von Case of gehört?
2. Hast du dir die Privilegien gesichert??

mfg phlux

jfheins 21. Okt 2004 17:24

Re: Windows XP beenden
 
[OT="Sorry, aber ich konnte nicht anders ..."]
Zitat:

Zitat von malo
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //time = integer-variable. Im OnCreate des Forms auf 1 gesetzt.
  time := time + 1;
  if time = 12 then ExitWindowsEx(EWX_SHUTDOWN, 0);
  if time = 2 then Label2.Caption := '9';
  if time = 3 then Label2.Caption := '8';
  if time = 4 then Label2.Caption := '7';
  if time = 5 then Label2.Caption := '6';
  if time = 6 then Label2.Caption := '5';
  if time = 7 then Label2.Caption := '4';
  if time = 8 then Label2.Caption := '3';
  if time = 9 then Label2.Caption := '2';
  if time = 10 then label2.Caption := '1';
  if time = 11 then label2.Caption := '0';
end;

Da läuft es einem kalt dem Rücken 'runter ... *schauder*
(was ist, wenn du z.B. einen Countdown von ein einer Minute machen möchtest statt 10 sek. ?)

Ich schlage vor, den obigen Quellcode mit folgendem zu ersetzten:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  dec (time);
  Label1.Caption := time;
  if (Time = 0) then
  begin
    Timer1.Enabled := false;
    WasMachen;
  end;
end;
[/OT]

malo 21. Okt 2004 21:13

Re: Windows XP beenden
 
@jfheins: hab ich auch schon überlegt, nur ist time eine integer-variable und damit kann ich dann nichtmehr so gut aufrechnen :roll:
und um 'ne zweite Variable, die vllt. vom typ string ist, zu erstellen, bin ich zu faul. Leiber das ganze 10 mal kopieren und die Wert ändern... fertig :mrgreen: :roll:

@phlux: Da fällt mir nur der smiley hier zu ein: :wiejetzt:

jfheins 22. Okt 2004 08:16

Re: Windows XP beenden
 
[NST] (NST = New SubTopic :mrgreen: )
Ich weis zwar nicht, was du meinst, aber das muss natürlich so sein:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  dec (Time);
  Label1.Caption := IntToStr (Time);
  if (Time = 0) then
  begin
    Timer1.Enabled := FALSE;
    WasMachen;
  end;
end;
Time ist eine globale Integervariable ...
Man beachte das IntToStr () ...
[/NST]

Luckie 22. Okt 2004 08:20

Re: Windows XP beenden
 
Das gehört wohl kaum noch zur ursprünglichen Frage. Ich würde darum bitten einen neuen Thread anzufangen. Wer ein Problem mit dem Timer hat, wird wohl kaum diesen Thread öffnen. ;)

malo 22. Okt 2004 11:50

Re: Windows XP beenden
 
Zitat:

Zitat von Luckie
Das gehört wohl kaum noch zur ursprünglichen Frage. Ich würde darum bitten einen neuen Thread anzufangen. Wer ein Problem mit dem Timer hat, wird wohl kaum diesen Thread öffnen. ;)

nene, meine Anfrage stand auf der ersten seite^^

Und zwar hab ich den code so eingegeben und alles, aber irgendwie fährt mein WinXP nicht runter. Wenn ich als Befehl "ExitWindowsEx (EWX_SHUTDOWN)" eingebe, macht der gar nichts. Obwohl ich die Function da kopiert hab und alles... nix...

Da das ja auch die ursprüngliche Frage des Topics war, und ich mit genau dieser Sache Probleme hab, hab ich's einfach mal in den Topic hier geschrieben, ich hoffe, das war richtig so ;)

@jfheins: öhm, ja, auch 'ne gute Idee, werd ich mir mal merken :mrgreen:

malo 23. Okt 2004 21:34

Re: Windows XP beenden
 
Ich hab heute 'nen Tipp gekriegt, wie man das mit WinExec macht.

Delphi-Quellcode:
Winexec('Shutdown.exe -s', 1
Das war der Code, wenn ich mich richtig erinnere Oo (bin zu faul, ihn rauszusuchen)

Nur wird da immer nachgefragt, ob die sachen gespeichert werden sollen etc. Und am Anfang kommt bei mir so ein Textfenster von Windows, wo steht, dass Windows in 20sekunden runtergefahren wird... wie kann ich das umgehen, also, dass der Rechner direkt heruntergefahren wird, ohne auf diese Sachen rücksicht zu nehmen? Meinetwegen auch mit WinExec(was man ja vermeiden sollte, aber hier hab ich halt keine andere Möglichkeit gefunden)?

jfheins 23. Okt 2004 21:58

Re: Windows XP beenden
 
Code:
shutdown -s -f -t 3600
Zeigt ein Fenster an, dass der PC in einer Stunde heruntergefahren wird , und zieht das dann gnadenlos durch. (das herunterfahren)

malo 24. Okt 2004 09:21

Re: Windows XP beenden
 
Zitat:

Zitat von jfheins
Code:
shutdown -s -f -t 3600
Zeigt ein Fenster an, dass der PC in einer Stunde heruntergefahren wird , und zieht das dann gnadenlos durch. (das herunterfahren)

Ähm... nunja, ich will meinen Rechner danna ber SOFORT herunterfahren, ohne, dass windows wegen nichtgespeicherten sachen nachfragt etc. Gibt's dafür 'ne Möglichkeit?

jfheins 24. Okt 2004 09:33

Re: Windows XP beenden
 
Code:
-t
Könnte für "time" stehen ...

fkerber 24. Okt 2004 09:36

Re: Windows XP beenden
 
Hi!

Zitat:

Zitat von jfheins
Code:
shutdown -s -f -t 3600
Zeigt ein Fenster an, dass der PC in einer Stunde heruntergefahren wird , und zieht das dann gnadenlos durch. (das herunterfahren)

Naja so gnadenlos auch wieder nicht. Wenn man
Delphi-Quellcode:
shutdown -a
im Ausführen-Dialog angibt, hat sich die Sache erledigt.


Ciao Frederic

jfheins 24. Okt 2004 09:49

Re: Windows XP beenden
 
Aber es fragt nicht nach, "möchten sie das programm wirklich beenden, oder nur so tun ?"

Auserdem:
Zitat:

und zieht das dann gnadenlos durch. (das herunterfahren)

MathiasSimmack 24. Okt 2004 11:15

Re: Windows XP beenden
 
Ja, aber was soll daran gnadenlos sein? Wenn du eine Stunde als Limit angibst, dann habe ich genug Zeit, den schon o.g. Befehl "shutdown -a" zu benutzen und das angeblich gnadenlose Herunterfahren zu beenden.
Abgesehen davon gibt´s "shutdown" auch nur auf der NT-Schiene. Wer jetzt ein Joke-Programm schreiben und die Win9x/ME-Rechner seiner Freunde herunterfahren möchte, der erntet vermutlich bloß ein müdes Lächeln.


Zitat:

Zitat von malo
Ähm... nunja, ich will meinen Rechner danna ber SOFORT herunterfahren, ohne, dass windows wegen nichtgespeicherten sachen nachfragt etc. Gibt's dafür 'ne Möglichkeit?

Aber warum? Das Nachfragen dient doch der Sicherheit. Wenn der Rechner schon herunterfährt, dann soll man auch die Möglichkeit haben, seine offenen Dateien zu speichern, usw. Für alles andere hätte ich kein Verständnis.

Luckie 24. Okt 2004 11:40

Re: Windows XP beenden
 
[quote="MathiasSimmack"]Wer jetzt ein Joke-Programm schreiben und die Win9x/ME-Rechner seiner Freunde herunterfahren möchte, der erntet vermutlich bloß ein müdes Lächeln.
Und auf Windows 2000 auch. Und wenn der angemeldete Benutzer kein Admin ist übrigens auch.

mirage228 24. Okt 2004 11:47

Re: Windows XP beenden
 
Zitat:

Zitat von malo
Ähm... nunja, ich will meinen Rechner danna ber SOFORT herunterfahren, ohne, dass windows wegen nichtgespeicherten sachen nachfragt etc. Gibt's dafür 'ne Möglichkeit?

Also,

es gibt für MSDN-Library durchsuchenExitWindowsEx noch den "brachial Parameter" EWX_FORCE. Damit werden alle offenen Prozesse ohne Rückfrage beendet.

Verwendung z.B.
Delphi-Quellcode:
EWX_REBOOT or EWX_FORCE
Ich sehe jedoch keinen Verwendungszweck dafür bei End-User-Programmen.

mfG
mirage228

scp 24. Okt 2004 12:00

Re: Windows XP beenden
 
Zitat:

Zitat von malo
Ich hab heute 'nen Tipp gekriegt, wie man das mit WinExec macht.

Delphi-Quellcode:
Winexec('Shutdown.exe -s', 1

Das geht aber auch ohne WinExec():
Delphi-Quellcode:
uses
  Windows;

//...

begin
  InitiateSystemShutdown(nil, nil, 120, false, true);
end;
Und:
Delphi-Quellcode:
  AbortSystemShutdown(nil);

fkerber 24. Okt 2004 12:06

Re: Windows XP beenden
 
Hi!

@scp:
Hat der User da noch eine Chance z.B. Daten zu sichern oder ist gleich alles weg?

Ciao Frederic

scp 24. Okt 2004 12:15

Re: Windows XP beenden
 
Diese Funktion ist nur für NT ff. Sie verhält sich, wie bei diesen tollen RPC-Viren Blaster und Co: Ein Fenster erscheint, das der PC innerhalb von x Sekunden heruntergefahren wird, hat man bis dahin nichts gesichert, gehts verloren.
Stoppen kann man dies nur mit shutdown -a bzw. AbortSystemShutdown(nil);

fkerber 24. Okt 2004 12:16

Re: Windows XP beenden
 
Hi!

Achso, dann kan man es wohl auch mit shutdown -a abbrechen?

Ciao Frederic

malo 24. Okt 2004 13:09

Re: Windows XP beenden
 
@scp: Mit deinen beiden Codes geht's wieder mal nicht... kA wieso, aber mein WinXP reagiert darauf nicht :(

@mirage228: Das hab ich jetzt noch nicht ausprobiert, aber ich denke, das geht dann auch wieder nicht, da mein Rechner auch auf ExitWindowsEx(EWX_SHUTDOWN) nicht reagiert, genausowenig wie beim reboot :(

@Mathias: Ich will kein Joke-Programm o.Ä. schreiben. Ich will lediglich meinen Rechner "auf Knopfdruck" herunterfahren, bzw. auch mithilfe eines Timers... und da soll das herunterfahren nicht gestört werden durch Nachfragen wie "Soll die Datei gespeichert werden?". Ich hab nämlich die Erfahrung gemacht, dass man, wenn man dann auf "Abbrechen" klickt, der Rechner nicht mehr herunterfährt :roll: Deshalb soll Windows wirklich gnadenlos herunterfahren, ohne auf solche Sachen rücksicht zu nehmen ;)

MathiasSimmack 24. Okt 2004 14:32

Re: Windows XP beenden
 
Zitat:

Zitat von malo
@scp: Mit deinen beiden Codes geht's wieder mal nicht... kA wieso, aber mein WinXP reagiert darauf nicht :(

Hast du die Rechte unter Windows NT/2000/XP bedacht? Du wärst nicht der Erste, der das ignoriert und tausend Mal nachfragt, warum sein Windows nicht runterfährt, obwohl das Rechte-Thema IMHO sogar auf der ersten Seite dieses Threads erwähnt wurde.

malo 24. Okt 2004 15:10

Re: Windows XP beenden
 
Zitat:

Zitat von MathiasSimmack
Zitat:

Zitat von malo
@scp: Mit deinen beiden Codes geht's wieder mal nicht... kA wieso, aber mein WinXP reagiert darauf nicht :(

Hast du die Rechte unter Windows NT/2000/XP bedacht? Du wärst nicht der Erste, der das ignoriert und tausend Mal nachfragt, warum sein Windows nicht runterfährt, obwohl das Rechte-Thema IMHO sogar auf der ersten Seite dieses Threads erwähnt wurde.

Ich hab Administrator-Rechte, wenn du das meinst... trotzdem geht es nicht :(

Luckie 24. Okt 2004 15:32

Re: Windows XP beenden
 
Ach wenn du Admin bist, muss du dir die Rechte zum Runterfahren erst aktivieren.

malo 24. Okt 2004 17:55

Re: Windows XP beenden
 
Zitat:

Zitat von Luckie
Ach wenn du Admin bist, muss du dir die Rechte zum Runterfahren erst aktivieren.

Hm? Und wie mach ich das? O_o

fkerber 24. Okt 2004 17:57

Re: Windows XP beenden
 
Hi!

Wie bereits im 2. (!) Beitrag gepostet:
http://www.delphipraxis.net/internal...ghlight=reboot

Ciao Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 Uhr.
Seite 1 von 2  1 2      

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