如题

解决方案 »

  1.   

    program ExitNt; Uses
      Windows;
    {$R *.RES}function SetPrivilege(sPrivilegeName : string;bEnabled : boolean ): boolean;
    var
      TPPrev,
      TP : TTokenPrivileges;
      Token : THandle;
      dwRetLen : DWord;
    begin
      Result := False;
      //opens the access token associated with a process.
      OpenProcessToken(
      GetCurrentProcess, //handle to process
      TOKEN_ADJUST_PRIVILEGES //Required to change the privileges specified in an access token.
      or TOKEN_QUERY, //Required to query the contents of an access token.
      Token);
      TP.PrivilegeCount := 1;
      //retrieves the locally unique identifier (LUID) used on a specified system to
      //locally represent the specified privilege name.
      if( LookupPrivilegeValue(
      Nil, //attempts to find the privilege name on the local system.
      PChar( sPrivilegeName ), // address of string specifying the privilege
      TP.Privileges[ 0 ].LUID ) // address of locally unique identifier
      )then
      begin
        if( bEnabled )then //Give this privileges
        begin
          TP.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
        end
        else
        begin //NOT Give this privileges
          TP.Privileges[ 0 ].Attributes := 0;
        end;
          dwRetLen := 0;
        //enables or disables privileges in the specified access token.
        Result := AdjustTokenPrivileges(
        Token, // handle to token that contains privileges
        False, //modifies privileges
        TP, // pointer to new privilege information
        SizeOf( TPPrev ), // size, in bytes, of the TPPrev buffer
        TPPrev, // receives original state of changed privileges
        dwRetLen // receives required size of the TPPrev buffer
        );
      end;
      CloseHandle(Token);
    end;
    function WinExitInNT( iFlags : integer ) : boolean;
    begin
      Result := True;
      if( SetPrivilege( 'SeShutdownPrivilege', True ) )then
      begin
        if( not ExitWindowsEx( iFlags, 0 ) )then
        begin
        Result := False;
        end;
      SetPrivilege( 'SeShutdownPrivilege', False )
      end
      else
      begin
    // handle errors...
      Result := False;
      end;
    end;
    begin
      WinExitInNT(EWX_SHUTDOWN+EWX_POWEROFF);
    end. 
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);  private
        { Private declarations }
        procedure AdjustToken;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.AdjustToken();
    var
      hdlProcessHandle : Cardinal;
      hdlTokenHandle : Cardinal;
      tmpLuid : Int64;
      tkpPrivilegeCount : Int64;
      tkp : TOKEN_PRIVILEGES;
      tkpNewButIgnored : TOKEN_PRIVILEGES;
      lBufferNeeded : Cardinal;
      Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
    begin
             hdlProcessHandle := GetCurrentProcess;
             OpenProcessToken(hdlProcessHandle,
                             (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
                              hdlTokenHandle);         // Get the LUID for shutdown privilege.
             LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
             Privilege[0].Luid := tmpLuid;
             Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
             tkp.PrivilegeCount := 1;   // One privilege to set
             tkp.Privileges[0] := Privilege[0];
             // Enable the shutdown privilege in the access token of this
             // process.
             AdjustTokenPrivileges(hdlTokenHandle,
                                   False,
                                   tkp,
                                   Sizeof(tkpNewButIgnored),
                                   tkpNewButIgnored,
                                   lBufferNeeded); end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         AdjustToken;
         ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), $FFFF);
    end;end.