NOTES :
Ce source à pour but de montrer comment modifier les droits d'un compte pour des fonctions particulières. Par exemple
pour la sauvegarde d'une partie de la base de registre un compte doit avoir le droit SE_BACKUP_NAME.
L'utilsation de la fonction ci-dessous est simple :
- Pour activer un droit :
LoggedSetPrivilege(GetCurrentProcess,'SeBackUpPrivilege',True);
- Pour desactiver un droit :
LoggedSetPrivilege(GetCurrentProcess,'SeBackUpPrivilege',False);
CODE :
Function _AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
NewState: PTokenPrivileges; BufferLength: DWORD;
PreviousState: Integer; ReturnLength: Integer): BOOL;stdcall; external advapi32 name 'AdjustTokenPrivileges';
Function LoggedSetPrivilege ( hProcess:THANDLE;Droit:String;bEnable:Boolean):Boolean; Var
Info : TTokenPrivileges;
Token : THandle;
Res : Boolean; Begin // Ouverture des droits du compte
Res := OpenProcessToken ( hProcess,TOKEN_ADJUST_PRIVILEGES,Token);
IfNot Res Then Begin
ShowMessage('Ouverture des droits impossible' );
Result:=False;
Exit; End;
// Enable ou disable?
Info.PrivilegeCount := 1; If bEnable Then Info.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED Else Info.Privileges[0].Attributes := 0;
// Obtenir le LUID du droit dont on veut changer l'état.
Res := LookupPrivilegeValue ( Nil,Pchar(Droit),Info.Privileges[0].Luid); IfNot Res Then Begin
ShowMessage('Impossible d''obtenir le LUID de '+Droit );
Result:=False;
Exit; End;
// Modification du droit
Res := _AdjustTokenPrivileges ( Token, FALSE,@Info, 0, 0, 0); IfNot Res Then Begin
ShowMessage('Impossible de modifier le droit, erreur '+IntToStr(GetLastError));
Result:=False;
Exit; End Else Begin If GetLastError<>ERROR_SUCCESS Then Begin
ShowMessage('Impossible d''activer le droit '+Droit+', vérifiez la gestion locale des comptes.');
Result:=False;
Exit; End; End;