⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nt关机.pas

📁 一个自动关机的小程序,大家可以看看.还可以
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    CheckBox1: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin

end;
//NT中的关闭计算机,重新登陆的实现
//在NT中要实现以上的功能,首先必须获得SE_SHUTDOWN_NAME权限后,才能调用ExitWindowsEx;这是和Windows95的不同
//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 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;
//Enabled or DisEnabled the SE_SHUTDOWN_NAME privilege
//sPrivilegeName:
// 'SE_SHUTDOWN_NAME'
//bEnabled :
// Enabled or DisEnabled 'SE_SHUTDOWN_NAME' privilege

procedure TForm1.Button1Click(Sender: TObject);
begin
// EWX_SHUTDOWN
// following attributes may be combined with above flags
// EWX_POWEROFF
// EWX_FORCE : terminate processes
checkbox1.Checked:=WinExitInNT( EWX_FORCE+EWX_SHUTDOWN+EWX_POWEROFF);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -