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

C++Builder Discussion :

Savoir si le compte est administrateur ou pas


Sujet :

C++Builder

  1. #1
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut Savoir si le compte est administrateur ou pas
    Bonjour,

    je cherche à savoir si le compte qui exécute mon programme est administrateur ou pas.
    J'ai fait un recherche sur le forum et je suis tombé sur ce post sur le forum Développement Windows qui propose d'utiliser la fonction IsUserAnAdmin().
    Quand j'essaye de l'utiliser sans faire d'include (on sait jamais), BCB me dit qu'il ne connait pas la fonction. En suivant les infos sur cette fonction présentes sur la MSDN, j'ai testé en ajoutant shlobj.h mais, si je fais ça, j'ai droit à des erreurs de déclarations multiples avec shobjid.h présent dans le dossier Include de Builder.

    Quelqu'un aurait-il une solution pour éviter ce genre d'erreurs?

    Merci.

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    Dans l'aide de Windows (win32.hlp) il propose cette solution permettant de savoir si le compte est administrateur:

    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
     
    BOOL IsAdmin(void)
    {
       HANDLE hProcess, hAccessToken;
     
       UCHAR InfoBuffer[1024];
       PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
       DWORD dwInfoBufferSize;
       PSID psidAdministrators;
       SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
       UINT x;
     
       hProcess = GetCurrentProcess();
     
       if(!OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken))
          return(FALSE);
     
       if(!GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer,
          1024, &dwInfoBufferSize)) return(FALSE);
     
       AllocateAndInitializeSid(&siaNtAuthority, 2,
          SECURITY_BUILTIN_DOMAIN_RID,
          DOMAIN_ALIAS_RID_ADMINS,
          0, 0, 0, 0, 0, 0,
          &psidAdministrators);
     
       for(x=0;x<ptgGroups->GroupCount;x++)
       {
          if( EqualSid(psidAdministrators, ptgGroups->Groups[x].Sid) )
          {
             FreeSid(&psidAdministrators);
             return( TRUE );
          }
       }
       FreeSid(&psidAdministrators);
       return(FALSE);
    }
    Ca marche impec, j'ai testé. Le truc c'est que le lancement en mode débug (pas par l'exe) ouvre une fenêtre CPU . Mais on ne retrouve pas ce soucis lorsqu'on lance l'exe.

  3. #3
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Merci pour la fonction bandit boy
    Cela fonctionne et j'ai, moi aussi, l'affichage de la fenêtre CPU en mode debug.

    Je mets donc le message en résolu mais si un spécialiste des API Windows passe dans le coin et trouve l'erreur qui fait apparaitre la fenetre CPU, je suis preneur

  4. #4
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    En fait c'est la ligne de libération de l'espace mémoire qui lance la fenêtre CPU. Si à la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FreeSid(&psidAdministrators);
    on mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete psidAdministrators;
    On corrige le problème, mais je ne suis pas sur à 100% que la libération soit bien faite.
    Comment s'en assurer ?

  5. #5
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je viens de tester 5 fois de suite la fonction, et on obtiens une erreur. J'en conclus donc que delete n'est pas la bonne solution.
    La structure étant d'un type particulier, sa libération doit bien se faire avec cette fonction.

    Sinon, je pense qu'il faudrait modifier les options de Builder pour qu'il n'affiche pas la fenêtre mais je ne sais pas faire.
    Si quelqun connaît une méthode ...

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/09/2006, 17h04
  2. comment savoir si un contrôle est mulitiline ou pas ?
    Par Ekimasu dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 10h28
  3. comment savoir si une fenetre est agrandi ou pas ?
    Par EssaiEncore dans le forum Langage
    Réponses: 3
    Dernier message: 07/11/2005, 11h42
  4. savoir si une table est masquée ou pas
    Par scully2501 dans le forum Access
    Réponses: 13
    Dernier message: 22/09/2005, 12h19
  5. Savoir si l'utilisateur est administrateur
    Par Don ViP dans le forum Windows
    Réponses: 2
    Dernier message: 26/04/2004, 13h20

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