电脑爱好者之家移动版

主页 > 开发资料 > 程序设计教程 > DELPHI程序设计 >

DELPHI如何运用 API 实现关机程序?

在 Windows NT 的环境下使用 ExitWindowsEx 的 API 时,必须另外再呼叫AdjustTokenPrivileges,有谁能告诉我该如何使用 ExitWindowsEx 加上 AdjustTokenPrivileges 来做到关机的功能?

 

DELPHI程序实现关机的功能,请参阅以下的程序代码及相关说明

//iFlags:
// one of the following must be specified
// EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
// following attributes may be combined with above flags
// EWX_POWEROFF
// EWX_FORCE : terminate processes
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;

//Enabled or DisEnabled the SE_SHUTDOWN_NAME privilege
//sPrivilegeName:
// 'SE_SHUTDOWN_NAME'
//bEnabled :
// Enabled or DisEnabled 'SE_SHUTDOWN_NAME' privilege
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;

(责任编辑:机器AI)