Link to home
Start Free TrialLog in
Avatar of nhomc
nhomc

asked on

How to use delphi to shutdown My computer?

I want to make a delphi program.When I click a button,
it will shut down my computer automatically.
Avatar of Greedy
Greedy

ExitWindows(how, 0);

where how is:
EW_RESTARTWINDOWS - to restart Windows
EW_REBOOTSYSTEM - to reboot the entire system

also look at ExitWindowsEx for more options....all help is in
C:\Program Files\Borland\Delphi 3\HELP\win32.hlp
http://bes.trendline.co.il/torry/vcl/system/wreboot.zip

"By Barry Brannan. Non-visual component that lets you reboot/ shutdown/ logoff your system. "

-Torry's Delphi page
nhomc

Greedy is totally correct there...I personally would use ExitwindowsEx(...,0)

Like so...

ExitWindowsEx(EWX_SHUTDOWN, 0); to shutdown...
ExitWindowsEx(EWX_LOGOFF, 0); to Logoff user
ExitWindowsEx(EWX_POWEROFF, 0); to shutdown and power down
ExitWindowsEx(EWX_REBOOT, 0); to reboot the system
ExitWindowsEx(EWX_FORCE, 0); to force shutdown no matter what

anyways

Later
BoRiS
Well, I guess the components you see work the same way...
unit WinReboot;

(* TWinReboot component (freeware)
   by Barry Brannan, September 1997
   (barrylb@poboxes.com)


   Usage:

   1. Drop TWinReboot component on a form.
   2. Call WinReboot1.WinExit(flags)

   Where flags must be one of the following:

   EWX_LOGOFF     - Shuts down processes and logs user off
   EWX_REBOOT     - Shuts down the restarts the system
   EWX_SHUTDOWN   - Shuts down system

   The following attributes may be combined (OR'd) with above flags

   EWX_POWEROFF  - shuts down system and turns off the power.
   EWX_FORCE     - forces processes to terminate.


   Example:
           WinReboot1.WinExit(EWX_REBOOT or EWX_FORCE);
*)

interface

uses
  Windows, Classes;

type
  TWinReboot = class(TComponent)
  private
    function SetPrivilege(privilegeName: string; enable: boolean): boolean;
  public
    function WinExit(flags: integer): boolean;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TWinReboot]);
end;

function TWinReboot.SetPrivilege(privilegeName: string; enable: boolean): boolean;
var
  tpPrev,
  tp         : TTokenPrivileges;
  token      : THandle;
  dwRetLen   : DWord;
begin
  result := False;

  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);

  tp.PrivilegeCount := 1;
  if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
  begin
    if enable then
      tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
    else
      tp.Privileges[0].Attributes := 0;

    dwRetLen := 0;
    result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
  end;
  CloseHandle(token);
end;


function TWinReboot.WinExit(flags: integer): boolean;
begin
  Result := True;
  SetPrivilege('SeShutdownPrivilege', true);
  if not ExitWindowsEx(flags, 0) then
      Result := False;
  SetPrivilege('SeShutdownPrivilege', False);
end;

end.
Search in Win32.hlp for:
1. AdjustTokenPrivileges
2. ExitWindowsEx
Avatar of nhomc

ASKER

Thank you for your help!
All the answer is good ,but I am a tenderfoot in delphi,
I don't know how to use AdjustTokenPrivileges,Can you tell me
detailedly?

Avatar of nhomc

ASKER

Thank you for your help!
All the answer is good ,but I am a tenderfoot in delphi,
I don't know how to use AdjustTokenPrivileges,Can you tell me
detailedly?

Avatar of nhomc

ASKER

Thank you for your help!
All the answer is good ,but I am a tenderfoot in delphi,
I don't know how to use AdjustTokenPrivileges,
Can you tell me detailedly?
nhomc

To shutdown windows 95 etc. use the following...

ExitWindowsEx(EWX_SHUTDOWN, 0); to shutdown...

to shutdown a windows NT machine use this not AdjustTokenPrivileges...

InitiateSystemShutdown( nil, 'System will now shutdown', 2000, True, True);

were nil = local machine
'system ...' = is the message to display
2000 = is the time to show the message
True = force applications with unsaved changes flag
True = reboot after shutdown

Later
BoRiS

Whow Boris you score again... :)

As a metter of fact you I think don't have to know how to use AdjustTokenPrivileges. I can't explain you, but I think the code I've posted - the component can do.
The code I posted is the code of a component found in Torry's Delphi page.

Here are some more like it:

http://bes.trendline.co.il/torry/vcl/system/exitwin.zip

"By Alexander Meeder. Encapsulates the Windows API ExitWindowEx, now it has to be safe for WindowsNT"

http://bes.trendline.co.il/torry/vcl/system/wcommand.zip

http://bes.trendline.co.il/torry/vcl/system/wreboot.zip

Hope that helps...
Avatar of nhomc

ASKER

Thank you for your help!
All the answer is good ,but I am a tenderfoot in delphi,
I don't know how to use AdjustTokenPrivileges,Can you tell me
detailedly?
 

Here is an example to shutdown and restart the computer(Tested with Delphi 3 on NT4):

procedure TForm1.Button1Click(Sender: TObject);
var
 TokenPrivileges, PreviosPrivileges: ^TTokenPrivileges;
 ProcessHandle: THandle;
 tmp: Integer;
begin
   if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,ProcessHandle)  then Exit;
   LookupPrivilegeValue('', 'SeShutdownPrivilege', TokenPrivileges^.Privileges[0].Luid);
   TokenPrivileges^.PrivilegeCount:=1;
   TokenPrivileges^.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
   tmp:=0;
   PreviosPrivileges:=nil;
   AdjustTokenPrivileges(ProcessHandle, False, TokenPrivileges^, 0,PreviosPrivileges^ ,tmp);
   if not GetLastError()=ERROR_SUCCESS then Exit;
   if not InitiateSystemShutdown('', '', 0, True, True) then Exit;
   TokenPrivileges.Privileges[0].Attributes:=0;
   AdjustTokenPrivileges(ProcessHandle, False, TokenPrivileges^, 0,PreviosPrivileges^ ,tmp);
end;
Avatar of nhomc

ASKER

ronit:
  Thanks for your winnt program!
  But I want a shutdown program in win95.
  Can you give me another full win95 program just like your first one?
  Thanks a lot!
                                     nhomc
                                         

 
Avatar of nhomc

ASKER

ronit:
  Thanks for your winnt program!
  But I want a shutdown program in win95.
  Can you give me another full win95 program just like your first one?
  Thanks a lot!
                                     nhomc
                                         

 
Avatar of nhomc

ASKER

ronit:
I use your program in win95,
but it exit in the following line:

if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,ProcessHandle)  then Exit;

so I can conclude that OpenProcessToken returns false.

ASKER CERTIFIED SOLUTION
Avatar of ZifNab
ZifNab

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of nhomc

ASKER

Thank you for all your help!
All the answer is excellent!
I made a mistake at first!
I thought it must use AdjustTokenPrivileges at win95.
So I wasted a lot of time.
I am sorry for my mistake!
Thanks a lot!