Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi shutdown! (https://www.delphipraxis.net/44750-shutdown.html)

BornToBeBreit 24. Apr 2005 07:39


shutdown!
 
Hi @ all

allso, hab jetz schon alles versucht, hab gesucht gesucht gesucht und gesucht und nix gefunden.

Ich hab eigentlich ne ganz einfache frage, wie schaff ich es meinen Pc herunterzu fahren, dazu hab ich schon viel gefunden, aber immer wenn ich den code dann benutze, passirt garnix.

Warum?

Ich raffs net, ach, ich hab windows xp proffesional, aber das müsste doch keinen unterschied machen oder?

[edit=sakura] Sch*** aus dem Titel entfernt. Mfg, sakura[/edit]

alcaeus 24. Apr 2005 07:40

Re: Sch*** shutdown!
 
Moin BornToBeBreit,

nimm mal das Kraftwort aus dem Titel raus.
Weiters waere es ganz interessant zu wissen, welche Codes du verwendest hast.

Greetz
alcaeus

PierreB 24. Apr 2005 07:41

Re: Sch*** shutdown!
 
Welchen Code hast du denn bereits ausprobiert ?

//Verdammt bist du schnell, alci
// War das nicht einfach
Delphi-Quellcode:
Shotdown
?

MathiasSimmack 24. Apr 2005 07:44

Re: Sch*** shutdown!
 
Kann ich euch sagen, Jungs: Vermutlich nur den normalen ExitWindowsEx-Befehl. Der Teil, dass man auf NT-System erst mal ein bestimmtes Privileg holen muss, wird immer gern überlesen. Daher auch:
Zitat:

Zitat von BornToBeBreit
Ich raffs net, ach, ich hab windows xp proffesional, aber das müsste doch keinen unterschied machen oder?

;)

BornToBeBreit 24. Apr 2005 07:48

Re: Sch*** shutdown!
 
Also ich benutze folgenden code


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;
[Edit]Doppelten Code entfernt[/EDIT]

[edit=Sharky]Tags korigiert und doppelten Code entfernt. Mfg, Sharky[/edit]

Kidix 24. Apr 2005 08:42

Re: Sch*** shutdown!
 
Was ist denn hiermit?

Delphi-Quellcode:
function MyExitWindows(RebootParam: Longword): Boolean;
var
  TTokenHd: THandle;
  TTokenPvg: TTokenPrivileges;
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;
  tpResult: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    tpResult := OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      TTokenHd);
    if tpResult then
    begin
      tpResult := LookupPrivilegeValue(nil,
                                       SE_SHUTDOWN_NAME,
                                       TTokenPvg.Privileges[0].Luid);
      TTokenPvg.PrivilegeCount := 1;
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;
      if tpResult then
        Windows.AdjustTokenPrivileges(TTokenHd,
                                      False,
                                      TTokenPvg,
                                      cbtpPrevious,
                                      rTTokenPvg,
                                      pcbtpPreviousRequired);
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

Jens Schumann 24. Apr 2005 09:02

Re: Sch*** shutdown!
 
Hallo Kidix,
warum hast Du den Source gepostet? Kannst Du den unterschied zu BornToBeBreit's geposteten Code
erklären?
Außerdem enthält Dein Code einen Fehler. Das Tokenhandle wird nicht mit CloseHandle freigegeben.

Waldteufel 24. Apr 2005 09:15

Re: Sch*** shutdown!
 
Hi.

Es geht auch einfacher. Die nette Firma Microsoft hat nämlich ein Programm geschrieben, dass in ungefähr das macht, was beschrieben wurde... ;-) Bei XP gehts auf jeden fall... Andere Betriebssysteme hab ich nicht zum Testen zur verfügung.

Delphi-Quellcode:
ShellExecute(Handle, PChar('open'), PChar('C:\Windows\System32\shutdown.exe'), PChar('-s'), SW_HIDE);
{ code ungetestet, da delphi gerade in reparatur... }
mfg, Waldteufel

alcaeus 24. Apr 2005 09:16

Re: Sch*** shutdown!
 
Hallo Waldteufel,

das shutdown-Dienstprogramm gibts nur unter XP und 2k (glaub ich jedenfalls), und man braucht Admin-Rechte um es benutzen zu koennen. Ganz so freundlich waren die Jungs von MS doch nicht ;)

Greetz
alcaeus

Waldteufel 24. Apr 2005 09:19

Re: Sch*** shutdown!
 
Hi.

Zitat:

Zitat von alcaeus
das shutdown-Dienstprogramm gibts nur unter XP und 2k (glaub ich jedenfalls)

Mag sein, aber er hat gesagt, dass er das für nen XP-Rechner braucht... ;-)

Jens Schumann 24. Apr 2005 09:21

Re: Sch*** shutdown!
 
Zitat:

Zitat von Waldteufel
Hi.

Zitat:

Zitat von alcaeus
das shutdown-Dienstprogramm gibts nur unter XP und 2k (glaub ich jedenfalls)

Mag sein, aber er hat gesagt, dass er das für nen XP-Rechner braucht... ;-)

Mag sein, aber auch für shutdown benötigt man Adminrechte.

Michael_Bayer 24. Apr 2005 09:34

Re: Sch*** shutdown!
 
Zitat:

Zitat von Jens Schumann
Zitat:

Zitat von Waldteufel
Hi.

Zitat:

Zitat von alcaeus
das shutdown-Dienstprogramm gibts nur unter XP und 2k (glaub ich jedenfalls)

Mag sein, aber er hat gesagt, dass er das für nen XP-Rechner braucht... ;-)

Mag sein, aber auch für shutdown benötigt man Adminrechte.

Er hat nicht gesagt, dass es unter einem normalen Benutzeraccount laufen soll...

Garfield 24. Apr 2005 17:52

Re: Sch*** shutdown!
 
Ich benutze die Procedure aus der shutdown.pas von Gordian Knot.

BornToBeBreit 25. Apr 2005 07:02

Re: Sch*** shutdown!
 
Hey Garfield
der code funktionirt perfekt, genau wie ich ihn wollt. danke euch allen.

Luckie 25. Apr 2005 10:54

Re: Sch*** shutdown!
 
Zitat:

Zitat von BornToBeBreit
Hey Garfield
der code funktionirt perfekt, genau wie ich ihn wollt. danke euch allen.

Und damit hast du den denkbar schlechtesten Code genommen, den du dafür bekommen konntest. Wenn du dir den Code etwas aufmerksamer angekuckt hättest, dann hättest du gemerkt, dass selbiger Code schon in ein paar Variationen hier gepostet wurde. :roll:

BornToBeBreit 25. Apr 2005 12:19

Re: shutdown!
 
Ja, da hast vieleicht recht aber ich hab halt nonet so viel erfahrung mit delphi.

Mephistopheles 25. Apr 2005 12:23

Re: shutdown!
 
Dann laß dich doch beraten. Es ist nicht schlimm nichts zu wissen, aber sich damit, nichts zu wissen, rauszureden das ist schlimm -> siehe hier.

Jens Schumann 25. Apr 2005 15:55

Re: Sch*** shutdown!
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von BornToBeBreit
Hey Garfield
der code funktionirt perfekt, genau wie ich ihn wollt. danke euch allen.

Und damit hast du den denkbar schechtesten Code genommen, den du dafür bekommen konntest. Wenn du dir den Code etwas aufmerksamer angekuckt hättest, dann hättest du gemrkt, dass selber Code schon in ein paar Variationen hier gepostet wurde. :roll:

Dann zeigt doch mal bitte den denkbar besten Code. :wink:

Jens Schumann 27. Apr 2005 17:26

Re: shutdown!
 
Hallo Luckie,
wie sieht es aus? Bekommen wie den denkbar besten Code noch zu sehen? :stupid:

MathiasSimmack 27. Apr 2005 17:32

Re: shutdown!
 
Ich glaube nicht, denn das wäre ja eine subjektive Beitragsbewertung, wg. der Luckie die DP verlassen müsste. :mrgreen:

Jens Schumann 27. Apr 2005 17:34

Re: shutdown!
 
Zitat:

Zitat von MathiasSimmack
Ich glaube nicht, denn das wäre ja eine subjektive Beitragsbewertung, wg. der Luckie die DP verlassen müsste. :mrgreen:

Ich möchte natürlich auf gar keinen Fall das Luckie di DP verlassen muss. Schau doch mal dort

MathiasSimmack 27. Apr 2005 17:38

Re: shutdown!
 
Ich habe das schon mitbekommen, Jens. ;) Das war nur ein Insider-Joke aus dem Niveauthread von mir. Aber jetzt höre ich, das wird OT. Außerdem zünden Gags nicht mehr, wenn man sie erklären muss. :lol:

Luckie 27. Apr 2005 19:54

Re: shutdown!
 
Zitat:

Zitat von Jens Schumann
Hallo Luckie,
wie sieht es aus? Bekommen wie den denkbar besten Code noch zu sehen? :stupid:

gemach, gemach.

Was mich an dem Code von Gardian Knot stört, ist das jegliche Rückgabewerte auf das sträflichste missachtet wurden. Da ist selbst der Code, der auf der ersten Seite gepostet wurde noch besser.

Delphi-Quellcode:
function EnablePrivilege(const Privilege: string; fEnable: Boolean; out
  PreviousState: Boolean): DWORD;
var
  Token       : THandle;
  NewState    : TTokenPrivileges;
  Luid        : TLargeInteger;
  PrevState   : TTokenPrivileges;
  Return      : DWORD;
begin
  PreviousState := True;
  if (GetVersion() > $80000000) then
    // Win9x
    Result := ERROR_SUCCESS
  else
  begin
    // WinNT
    if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then
      Result := GetLastError()
    else
    try
      if not LookupPrivilegeValue(nil, PChar(Privilege), Luid) then
        Result := GetLastError()
      else
      begin
        NewState.PrivilegeCount := 1;
        NewState.Privileges[0].Luid := Luid;
        if fEnable then
          NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
          NewState.Privileges[0].Attributes := 0;
        if not AdjustTokenPrivileges(Token, False, NewState,
          SizeOf(TTokenPrivileges), PrevState, Return) then
          Result := GetLastError()
        else
        begin
          Result := ERROR_SUCCESS;
          PreviousState :=
            (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0);
        end;
      end;
    finally
      CloseHandle(Token);
    end;
  end;
end;
Das ist meine Funktion, um das Privileg zu aktivieren.

Jens Schumann 28. Apr 2005 17:47

Re: shutdown!
 
Danke

Garfield 7. Mai 2005 22:01

Re: shutdown!
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von BornToBeBreit
Hey Garfield
der code funktionirt perfekt, genau wie ich ihn wollt. danke euch allen.

Und damit hast du den denkbar schechtesten Code genommen, den du dafür bekommen konntest. Wenn du dir den Code etwas aufmerksamer angekuckt hättest, dann hättest du gemrkt, dass selber Code schon in ein paar Variationen hier gepostet wurde. :roll:

Für mich war es nach längerem Suchen und Ausprobieren mehrerer Codes der erste, der wirklich das tat, was er sollte. Deshalb habe ich ihn empfohlen. Deine function werde ich ausprobieren. Vielleicht habe ich damit auch Erfolg.

PS: Meine späte Antwort liegt daran, dass ich auf Montage war.

MrKnogge 6. Aug 2005 15:23

Re: shutdown!
 
@Luckie

Kannst du mir die Parameter erklären, die ich übergeben muss, bzw zurück erhalte ? *ganzliebguck*

gruss

Nils_13 6. Aug 2005 15:29

Re: shutdown!
 
Bei mir läuft Kidix's Code aber :gruebel: . Ich hab xp_prof und verwende ihn selbst immer... .

Luckie 6. Aug 2005 15:31

Re: shutdown!
 
Der erste Paramter gibt das Privilieg an, um welches es geht, der zweite ob es aktiviert oder deaktiviert werden soll und der dritte gibt zurück, ob das Privileg vorher aktiviert oder deaktiviert war.

MrKnogge 6. Aug 2005 15:35

Re: shutdown!
 
und result gibt zurück ob Fhler aufgetreten sind, richtig ?

gruss

Luckie 6. Aug 2005 15:36

Re: shutdown!
 
Richtig. Den kannst du mit GetLastError auswerten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 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