在 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) |