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

  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
    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.

  8. #8
    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 )

  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
    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..)

  10. #10
    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
    Si tu ne peux même pas l'ouvrir avec zéro droits, c'est vraiment bizarre.
    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.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 494
    Par défaut
    De mes vagues souvenirs, le compte administrateur n'a pas tous les droits pour l'ouverture d'un token, mais peut se donner les droits.

    Vérifiez dans la doc s'il ne faut pas appeler une autre primitive pour se donner les droits avant de faire l'OpenProcessToken.

  12. #12
    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 bacelar Voir le message
    De mes vagues souvenirs, le compte administrateur n'a pas tous les droits pour l'ouverture d'un token, mais peut se donner les droits.

    Vérifiez dans la doc s'il ne faut pas appeler une autre primitive pour se donner les droits avant de faire l'OpenProcessToken.
    Merci pour l'indication, je vais creuser la dessus

    Autre chose, je compte lancer ce programme en compte SYSTEM, et quand je l'ai essayé aussi en traçant le retour de GetLastError() dans un fichier , ça donne la même chose
    Aussi quand j'essais d'obtenir un HANDLE sur un processus autre que "explorer.exe" telsque "msn.exe" , "firefox.exe" qui sont propriétaire de l'utilisateur Administrateur ( car je me suis dit peut être que le processus "explorer.exe" a des droits spécifiques pour le manipuler ) , ça marche pas aussi >_<

  13. #13
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Salut tout le monde.
    J'ai juste le temps de faire une lecture en diagonale de cette discussion avant-midi, et à ce que j'ai compris, il y a un problème pour interroger un token.
    En fait, pour cela il faut d'abord créer un jeton d'accès, par duplication (impersonate token). Dans le code, ce mode d'accès pourrait se traduire par TOKEN_DUPLICATE | TOKEN_QUERY

  14. #14
    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 maxim_um Voir le message
    En fait, pour cela il faut d'abord créer un jeton d'accès, par duplication (impersonate token). Dans le code, ce mode d'accès pourrait se traduire par TOKEN_DUPLICATE | TOKEN_QUERY

    salut maxim_um
    Merci de donner plus de détail car j'ai pas bien saisi ta proposition, mais intuitivement j'ai essayé de remplacer le "DesiredAccess" par ce que t'as proposé dans mon code en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PHANDLE TokenHandle=NULL;
    	BOOL b=OpenProcessToken(hExplorerProcess, TOKEN_DUPLICATE | TOKEN_QUERY, TokenHandle);
    	
        DWORD d2=GetLastError();
    Résultat pareil , b=0, d2=998

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 494
    Par défaut
    AdjustTokenPrivileges
    http://msdn.microsoft.com/en-us/libr...02(VS.85).aspx

    OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,FALSE, &hToken))

    AdjustTokenPrivileges(hToken,....

  16. #16
    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 bacelar Voir le message
    AdjustTokenPrivileges
    http://msdn.microsoft.com/en-us/libr...02(VS.85).aspx

    OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,FALSE, &hToken))

    AdjustTokenPrivileges(hToken,....
    merci pour le lien, je l'ai déja vu cette fonction
    Sauf que ça parle de l'ajustement des droits sur un token valide

    The AdjustTokenPrivileges function enables or disables privileges in the specified access token. Enabling or disabling privileges in an access token requires TOKEN_ADJUST_PRIVILEGES access.
    Syntax
    C++

    BOOL WINAPI AdjustTokenPrivileges(
    __in HANDLE TokenHandle,
    __in BOOL DisableAllPrivileges,
    __in_opt PTOKEN_PRIVILEGES NewState,
    __in DWORD BufferLength,
    __out_opt PTOKEN_PRIVILEGES PreviousState,
    __out_opt PDWORD ReturnLength
    );
    Mon problème n'est pas du tout à ce niveau, j'arrive même pas à récupérer un HANDLE valide sur le token, il est encore à NULL après l'appel de la fonction
    PHANDLE TokenHandle=NULL;
    BOOL b=OpenProcessToken(hExplorerProcess, TOKEN_DUPLICATE | TOKEN_QUERY, TokenHandle);
    ==>
    TokenHandle = 0x00000000
    voilà le contenu du Handle, donc je peux pas l'ajuster en le passant comme paramètre __in , tu vois ?

  17. #17
    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
    Ce que bacelar propose, c'est de modifier ton propre token, pour activer un privilège dont l'utilisateur (ici, SYSTEM, si j'ai bien compris) dispose.

    Par exemple, le privilège Debug (SE_DEBUG_NAME), qui permet d'ouvrir n'importe quel processus de n'importe quel utilisateur, avec les droits qu'on veut.
    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.

  18. #18
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 494
    Par défaut
    GetCurrentThread()
    C'est le token du thread courant, pas celui que tu veux ouvrir.
    On se donne (on donne au thread courant) le droit d'ouvrir un token, n'importe quel token.

  19. #19
    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
    Ce que bacelar propose, c'est de modifier ton propre token, pour activer un privilège dont l'utilisateur (ici, SYSTEM, si j'ai bien compris) dispose.

    Par exemple, le privilège Debug (SE_DEBUG_NAME), qui permet d'ouvrir n'importe quel processus de n'importe quel utilisateur, avec les droits qu'on veut.
    Merci pour cette info, j'ai commencé à essayer ça avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int _tmain(int argc, _TCHAR* argv[])
    {
    	PHANDLE hToken=NULL;
    HANDLE hCThread=GetCurrentThread();
    	BOOL b1=OpenThreadToken(hCThread,TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,FALSE, hToken);
    	DWORD d1=GetLastError();
    .....
    Je lance ce code( cet exécutable en faite) sous le compte SYSTEM en traçant le résultat de GetLastError() dans un fichier, alors malgrès que le hCThread est valide, je reçois encore le même problème : b1=0, d1=998

    PS: je lance l'exe en compte SYSTEM en utilisant PsTools et aussi à partir d'un service que j'ai développé et qui tourne sous le compte SYSTEM. => même résultat

  20. #20
    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 bacelar Voir le message
    GetCurrentThread()
    C'est le token du thread courant, pas celui que tu veux ouvrir.
    On se donne (on donne au thread courant) le droit d'ouvrir un token, n'importe quel token.
    Oui, merci pour l'explication

    mais comme j'ai cité à Médinoc, ça échoue l'appel de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOL b1=OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,FALSE, hToken);
    sous le compte SYSTEM >_<

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