NOTES :
L'utilisation de cette fonction nécessite des droits supplémentaires. La fonction donnée dans le source 0051 permet d'jouter le droit
SE_BACKUP_NAME au compte en cours avant d'effectuer la sauvegarde.
CODE :
Unit Unit1; // // Sujet : Utiliser la fonction RegSaveKey sous NT/2000/Xp // // Par Nono40 : http://nono40.developpez.com http://nono40.fr.st // mailTo:nono40@fr.st // // Le 20/04/2003 //
Type
TForm1 = Class(TForm)
Button1: TButton; Procedure Button1Click(Sender: TObject); Private { Déclarations privées } Public { Déclarations publiques } End;
Var
Form1: TForm1;
Implementation
Uses Registry;
{$R *.dfm}
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;
CloseHandle( Token );
Result:=True; End;
Procedure TForm1.Button1Click(Sender: TObject); Const
sFileName = 'c:\temp\test.txt';
sRegString = 'Software\Borland\Delphi'; Var
Reg: TRegistry; Begin // On supprime le fichier existant If FileExists(sFilename) Then Begin
FileSetAttr(sFilename, 0); // clear Read-Only and Hidden flags
Deletefile(sFilename); End;
// Il faut les droits de 'BACKUP' pour utiliser SaveKey
LoggedSetPrivilege(GetCurrentProcess,'SeBackUpPrivilege',True);
// Copie d'une partie de la base de registres.
Reg := TRegistry.Create; Try
Reg.RootKey:= HKEY_LOCAL_MACHINE; If Reg.SaveKey(sRegString, sFilename) Then
Showmessage('Sauvegarde effectuée ' + sFilename) Else
Showmessage('Sauvegarde non effectuée'); Finally
Reg.Free; End;
// On supprime ensuite les droits de BackUp donnés plus haut
LoggedSetPrivilege(GetCurrentProcess,'SeBackUpPrivilege',False); End;