Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Befehl zum Herunterfahren?


GR-Thunderstorm - Mo 05.06.06 16:15
Titel: Befehl zum Herunterfahren?
Hi!
Ich will mir einen kleinen Timer bauen, der meinen PC nach einer bestimmten Zeit ausschaltet. Gibt es einen Befehl, der Windows den PC herunterfahren lässt?


Marc. - Mo 05.06.06 16:24

Mit der Suche wärest du auf das hier [http://www.delphi-library.de/viewtopic.php?sid=41536f47e535c0065f4e85e6ecb7f4d5&t=8272&highlight=exitwindowsex] gestoßen ;)


GR-Thunderstorm - Mo 05.06.06 17:37

Da seh ich irgendwie nich durch... :?!?:

Soweit ich jetzt erkennen kann ist der finale Befehl.. ShutdownWindows := ExitWindowsEx (cFlagValue [aType], $FFFFFFFF);

Aber der Rest ist ein Rätsel für mich.. ^^


Fighter#1 - Mo 05.06.06 17:42

Das hier sollte reichen:

Delphi-Quelltext
1:
ExitWindowsEx (EWX_SHUTDOWN, $FFFFFFFF);                    


GR-Thunderstorm - Mo 05.06.06 17:52

Bei mir passiert leider nichts wenn ich diesen Befehl so einbaue.


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
ExitWindowsEx (EWX_SHUTDOWN, $FFFFFFFF);
end;


Delete - Di 06.06.06 04:44

user profile iconGR-Thunderstorm hat folgendes geschrieben:
Bei mir passiert leider nichts wenn ich diesen Befehl so einbaue.

Und du wüßtest auc warum, wenn du dir den verlinkten Beitrag mal genauer angesehen hättest:
Zitat:
Unter Windows NT muss zusätzlich mit der Win32 API Funktion AdjustTokenPrivileges noch das Privileg SE_SHUTDOWN_NAME gesetzt werden, ansonsten lässt sich ExitWindowsEx nicht erfolgreich ausführen.


Und wie man das macht in Verbindung mit dem Runterfahren wird dort ausführlich erklärt.


GR-Thunderstorm - Di 06.06.06 17:15

Ich hab Windows XP und nicht NT...


rizla - Di 06.06.06 17:18

oder schaust du hier:
http://www.delphi-forum.de/viewtopic.php?t=61034&highlight=
:wink:


GR-Thunderstorm - Di 06.06.06 17:33

Cool danke..
Jetzt zermürbt mich nur, dass ich nich weiß wie das funzt. Steht ja kein Quellcode da... :(


Born-to-Frag - Di 06.06.06 17:54


Delphi-Quelltext
1:
2:
3:
uses ShellAPI;
...
ShellExecute(0'open''shutdown.exe''-s -t 0'nil, SW_NORMAL);


GR-Thunderstorm - Di 06.06.06 18:05

Ach da is die Datei die Windows runterfahren lässt.. -.-

Nach der Shutdown.exe hab ich schon ewig gesucht (wusste nich ma dass die so heißt...) :)

Danke Leute! :)


Timosch - Mi 07.06.06 10:18

oh gott, nein! das ist die stilloseste Variante, die es gibt. das ist ungefähr so, als ob ein programm dateien mit hilfe von ShellExecute über den copy-befehl kopiert, anstatt CopyFile zu benutzen. Dieses Programm wird nur unter Windows XP oder Server2003 laufen, selbst unter 2000 nur mit den Support Tools oder Resource Kit (zumindest bei mir gibts shutdown.exe erst seit der Installation vom Reskit). Woanders gibts die shutdown.exe nämlich nicht.

Wo liegt beim oben geposteten link das problem?

einfach dashier in die unit kopieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
type
  TShutdownWindowsType = (swtShutdown, swtShutdownPowerOff, swtRestart, swtLogoff);
function ShutdownWindows (aType: TShutdownWindowsType): Boolean;

const
  cSE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
  cFlagValue: Array [TShutdownWindowsType] Of UINT = (
      EWX_SHUTDOWN, EWX_SHUTDOWN or EWX_POWEROFF, EWX_REBOOT, EWX_LOGOFF
    );

var
  OSVersionInfo: TOSVersionInfo;
  hToken: THandle;
  hProcess: THandle;
  TokenPriv: TTokenPrivileges;
  ReturnLength: DWORD;

begin
  Result := False;

  // Die Windowsversion holen
  OSVersionInfo.dwOSVersionInfoSize := SizeOf (OSVersionInfo);
  if not GetVersionEx (OSVersionInfo) then
    Exit;

  // Prüfen ob Windows NT
  if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
    begin
      hProcess := GetCurrentProcess;
      if not OpenProcessToken (hProcess, TOKEN_ADJUST_PRIVILEGES, hToken) then
        Exit;


      if not LookupPrivilegeValue (nil, cSE_SHUTDOWN_NAME, TokenPriv.Privileges[0].Luid) then
        Exit;

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

      if not AdjustTokenPrivileges (
          hToken, False, TokenPriv, 0,
          PTokenPrivileges (nil)^, ReturnLength
        )
      then
        Exit;

      CloseHandle (hToken);
    end;

  ShutdownWindows := ExitWindowsEx (cFlagValue [aType], $FFFFFFFF);
end;


Und dann nur noch ShutdownWindows(swtShutdown) aufrufen.



user profile iconGR-Thunderstorm hat folgendes geschrieben:
Ich hab Windows XP und nicht NT...

Windows 2000 ist Windows NT 5.0.
Windows XP ist Windows NT 5.1.
Windows Server 2003 ist Windows NT 5.2.
Windows Vista ist Windows NT 5.3.
Und Windows Codename Blackcomb wird vielleicht 6.0 sein.
Guckste hier: http://www.winhistory.de

Ach ja, und der gepostete Quelltext muss natürlich über der Prozedur stehen, von der er verwendet wird. Und uses muss windows beinhalten.


Delete - Mi 07.06.06 23:09

user profile iconGR-Thunderstorm hat folgendes geschrieben:
Ich hab Windows XP und nicht NT...

Das ist eiegntlich schon reif für eine Signatur. :mrgreen:


GR-Thunderstorm - Do 08.06.06 15:47

Es kann ja nich jeder alles wissen.. :roll:


Querkopf - Di 20.06.06 22:44

Hallo,

ich habe jetzt noch eine ergänzende Frage zum Thema herunterfahren. Hab mir schon die zig Threads dazu angeschaut, aber meine Problematik scheint nirgends aufgetreten zu sein.

Es geht darum, beim Default-User einen Bildschirmschoner einzutragen, der nach x Minuten gestartet wird. Ist an einem Rechner nun niemand angemeldet, erscheint nach x Minuten dieser Bildschirmschoner. Mein Problem ist, dass sich der Rechner in abgemeldetem Zustand nicht herunterfahren läßt. Der Bildschirmschoner in angemeldetem Zustand verrichtet seine Dinge wie er soll.

Ich nutze die allgemein beschriebene ExitWindowsEx-Prozedur unter Windows XP.

Gruß,

Pierre


Martin1966 - Di 20.06.06 23:27

user profile iconLuckie hat folgendes geschrieben:
Das ist eiegntlich schon reif für eine Signatur. :mrgreen:

Nja, nicht jeder kennt sich halt so gut aus. ;-)