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

VBScript Discussion :

HTA check AD + WSUS + Antivirus


Sujet :

VBScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut HTA check AD + WSUS + Antivirus
    Bonjour,

    je débute en vb et je suis en train de réaliser un script qui me permettrait d'avoir un état du parc informatique concernant la dernière connexion de l'ordinateur (renouvellement du canal sécurisé), la mise à jour des patches et l'état du poste vis à vis de l'antivirus.

    Jusqu'à présent, j'ai pu avancer sur la partie Active Directory et je peux détecter les postes qui n'ont pas renouvelé leur canal sécurisé depuis un certain temps. J'ai pu ainsi créer une procédure qui me permet de désactiver ces postes et de les déplacer dans une autre UO.


    J'aurai aimé savoir s'il était possible de me connecter directement à la base WSUS et d'avoir ainsi accès à des objets comme pour l'AD. Ces objets me permettraient d'obtenir les informations nécessaires et éventuellement agir sur les postes qui poseraient problème, qui ne seraient pas à jour de leurs patches.

    De même pour l'antivirus (j'utilise kaspersky).

    Merci par avance

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    bonjour,
    la classe wmi Win32_QuickFixEngineering énumère les patchs installés via le CBS http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    sinon peut-être ce script : http://msmvps.com/blogs/athif/archiv.../20/76035.aspx
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    merci beaucoup pour votre réponse.
    Le problème avec cette solution c'est que les ordinateurs doivent être allumés pour que je puisse interagir avec ces derniers et récupérer les éléments que je veux.

  4. #4
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    pour interagir avec la base de données seule, il y a la wsus api mais elle ne semble pas exploitable
    en vbs mais en .net : http://msdn.microsoft.com/en-us/library/ms825116
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Merci bien.
    Je vais essayer de voir ça. Je rencontre un autre problème concernant la première partie de mon projet, je suis amené à interroger l'AD via VB et à afficher un certain nombre d'informations concernant mes ordinateurs.
    Parmi ces ordinateurs, je veux démarquer ceux qui n'ont pas renouveler leur canal de sécurité depuis un certain temps. De plus, j'aimerai les désactiver et les déplacer dans une autre UO.
    J'ai trouvé les procédures qu'il me fallait pour réaliser la désactivation et le déplacement de l'ordinateur. J'ai réaliser une fonction "desactive" qui prend en paramètre le distinguishedName de l'ordinateur.

    dans mon code, j'ai donc quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub fonction1
    '....
     
    strTmp=objUser.distinguishedName
     
    txtEnregis = txtEnregis & "<input class='button' type='button' value='Désactiver' name='btnDesactive'  onClick='Desactive(strTmp)' >"
     
    End Sub 'fonction1
    La fonction1 génère donc un code html et dans cette portion de code, elle génère un bouton qui lorsqu'on clique sur ce bouton, va appeler la procédure Desactive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Desactive(var1)
     
    	set objUser2 = GetObject("LDAP://" & var1)
    	objUser2.AccountDisabled = True
    	objUser2.SetInfo
     
    	Set objNewOU = GetObject("LDAP://" & nwOU)
     
    	Set objMoveComputer = objNewOU.MoveHere("LDAP://" & var1, vbNullString)
     
    End Sub 'Desactive
    Mon problème et que supposons que j'ai 5 ordinateurs dans mon parc : o1, o2... o5.
    Supposons aussi que seuls o2 et o5 doivent être désactivés et déplacés.

    Sur ma page, pour o2 et o5 j'ai bien des boutons "Désactiver" mais lorsque je veux lancer désactive sur o2, c'est sur o5 que ça se déroule.

    Autres renseignements, pour appeler la fonction desactive(), je suis obligé de passer par une variable globale : strTmp.

    Donc je pense que le problème vient du fait que la variable soit globale mais c'est le seul moyen que j'ai trouvé pour ne serait ce qu'appeler la fonction désactive.
    Si j'essaie de passer directement "objUser.distinguishedName" en argument de fonction de Desactive, je rencontre un message d'erreur.

    Merci pour votre aide

  6. #6
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    difficile de répondre puisqu'on ne sait pas comment est appelée fonction1
    mais il faut, lors de cet appel, que l'objet objUser soit défini sur le bon poste
    si une énumération a été faite, l'objUser pointera toujours sur le dernier item de la liste et donc sur o5...
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  7. #7
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    fonction1 est appelé en cliquant sur un bouton.
    Elle parcourt un UO entièrement à l'aide d'une boucle "for each..." et affiche l'ensemble des informations des ordinateurs.
    Donc à chaque passage, objUser se positionne sur un ordinateur et renvoie les informations de cet ordinateur.

  8. #8
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    Elle parcourt un UO entièrement à l'aide d'une boucle "for each..."
    c'est bien ce que je disais, tu fais une énumération et donc cf mon message précédent
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  9. #9
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Oui mais au moment où je cré le bouton avec OnclicK='desactive(objUser.distinguisedName)', la valeur de l'argument doit valoir celle de l'objet en cours non ?
    Comment pourrais je appeler autrement la procédure desactive sinon ?
    y a t il un moyen de contourner le problème ?

  10. #10
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Suis je obligé de passer par une variable globale pour appeler la procédure desactive ?

  11. #11
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    mais au moment où je cré le bouton avec OnclicK='desactive(objUser.distinguisedName)', la valeur de l'argument doit valoir celle de l'objet en cours non ?
    justement non
    même si un bouton est créé pour chaque poste, la variable strTmp ne peut contenir qu'une valeur, celle existante
    au moment du click par l'utilisateur, et qui sera la dernière de la liste donc o5
    ton problème souligne très exactement la raison pour laquelle je trouve que le HTA n'est pas du tout adapté à l'écriture d'une GUI
    puisqu'il faut concilier une logique de création de page avec celle d'un langage impératif (voir ici).
    pour revenir à ton problème, peut-être un truc comme ça (non testé et sans garantie ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub fonction1
    '....
    strTmp(index)=objUser.distinguishedName
     
    txtEnregis = txtEnregis & "<input class='button' type='button' value='Désactiver' name='btnDesactive'  onClick='Desactive(strTmp(" & chr(index + 48) & "))' >"
     
    End Sub 'fonction1
    où index est le rang du poste énuméré (maxi 9 évidemment)
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  12. #12
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord merci pour ton aide.
    Je comprends qu'elle ne peut contenir que la dernière valeur mais ce que je ne comprends pas c'est pourquoi je ne peux créer un bouton avec la valeur que je veux, je m'explique :
    quand je parcours ma boucle, à l'instant t, objUser pointera sur ordinateur-t. Quand je crée le bouton html, je ne fais que créer un string après tout :
    # txtEnregis = txtEnregis & "<input class='button' type='button' value='Désactiver' name='btnDesactive' onClick='Desactive(strTmp)' >"

    Et au moment où je crée ce string, pourquoi je ne peux pas passer en argument de la fonction objUser.distinguishedName directement. En effet, à ce moment, objUser.distinguishedName me renvoie précisément le distinguished name de l'ordinateur-t.... Ce n'est qu'une chaîne de caractères qui sera interprétée après seulement non ? Mon raisonnement est erroné ?

    Autres questions SVP :
    dans la solution que tu m'as proposé, c'est quoi la nature de la variable strTmp ? Il semblerait que ça soit un tableau.
    index serait un entier que j'incrémente ?
    Pourquoi dois je faire "strTmp(" & chr(index + 48) & ")" ?

    Désolé pour mon ignorance^^ et merci par avance

  13. #13
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    Mon raisonnement est erroné ?
    oui, parce que tu confonds la définition d'une fonction et son appel.
    au stade de la création du bouton html, la fonction Desactive est définie et ses arguments sont alors nécessairement des noms de variables et non des valeurs.
    ce qui est trompeur dans la conception d'un hta, c'est qu'on peut allégrement mélanger les deux et ton script en est la parfaite démonstration.
    c'est pourquoi la définition de chaque bouton doit contenir un nom de variable différent
    c'est quoi la nature de la variable strTmp ? Il semblerait que ça soit un tableau.
    oui, le + simple est de définir un tableau dont les limites sont fixées en fonction du nombre de postes existants.
    la variable index correspond au rang du poste courant lors de l'énumération (base 0)
    Pourquoi dois je faire "strTmp(" & chr(index + 48) & ")" ?
    cela permet de définir par bouton un nom de variable tableau différent - chr(index + 48) renvoie le caractère "0" pour index = 0 et ainsi de suite jusqu'à 9
    bricolage un peu scabreux mais qui peut marcher si les vars tableau sont acceptées en paramètre
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  14. #14
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Merci pour ces précisions.
    J'essaierai de les appliquer mardi car là je suis en week end ^^
    Autre question STP, je n'ai pas pu bosser dessus aujourd'hui et je n'ai pas eu le temps de vérifier le forum mais j'ai réfléchi à une autre solution : au lieu de créer à chaque fois un bouton, je crée un checkbox.
    Du coup, j'ai quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "<input type='checkbox' id='idCheck' "& i &" value='false' name="& objUser.distinguishedName & ">
    La variable i est une variable locale de fonction1 lors qui s'incrémente.
    A la fin, j'utilise une variable globale cpt qui prend la valeur de i.

    Ensuite je crée un bouton qui lorsque je clique dessus devrait faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for n=1 to cpt 
        If idCheck & n.value = true then
             set objUser2 = GetObject("LDAP://" & idCheck & n.name)
    	objUser2.AccountDisabled = True
    	objUser2.SetInfo
    	
    	Set objNewOU = GetObject("LDAP://" & nwOU)
     
    	Set objMoveComputer = objNewOU.MoveHere("LDAP://" & var1, vbNullString)
    Next
    En français, je parcours l'ensemble des checkbox afin de vérifier s'ils sont cochés et si c'est le cas, je récupère le distinguished Name de l'ordinateur associé que j'ai stocké dans l'attribut "name" du checkbox afin de le désactiver et de le déplacer.
    Je n'ai pas pu tester cette solution mais j'ai un gros doute concernant idCheck & n..
    Les différents éléments html sont accessibles directement en utilisant leur attribut id : si dans mon code html, j'ai un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span id='idSpan'> </span>
    Si je veux modifier ce span, je peux par exemple faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     idSpan.innerHTML="toto"
    A ce moment, je veux faire la même chose pour mes checkbox. Je veux les atteindre à partir de leur "id" mais je ne sais pas comment les parcourir sachant qu'ils auront pour id un truc du genre idCheck"i" où i est un entier....
    Je ne sais pas si j'ai été clair...
    Merci par avance

  15. #15
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    je crois que tu te compliques la vie
    surtout que tu as raison d'avoir de gros doutes...
    mais j'ai un gros doute concernant idCheck & n..
    le + simple serait de rester avec des boutons mais de définir l'attribut name avec objUser.distinguishedName
    ensuite il me semble bien qu'en vbs les événements ne recoivent pas de paramètres mais peuvent appeler l'objet event.
    quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "<input class='button' type='button' value='Désactiver' name='" & objUser.distinguishedName & "'  onClick='Desactive()' >"
    function Desactive()
    MyDistinguishedName = window.event.srcElement.name
    end function
    sans garantie, ça fait quelques années que je n'ai pas fait de dhtml
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  16. #16
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonjour,


    alors, j'ai opté pour une autre solution.
    J'utilise un tableau déclaré en variable globale.
    Je stocke le distinguished Name de chaque ordinateur dans ce tableau et j'ai quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "
    strTmp(i)=objUser.distinguishedName
    <input type='checkbox' id="& strTmp(i) &" value='false'>
    Ensuite j'ai créé un bouton qui lorsqu'on clique dessus appelle la fonction désactive.
    Cette fonction fait quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for i=0 to cpt-1
    Set el = document.getElementById(strTmp(i))
    If (el.isChecked) then 
            set objUser2 = GetObject("LDAP://" & strTmp(i))
    	objUser2.AccountDisabled = True
    	objUser2.SetInfo
     
    	Set objNewOU = GetObject("LDAP://" & nwOU)
     
    	Set objMoveComputer = objNewOU.MoveHere("LDAP://" & strTmp(i), vbNullString)
    End if
    La fonction a pour but de parcourir l'ensemble des checkbox et de tester si ils sont cochés. Si c'est le cas, je fais ce que j'ai à faire

    J'ai à peine eu le temps de tester mais il semblerait que c'est une solution qui marche.

    En revanche, je n'ai pris connaissance de ta réponse que maintenant et elle me parait fort intéressante. Si je peux, je vais essayer de la tester juste pour voir un peu tout ce que peut me proposer vbs...
    Merci à toi de m'orienter vers d'autres horizons

    Aurais tu d'autres idées pour exploiter la base wsus mis à part vb net stp ?

  17. #17
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    Aurais tu d'autres idées pour exploiter la base wsus mis à part vb net stp ?
    aucune, c'est une question régulièrement posée sur les forums anglophones
    et la réponse est toujours la même - wsus n'a pas d'interface com scriptable
    .net est la seule solution
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  18. #18
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Arg... merci quand même...
    Je n'y connais absolument rien en .net
    Je vais voir comment je peux faire

Discussions similaires

  1. Comment on remplace un check ?
    Par Nout dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/07/2003, 11h20
  2. Check sur une colonne de table "en cours"
    Par in dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/07/2003, 09h47
  3. checking de connexion
    Par JEG dans le forum Développement
    Réponses: 4
    Dernier message: 09/10/2002, 13h36
  4. [propriétés]Option Checked
    Par psl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/08/2002, 08h07
  5. Check Url pour savoir si erreur 404 ou si le site existe
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/08/2002, 13h49

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