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.
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.
没试过,纯属个人,HOHOHO.
谢谢你提供的方法,不过好象不是很好用!
难道就没有其他方法了吗?win本身既然能实现,那么我们应该也可以实现啊?
我找找看的,谢谢!
不过我最想实现的还是 快速启动.
再调用 bottom(底) 老兄的方法,
你的方法是不是给所有的程序发一个推出消息然后,再关闭系统啊?
可是我要的不是关闭系统而是 快速重起动啊
var
hToken: THANDLE;
hProc: THANDLE;
mLUID: TLargeInteger;
mPriv, mNewPriv: TOKEN_PRIVILEGES;
mBufferLength: DWord;
begin
if not (ewx in [1, 2]) then
exit;
hProc := GetCurrentProcess();
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken);
LookupPrivilegeValue('', 'SeShutdownPrivilege', mLUID);
mPriv.PrivilegeCount := 1;
mPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
mPriv.Privileges[0].Luid := mLUID;
AdjustTokenPrivileges(hToken, False, mPriv, (4 + (12 * mPriv.PrivilegeCount)), mNewPriv, mBufferLength);
case ewx of
1: ExitWindowsEx(EWX_FORCE + EWX_REBOOT, 0);
2: ExitWindowsEx(EWX_FORCE + EWX_POWEROFF, 0);
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ExitWin2000(2); //------1表示重启
end;
能够实现“快速”重启动吗?