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

Windows Discussion :

Problème ERROR_NOACCESS avec la fonction OpenProcessToken de l'API Windows/C++


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut Problème ERROR_NOACCESS avec la fonction OpenProcessToken de l'API Windows/C++
    Bonjour tout le monde,

    Je veux obtenir un Token sur le processus "explorer.exe" et j'ai un problème avec la fonction 'OpenProcessToken' de l'API Windows/C++, elle échoue à tous les coups
    Elle retourne toujours 0, et le GetLastError() retourne le code d'erreur 998, qui selon les gens de msdn signifie ERROR_NOACCESS.
    Pour plus de précisions:
    1) le compte utilisateur que j'utilise est un compte Administrateur local( pas sur un domaine AD)
    2) système d'exploitation Vista
    voici le code de mon programme:
    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
    int _tmain(int argc, _TCHAR* argv[])
    {
    	DWORD processID=GetPidByName("explorer.exe"); //GetPidByName : cette fonction permet de récupérer l'ID du processus, elle marche nickel et je l'ai testé 
    	printf("PID = %ld\n", processID);
      
        HANDLE hExplorerProcess = OpenProcess( PROCESS_QUERY_INFORMATION ,
                                       FALSE, processID );
    	
    	PHANDLE TokenHandle=NULL;
    	BOOL b=OpenProcessToken(hExplorerProcess, 
    							  TOKEN_READ,
    							  TokenHandle);
    
        DWORD d=GetLastError();
    	  
    	  system("pause>nul");
      
    	return 0;
    }

    Merci pour tout type d'aide

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Es-tu sûr ce n'est pas le OpenProcess() qui échoue?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Es-tu sûr ce n'est pas le OpenProcess() qui échoue?
    bon, je suis pas sûr de ce que je vais dire, mais je crois que si la valeur du HANDLE et non nulle, c'est qu'il est valide ( l'exemple chez moi donne hExplorerProcess = 0x000000a8 )

    Aussi quand je récupère le GetLastError() après l'appel de openProcess(), sa valeur est à 0

    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
    nt _tmain(int argc, _TCHAR* argv[])
    {
    	DWORD processID=GetPidByName("explorer.exe"); 
    	printf("PID = %ld\n", processID);
      
        HANDLE hExplorerProcess = OpenProcess( PROCESS_QUERY_INFORMATION ,
                                       FALSE, processID );
    	  DWORD d1=GetLastError();
    	
    	PHANDLE TokenHandle=NULL;
    	BOOL b=OpenProcessToken(hExplorerProcess, 
    							  TOKEN_READ,
    							  TokenHandle);
    
        DWORD d2=GetLastError();
    	  
    	  system("pause>nul");
      
    	return 0;
    }

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bizarre. Peut-être est-ce dû à l'UAC?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Peut-être devrais-tu essayer en ne demandant aucun droit, puis en demandant seulement STANDARD_RIGHTS_READ, pour voir à partir de quels droits tu te fais jeter...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Bizarre. Peut-être est-ce dû à l'UAC?
    1) l'UAC est désactivée chez moi( je l'ai fait pour échapper aux popup qui me sautent à l'écran à chaque test de lancement d'un programme ..)
    2) J'ai un doute de la combinaison de mask qu'il faut mettre pour pouvoir avoir le token. Dans les paramètres des deux fonctions OpenProcess et OpenProcessToken, y'a des types de droits d'accès à préciser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     HANDLE hExplorerProcess = OpenProcess( PROCESS_QUERY_INFORMATION ,
                                       FALSE, processID );
    Le pramaètre 1 de la fonction OpenProcess(...) peut être 1 parmi la liste suivante:
    PROCESS_ALL_ACCESS
    PROCESS_CREATE_PROCESS
    PROCESS_QUERY_INFORMATION
    ...
    La liste complète est citée ici sur ce lien msdn :


    http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	PHANDLE TokenHandle=NULL;
    	BOOL b=OpenProcessToken(hExplorerProcess, 
    							  TOKEN_READ,
    							  TokenHandle);
    Aussi pour la fonction OpenProcessToken(), le paramètre 2, peut être un parmi la liste suivante:

    La liste complète figure sur le lien suivant :http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

    3) J'ai un autre doute qui est, est ce que ça n'est valable que si j'exécute ça en compte SYSTEM ( par un service ou autre ...) mais c'est faible probable, car si c'était le cas, ça aurait dû être mentionné dans la doc de l'API

    je sais pas quoi faire >_<

  7. #7
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    Pour info, j'ai trouvé sur la doc de msdn que pour pouvoir ouvrir le token , il faut avoir( au minimum "à ce que j'ai compris" ) PROCESS_QUERY_INFORMATION et c'est bien ce que j'ai mis.
    La doc dit:
    C++

    BOOL WINAPI OpenProcessToken(
    __in HANDLE ProcessHandle,
    __in DWORD DesiredAccess,
    __out PHANDLE TokenHandle
    );

    Parameters

    ProcessHandle [in] A handle to the process whose access token is opened. The process must have the PROCESS_QUERY_INFORMATION access permission.
    mon code est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        HANDLE hExplorerProcess = OpenProcess( PROCESS_QUERY_INFORMATION ,
                                       FALSE, processID );
    Aussi, puisque le HANDLE est non NULL( comme j'ai cité en haut) donc normalement il est bon et la fonction OpenProcess() n'a pas échoué (mais peut être qu'elle a été appelé par un droit inférieur à ce qu'il lui faut..)

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Normalement, pour moi, si tu as accès au processus, tu devrais avoir accès au token.

    Donc, essaie d'ouvrir le token sans demander aucun droit dessus. Ainsi, on verra si le problème vient du handle de process (impossible d'ouvrir un token) ou du token (les droits demandés refusés)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre confirmé Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Donc, essaie d'ouvrir le token sans demander aucun droit dessus. Ainsi, on verra si le problème vient du handle de process (impossible d'ouvrir un token) ou du token (les droits demandés refusés)...
    Je sais pas déja comment faire pour ouvrir un token sans demander un droit dessus :red:
    Mais intuitivement j'ai mis NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BOOL b=OpenProcessToken(hExplorerProcess, 
    							  /*TOKEN_READ*/NULL,
    							  TokenHandle);
    même erreur ( b=0, GetLastError() retourne 998 )

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/09/2014, 11h51
  2. [AC-2010] Problème inattendu avec la fonction Choisir() dans QBE
    Par sellig60 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/08/2014, 13h27
  3. problème encontré avec la fonction mail
    Par pepelemoko dans le forum Langage
    Réponses: 3
    Dernier message: 12/05/2010, 15h49
  4. Probléme requête avec deux fonction SUM
    Par kamnouz dans le forum Requêtes
    Réponses: 2
    Dernier message: 08/04/2010, 16h29
  5. [AJAX] Ajax avec une fonction JS
    Par iwf-fr dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 26/09/2007, 19h25

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