电脑爱好者之家

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

时间:2012-12-06 13:55来源:未知 作者:机器AI 点击:
在 Windows NT 的环境下使用 ExitWindowsEx 的 API 时,必须另外再呼叫AdjustTokenPrivileges,有谁能告诉我该如何使用 ExitWindowsEx 加上 AdjustTokenPrivileges 来做到关机的功能?

在 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)
织梦二维码生成器
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片