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

Delphi Discussion :

[D6] Exécuter du code en tant qu'Admin ? (écrire dans HKEY_LOCAL_MACHINE)


Sujet :

Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut [D6] Exécuter du code en tant qu'Admin ? (écrire dans HKEY_LOCAL_MACHINE)
    Je cherche à écrire dans la base de registre dans HKEY_LOCAL_MACHINE, sachant que l'utilisateur qui exécutera mon application, n'a pas les droits en écriture.

    J'ai donc trouvé le code suivant, qui fonctionne quand on a déjà les droits Admin :
    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
    var
       hToken: Cardinal;
       Reg: Tregistry;
    begin
       hToken := PerformLogon('admin', 'domaine', 'Motdepasse');
       try
          if not ImpersonateLoggedOnUser(hToken) then
          begin
             Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'ImpersonateLoggedOnUser', MB_ICONERROR + MB_OK);
             Exit;
          end;
     
          try
             Reg := TRegistry.Create;
             try
                Reg.RootKey := HKEY_LOCAL_MACHINE;
                if Reg.OpenKey('SOFTWARE\MonApp', False) then
                begin
                   Reg.WriteString('TEST', 'poiop');
                   Reg.CloseKey;
                end
                else
                   Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'TRegistry', MB_ICONERROR + MB_OK);
             finally
                Reg.Free;
             end;
          finally
             if not RevertToSelf then
                Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'RevertToSelf', MB_ICONERROR + MB_OK);
          end;
       finally
          CloseHandle(hToken);
       end;
    Et pour obtenir le jeton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function PerformLogon(const User, Domain, Password: string): Cardinal;
    begin
       if not LogonUser(PChar(User), PChar(Domain), PChar(Password), LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, Result) then
       begin
          if GetLastError = ERROR_PRIVILEGE_NOT_HELD then
             Application.MessageBox(PChar('ERROR_PRIVILEGE_NOT_HELD' + #13#10 + SysErrorMessage(GetLastError)), 'LogonUser', MB_ICONERROR + MB_OK)
          else
             Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'LogonUser', MB_ICONERROR + MB_OK);
          Exit;
       end;
    end;
    Sauf que, quand je teste sous une session utilisateur (normal), j'obtiens l'erreur :
    ERROR_PRIVILEGE_NOT_HELD
    Le client ne dispose pas d'un privilège nécessaire
    L'aide Delphi indique qu'il faut avoir le privilège SE_TCB_NAME, même s'il n'est pas activé.

    Comment ajouter ce privilège à l'utilisateur courant ?
    Ou comment faire autrement ?

    J'ai testé sur un XP Pro SP2, et un 2000 SP4. Donc, ca doit être supporté (voir http://msdn2.microsoft.com/en-us/library/aa378612.aspx).


  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Personne n'a d'idée ?


  3. #3
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Citation Envoyé par philnext
    Oui, mais pour utiliser cette solution, ça m'obligerait à couper mon application en deux.
    Pas génial, quand même ...


    Mais bon, si personne ne sait faire autrement.


  5. #5
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Bonjour,
    je ne sais pas si cela fonctionne en session utilisateur, mais tu peux essayer de donner le privilège manquant au processus courant (à son jeton en fait):

    http://msdn2.microsoft.com/en-us/library/aa379620.aspx
    avec le bout de code interessant (bon c'est du C++, mais pas trop dur à traduire, je pense):
    Code C++ : 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
    // Open a handle to the access token for the calling process.
        if (!OpenProcessToken(GetCurrentProcess(), 
                              TOKEN_ADJUST_PRIVILEGES, 
                              &hToken)) 
           {
              printf("OpenProcessToken failed: %u\n", GetLastError()); 
              goto Cleanup; 
           } 
     
        // Enable the SE_TAKE_OWNERSHIP_NAME privilege. 
        // ESSAYE ICI  SE_TCB_NAME à la place
        if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, TRUE)) 
        {
            printf("You must be logged on as Administrator.\n");
            goto Cleanup; 
        }

    avec le code de SetPrivilege :
    http://msdn2.microsoft.com/en-us/library/aa446619.aspx
    (aussi en C++ désolé )

    Edit : j'ai essayé SE_TCB_NAME : ne semble pas passer en admin sous Xp pro

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Merci pour ton aide, mais je ne peux pas tester le code.
    Il me manque la définition du type LUID.

Discussions similaires

  1. Comment exécuter du code en tant que "root" sous éclipse ?
    Par shadowmind dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 22/04/2009, 02h43
  2. exécuter le code en tant que
    Par poussin_44 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/07/2007, 16h12
  3. Réponses: 44
    Dernier message: 02/08/2006, 16h12
  4. Réponses: 3
    Dernier message: 20/04/2005, 12h30
  5. Réponses: 7
    Dernier message: 03/02/2005, 17h20

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