IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Problème avec TRegistry et SaveKey...


Sujet :

Composants VCL Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème avec TRegistry et SaveKey...
    Bonjour,
    Je cherche à faire une sauvegarde d'un noeud de registre (avec ses sous clés) pour pouvoir transporter des fichiers de configuration.
    Je développe avec Dephi 4 sous Win2000 et j'utilise la fonction SaveKey du composant TRegistry. Le bout de code suivant ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    procedure TForm1.Button1Click(Sender: TObject);
    const
      sFileName = 'c:\temp\test';
      sRegString = 'Software\Borland\Delphi';
    var
      Reg: TRegistry;
    begin
      if FileExists(sFilename) then begin
        FileSetAttr(sFilename, 0); // clear Read-Only and Hidden flags
        Deletefile(sFilename);
      end;
      Reg := TRegistry.Create;
      try
        Reg.RootKey:= HKEY_LOCAL_MACHINE;
        if Reg.SaveKey(sRegString, sFilename) then
          Showmessage('Saved: ' + sFilename)
        else
          Showmessage('NOT saved');
      finally
        Reg.Free;
      end;
     
    end;
    La fonction renvoie false et le fichier crée est à 0 octets...
    Y'a t'il des problèmes connus avec cette fonction ?

    Merci pour votre aide,
    Fred.

    [Balise [code] ajoutée par Pierre Castelain]
    [Pensez-y à l'avenir. Merci.]

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Je viens d'essayer, et ton code fonctionne sans problème avec WindowsMe. Par contre en essayant avec WindowsXP j'ai le même problème bien que ma session soit une session administrateur. A mon avis le blocage vient de là et non pas de la fonction SaveKey.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Extrait de l'aide de l'API win32 sur RegSaveKey qui est appelé par TRegistry.SaveKey (cf Registry.pas)
    Windows NT: The calling process must have the SE_BACKUP_NAME privilege. For more information about privileges, see Privileges.

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    AMILIN
    C'est exact et c'est ce que j'avais vu. Mais ceci n'est pas bloquant, car une application peut modifier ce droit. Entre temps j'ai retrouvé mon code qui permet de modifier un privilège.

    subsub
    Voici donc le code complet, la sauvegarde le la clef est la même que le code que tu donnes, mais avant il y a la demande de droit 'BACKUP'. Qui est ensuite supprimé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    function _AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
      NewState: PTokenPrivileges; BufferLength: DWORD;
      PreviousState: Integer; ReturnLength: Integer): BOOL;stdcall; external advapi32 name 'AdjustTokenPrivileges';
     
    // Fonction de mise à jour des droits utilisateurs avec NT/2000/XP
    Function LoggedSetBackupPrivilege ( hProcess:THANDLE;bEnable:Boolean):Boolean;
    Var
      Info  : TTokenPrivileges;
      Token : THandle;
      Res   : Boolean;
    Const SE_BACKUP_NAME='SeBackUpPrivilege';
    Begin
      // Ouverture des droits
      Res := OpenProcessToken ( hProcess,TOKEN_ADJUST_PRIVILEGES,Token);
      If Not Res Then
      Begin
        ShowMessage('Impossible d''ouvrir les droits.' );
        Result:=False;
        Exit;
      End;
     
      // Mise à True ou False du droit
      Info.PrivilegeCount := 1;
      if  bEnable
        Then Info.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        Else Info.Privileges[0].Attributes := 0;
     
      // Obtention du LUID.
      Res := LookupPrivilegeValue ( Nil,SE_BACKUP_NAME,Info.Privileges[0].Luid);
      if Not Res Then
      Begin
        ShowMessage('Impossible de trouver la valeur du privilège SE_BACKUP_NAME.' );
        Result:=False;
        Exit;
      End;
     
      // Modification du privilège
      Res := _AdjustTokenPrivileges ( Token, FALSE,@Info, 0, 0, 0);
      if Not Res Then
      Begin
        ShowMessage('Impossible de modifier le privilège, erreur '+IntToStr(GetLastError));
        Result:=False;
        Exit;
      End
      Else
      Begin
        if GetLastError<>ERROR_SUCCESS Then
        Begin
          ShowMessage('Impossible d''obtenir le privilège SE_BACKUP_NAME'#13+
                      'Vérifier les règles de sécurité locale.');
          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
      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
      LoggedSetBackupPrivilege( GetCurrentProcess, TRUE );
     
      Reg := TRegistry.Create;
      try
        Reg.RootKey:= HKEY_LOCAL_MACHINE;
        if Reg.SaveKey(sRegString, sFilename) then
          Showmessage('Saved: ' + sFilename)
        else
          Showmessage('NOT saved');
      finally
        Reg.Free;
      end;
     
      // On supprime ensuite les droits de BackUp donnés plus haut
      LoggedSetBackupPrivilege( GetCurrentProcess, False );
    end;
    Avec ceci, la fonction SaveKey fonctionne aussi avec NT/2000/XP. J'ai essayé avec Xp en administrateur, je ne sais pas si c'est possible avec un compte utilisateur simple.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Nono40, AMILIN, Merci pour votre aide ! J'essaye le code de suite et vous tiens au courant...

  6. #6
    Candidat au Club
    Inscrit en
    Mars 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut OK
    Ca marche très bien sous Windows 2000. J'ai également implémenté la fonction de restauration des paramètres (RestoreKey). Dans ce cas c'est le privilège SE_RESTORE_NAME qui est indispensable.
    C'est nikel, encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo