Delphi-PRAXiS
Seite 2 von 2     12   

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)

malo 24. Okt 2004 18:07

Re: Windows XP beenden
 
Auch das hab ich schon eingebaut... ich bin grad völlig verzweifelt! Anscheinend mach ich alles richtig, nur es geht nicht :(

Wobei das herunterfahren sogar klappt, mit WinExec ;)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  winexec('shutdown.exe -s', 1);
end;
Nur wollte ich ja verhindern, dass dieser "in 30 sekunden wird der rechner heruntergefahren"-dialog kommt, und der Rechner außerdem sofort herunterfährt, ohne auf nichtgespeicherte Daten rücksicht zu nehmen...

mirage228 24. Okt 2004 18:31

Re: Windows XP beenden
 
Zitat:

Zitat von malo
Auch das hab ich schon eingebaut... ich bin grad völlig verzweifelt! Anscheinend mach ich alles richtig, nur es geht nicht :(

Wobei das herunterfahren sogar klappt, mit WinExec ;)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  winexec('shutdown.exe -s', 1);
end;
Nur wollte ich ja verhindern, dass dieser "in 30 sekunden wird der rechner heruntergefahren"-dialog kommt, und der Rechner außerdem sofort herunterfährt, ohne auf nichtgespeicherte Daten rücksicht zu nehmen...

Hi,

wenn Du als Admin angemeldet bist bzw. die erforderlichen besitzt, dann MUSS diese Funktion funktionieren:
Delphi-Quellcode:
// uses Windows

function 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;
Probiers mal aus :)

mfG
mirage228

Edit: WinExec wird von Microsoft als "obsolete" bezeichnet, da es nur der Kompatibilität zu Win16 Anwendungen dient. Es soll nicht mehr verwendet werden. Verwende MSDN-Library durchsuchenShellExecute oder MSDN-Library durchsuchenCreateProcess

malo 24. Okt 2004 19:41

Re: Windows XP beenden
 
1. Frag mich nicht, warum die Funktion nicht geht, aber es ist halt so. Ich wundere mich da auch schon. Es geht einfach nicht :(

2. Dass WinExec nicht mehr genutzt werden soll, weiß ich, aber das war bisher die einzige Möglichkeit, die ich gefunden hab. Und um das in ShellExecute umzuschreiben, bin ich jetzt zu faul, grundsätzlich weiß ich es jedoch und werd es auch so gut wie immer mit ShellExecute machen ;)

phlux 25. Okt 2004 17:03

Re: Windows XP beenden
 
Zitat:

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

das war das was ich ihn schon vor nen paar psts vorher gefragt hab :roll:

masters001 19. Nov 2004 12:49

Re: Windows XP beenden
 
Hallo

Hab den Code (mirage228/ 24.10.2004, 18:31 )bei mir im prog eingefügt und es funktioniert wunderbar.
das Problem ist jetzt nur noch das der PC sich nicht ausschaltet sondern da steht "Sie können den PC jetzt ausschalten."

Gruß
masters001

fkerber 20. Nov 2004 13:02

Re: Windows XP beenden
 
Hi!

Und beim normalen Runterfahren ist das nicht so?


Ciao Frederic

masters001 21. Nov 2004 22:12

Re: Windows XP beenden
 
Hi fkerber


Nein beim normalen runterfahren

start - Ausschalten - Ausschalten

schaltet sich der pc automatisch aus!

Mystic 22. Nov 2004 05:18

Re: Windows XP beenden
 
Versuch mal EWX_POWEROFF anstatt EWX_SHUTDOWN.

Die PSDK sagt zu EWX_SHUTDOWN:
Specifying this flag will not turn off the power even if the system supports the power-off feature. You must specify EWX_POWEROFF to do this.

emsländer 28. Jan 2005 09:38

Re: Windows XP beenden
 
Welche von diesen Funktionen kann ich denn nutzen, um einen Server im Notfall zu rebooten?

Hintergrund: Wir haben einen Windows 2003 Server mit dem ISA 2004 drauf, der sich nach der Zwangstrennung irgendwie verläuft. Die AutoDialUp klappt nicht immer wie sie soll und der Server hängt (sogar von intern kommt man nicht mehr an die Mühle dran).

Als vorläufigen Workaround hatte ich angedacht einen Dienst zu schreiben, der (per Timer) alle 60 sek nachschaut, ob die INET-Verbindung steht. Wenn nicht, nach 10 Minuten den Kasten brutal rebooten.



Gruss

EL

emsländer 28. Jan 2005 09:45

Re: Windows XP beenden
 
In der Codelib fand ich folgende Funktion:

Delphi-Quellcode:
function 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;
Nun meine Frage: Wo baue ich da das Flag: EWX_FORCE ein?


Gruss

EL

Luckie 28. Jan 2005 09:46

Re: Windows XP beenden
 
Delphi-Quellcode:
ExitWin(EWX_REBOOT or EWX_FORCE);

emsländer 28. Jan 2005 09:50

Re: Windows XP beenden
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
ExitWin(EWX_REBOOT or EWX_FORCE);

Hallo Michael,

:wall: da soll mal einer drauf kommen, das man anstelle von EWX_REBOOT dann EWX_FORCE reinschreiben soll ....

Klappt diese Funktion auch als Dienst?

Gruss

Jörg

Luckie 28. Jan 2005 10:36

Re: Windows XP beenden
 
Sollte eigentlich. Probier es aus.

emsländer 28. Jan 2005 15:12

Re: Windows XP beenden
 
Zitat:

Zitat von Luckie
Sollte eigentlich. Probier es aus.

Hallo Michael,

leider ist es das nicht:

ExitWin(EWX_FORCE); - macht gar nix --
ExitWin(EWX_REBOOT); - rebootet -- // Ohne Force

muss man vielleicht in der Routine: ExitWin(flag:word)

an der Stelle:

result := ExitWindowsEx(flag,0); - anstelle der "0" das EWX_REBOOT rein?



Gruss

EL

Luckie 28. Jan 2005 16:22

Re: Windows XP beenden
 
Logisch das EWX_FORCE nicts macht, es ist ja ein zusätzliches Flag, deswegen habe ich es ja auch mit or mit einem Flag verknüpft, dass was "mcht". Siehe mein Beispiel.

Link ins MSDN: MSDN-Library durchsuchenExitWindowsEx.

emsländer 28. Jan 2005 16:50

Re: Windows XP beenden
 
Zitat:

Zitat von Luckie
Logisch das EWX_FORCE nicts macht, es ist ja ein zusätzliches Flag, deswegen habe ich es ja auch mit or mit einem Flag verknüpft, dass was "mcht". Siehe mein Beispiel.

Link ins MSDN: MSDN-Library durchsuchenExitWindowsEx.

Ich hab in die Routine das EWX_FORCE als zweites Flag mit reingebastelt. Und siehe da... es funzt.

Falls jemand einen Dienst benötigt, der einen Einwahlserver überwacht und notfalls selbstständig bootet, stelle ich dieses Teil gern für die Codelib zur Verfügung. (ist übrigens in D2005)


Danke nochmal

Gruss

EL

Luckie 28. Jan 2005 16:57

Re: Windows XP beenden
 
Zitat:

Zitat von emsländer
Ich hab in die Routine das EWX_FORCE als zweites Flag mit reingebastelt. Und siehe da... es funzt.

Was verstehst du unter "reingebastelt"? Meine Version mit der or Verknüpfung sollte es tun.

emsländer 28. Jan 2005 17:01

Re: Windows XP beenden
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von emsländer
Ich hab in die Routine das EWX_FORCE als zweites Flag mit reingebastelt. Und siehe da... es funzt.

Was verstehst du unter "reingebastelt"? Meine Version mit der or Verknüpfung sollte es tun.


ich habe in die Funktion:

function ExitWin(flag:word): Boolean;

den Aufruf:

result := ExitWindowsEx(flag,0);

verändert:

result := ExitWindowsEx(flag,EWX_FORCE);


Gruss

EL

Luckie 28. Jan 2005 17:07

Re: Windows XP beenden
 
Das kann nicht sein:
Zitat:

Code:
BOOL ExitWindowsEx(
  UINT uFlags,
  DWORD dwReason
);

Zitat:

dwReason
[in] Reason for initiating the shutdown. This parameter must be one of the system shutdown reason codes.
If this parameter is zero, the SHTDN_REASON_FLAG_PLANNED reason code will not be set and therefore the default action is an undefined shutdown that is logged as "No title for this reason could be found". By default, it is also an unplanned shutdown. Depending on how the system is configured, an unplanned shutdown triggers the creation of a file that contains the system state information, which can delay shutdown. Therefore, do not use zero for this parameter.

Windows 2000, Windows NT, and Windows Me/98/95: This parameter is ignored.
Und
Zitat:

uFlags
[in] Shutdown type. This parameter must include one of the following values.
[Tabelle]
This parameter can optionally include the following values.
Ergo muss es so heißen:
Delphi-Quellcode:
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE);

emsländer 28. Jan 2005 17:23

Re: Windows XP beenden
 
Zitat:

Zitat von Luckie
Das kann nicht sein:
Zitat:

Code:
BOOL ExitWindowsEx(
  UINT uFlags,
  DWORD dwReason
);

Zitat:

dwReason
[in] Reason for initiating the shutdown. This parameter must be one of the system shutdown reason codes.
If this parameter is zero, the SHTDN_REASON_FLAG_PLANNED reason code will not be set and therefore the default action is an undefined shutdown that is logged as "No title for this reason could be found". By default, it is also an unplanned shutdown. Depending on how the system is configured, an unplanned shutdown triggers the creation of a file that contains the system state information, which can delay shutdown. Therefore, do not use zero for this parameter.

Windows 2000, Windows NT, and Windows Me/98/95: This parameter is ignored.
Und
Zitat:

uFlags
[in] Shutdown type. This parameter must include one of the following values.
[Tabelle]
This parameter can optionally include the following values.
Ergo muss es so heißen:
Delphi-Quellcode:
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE);

Dann ist es vielleicht irgendein Zufall - aber es klappt!

Gruss

EL

Luckie 28. Jan 2005 17:33

Re: Windows XP beenden
 
Zitat:

Zitat von emsländer
Dann ist es vielleicht irgendein Zufall

Sehr wahrscheinlich.

Zitat:

- aber es klappt!
Bei dir vielleicht und mit deiner Konfiguration. Wo naders und mit einer anderen Konfiguration eventuell nicht mehr. Sicher sein kannst du dir jedenfalls nicht.

Tyrael Y. 8. Mär 2005 09:50

Re: Windows XP beenden
 
Hallo zusammen,

ich habe die Codes zum runtefahren auch getestet und nur in einem Fall
fährt de Rechner wirklich runter..

..und zwar, wenn ich in einem Testprogramm nur ein OnButtonClick Ereignis habe

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  winexec('shutdown.exe -s', 1);
end;
dies funktioniert...


..aber wenn ich dies im Programmzusammenhang benutze

Delphi-Quellcode:
procedure DoIt();
...
begin
  if Success then
  begin
    DoSomething();
    Sleep(3000);
    Winexec('shutdown.exe -s', 1)
  end
  else
  begin
   ...
  end;
end;
funtioniert es nicht..

DoSomething schreibt nur in eine Textdatei einen Wert rein,
so daß ich sehe, daß es aufgerufen wurde.

..bissel komisch find ich das Verhalten schon..

..werde es mal weitertesten..


Gruß Tyrael

scp 8. Mär 2005 15:57

Re: Windows XP beenden
 
Hallo Tyrael,
blätter am besten nochmal zurück und probier die anderen Möglichkeiten mit ExitWindowsEx bzw. ExitWin, die Methode per WinExec ist nicht so sinnvoll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr.
Seite 2 von 2     12   

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