![]() |
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: |
Re: Windows XP beenden
|
Re: Windows XP beenden
Zitat:
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 |
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. |
Re: Windows XP beenden
Irgendwie fehlt euch noch EWX_FORCE oda net?
|
Re: Windows XP beenden
Im Normalfall wohl
Zitat:
Zitat:
Delphi-Quellcode:
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?
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; |
Re: Windows XP beenden
Zitat:
|
Re: Windows XP beenden
Hab ich was Falsches gepostet? :gruebel:
|
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:
Wie du siehst, rufe ich "ExitWindowsEx" nur einmal auf.
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; |
Re: Windows XP beenden
Cool! :thumb:
Merkt man das im späteren Programm? Kann ich mir ja nicht vorstellen... ;) |
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.
|
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 |
Re: Windows XP beenden
Bist du sicher, dass du das
Delphi-Quellcode:
angegeben hast? Der Fehler erscheint bei mir nämlich nur, wenn ich folgendes versuche:
: boolean;
Delphi-Quellcode:
Du siehst (evtl.), dass das Rückgabeergebnis der Funktion fehlt.
function Irgendwas;
Noch besser wär´s allerdings, wenn du die Funktion nicht von der Form abhängig machst:
Code:
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.
[b]function[/b] [color=red][s]TForm1.[/s][/color]ExitWin(flag:word): Boolean;
|
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: |
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:
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 :(
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; |
Re: Windows XP beenden
1. Schonmal was von Case of gehört?
2. Hast du dir die Privilegien gesichert?? mfg phlux |
Re: Windows XP beenden
[OT="Sorry, aber ich konnte nicht anders ..."]
Zitat:
(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:
[/OT]
procedure TForm1.Timer1Timer(Sender: TObject);
begin dec (time); Label1.Caption := time; if (Time = 0) then begin Timer1.Enabled := false; WasMachen; end; end; |
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: |
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:
Time ist eine globale Integervariable ...
procedure TForm1.Timer1Timer(Sender: TObject);
begin dec (Time); Label1.Caption := IntToStr (Time); if (Time = 0) then begin Timer1.Enabled := FALSE; WasMachen; end; end; Man beachte das IntToStr () ... [/NST] |
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. ;)
|
Re: Windows XP beenden
Zitat:
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: |
Re: Windows XP beenden
Ich hab heute 'nen Tipp gekriegt, wie man das mit WinExec macht.
Delphi-Quellcode:
Das war der Code, wenn ich mich richtig erinnere Oo (bin zu faul, ihn rauszusuchen)
Winexec('Shutdown.exe -s', 1
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)? |
Re: Windows XP beenden
Code:
Zeigt ein Fenster an, dass der PC in einer Stunde heruntergefahren wird , und zieht das dann gnadenlos durch. (das herunterfahren)
shutdown -s -f -t 3600
|
Re: Windows XP beenden
Zitat:
|
Re: Windows XP beenden
Code:
Könnte für "time" stehen ...
-t
|
Re: Windows XP beenden
Hi!
Zitat:
Delphi-Quellcode:
im Ausführen-Dialog angibt, hat sich die Sache erledigt.
shutdown -a
Ciao Frederic |
Re: Windows XP beenden
Aber es fragt nicht nach, "möchten sie das programm wirklich beenden, oder nur so tun ?"
Auserdem: Zitat:
|
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:
|
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. |
Re: Windows XP beenden
Zitat:
es gibt für ![]() Verwendung z.B.
Delphi-Quellcode:
Ich sehe jedoch keinen Verwendungszweck dafür bei End-User-Programmen.
EWX_REBOOT or EWX_FORCE
mfG mirage228 |
Re: Windows XP beenden
Zitat:
Delphi-Quellcode:
Und:
uses
Windows; //... begin InitiateSystemShutdown(nil, nil, 120, false, true); end;
Delphi-Quellcode:
AbortSystemShutdown(nil);
|
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 |
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); |
Re: Windows XP beenden
Hi!
Achso, dann kan man es wohl auch mit shutdown -a abbrechen? Ciao Frederic |
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 ;) |
Re: Windows XP beenden
Zitat:
|
Re: Windows XP beenden
Zitat:
|
Re: Windows XP beenden
Ach wenn du Admin bist, muss du dir die Rechte zum Runterfahren erst aktivieren.
|
Re: Windows XP beenden
Zitat:
|
Re: Windows XP beenden
Hi!
Wie bereits im 2. (!) Beitrag gepostet: ![]() Ciao Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 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