转贴,我的程序中这是这样调用的.
function SetPrivilege(sPrivilegeName: string; bEnabled: boolean ): boolean;
var
; TPPrev,TP : TTokenPrivileges;
; Token : THandle;
; dwRetLen : DWord;
begin
; Result := False;
; 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;
//调用.
; ; ;WinExitInNT(EWX_SHUTDOWN+EWX_POWEROFF+EWX_FORCE);