📄 nt关机.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 + -