Soyez le premier à donner votre avis sur cette source.
Vue 6 169 fois - Téléchargée 665 fois
''/*****************************************************************************/ '/*** utilitaire réseau permettant de: '/*** rechercher et selectionner des ordinateurs du réseau, '/*** les démarrer, les arreter, les redemarrer '/*** détecter s'ils sont allumé et qui est connecté '/*** recupérer / mettre à jour l'adresse mac des postes '/*** '/*** NB: Il va sans dire que cet utilitaire doit êtres lancé par un compte administrateur du domaine '/*** Pour le démarrage des postes j'utilise l'utilitaire WolCmd.exe téléchargeable sur www.depicus.com '/*****************************************************************************/ 'variables à modifier suivant votre config MacNameFile="" 'Chemin du fichier contenant tous les noms de machines du réseau. Si MacNameFile="" MacNameFile sera initialisé à [repwork]\mac-name.txt CastIp="10.130.255.255" 'cast ip du réseau pour démarrage pc ' Avant d'utiliser ce programme, il convient tout d'abord de créer manuellement ' le fichier mac-name.txt de la manière suivante: ' Chaque ligne comporte au minimum 2 champs: champ1;champ2;champ3;etc... ' champ1 correspond à l'adresse mac ' champ2 correspond au nom du pc ' champ3;etc correspond à des champs que vous pouvez rajouter pour d'autre prog partageant le même fichier ' NB: champ1 peut être vide car cet utilitaire permet de récupérer l'adresse mac d'un pc. ' Par exemple vous pouvez marquer dans le fichier: ' ;NomPoste1; ' 00188B06C3A4;NomPoste2; ' 00188B06C3A4;NomPoste3;192.168.1.10;255.255.255.0;192.168.1.1; ' ...etc ' Dans ActiveDirectory, il est possible d'exporter dans un fichier tous les noms des PC du domaine ' Il serait aussi possible d'intégrer dans ce script une détection des postes du domaine mais je ne suis pas sûr que le jeu en vaille la chandelle On error resume next Const wbemFlagReturnImmediately = &h10 Const wbemFlagForwardOnly = &h20 Const Overwrite = True Const ForReading = 1 Const ForWriting = 2 Const Green="#008000" Const Red="#FF0000" Const Black="#000000" Const Gray="#CCCCCC" Dim shell, IE ' tableau pouvant contenir jusqu'à 500 lignes (à modifier suivant le nbre de pc) Dim MacName(500, 4) '1:mac(1ier champ) 2:name(2ème champ) 3:MajMac(réservé maj mac) 4:tous les champs restants Dim Inversion(500) 'contient le liste des index à inverser dim PcSearch(500, 4) '1:indexMacName 2:selected 3:couleur affichage 4:username/mac Set shell = WScript.CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") strComputer = "." SelectedClass="" SelectedStudent="" textsearch="" RepWork = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\")-1) if trim(MacNameFile)="" then MacNameFile=RepWork & "\mac-name.txt" 'Charge tableau MacName err.clear() Set objfile = objFSO.OpenTextFile(MacNameFile, ForReading) if err.number<>0 then MsgBox "Erreur d'ouverture du fichier '" & MacNameFile & "'." & vbCrLf & "Veuillez vérifier que le fichier existe et qu'il soit accessible.", vbCritical + vbOkOnly + vbSystemModal + 0,"Erreur ouverture fichiers" wscript.quit end if NbrePc=0 Do Until objfile.AtEndOfStream line=trim(objfile.ReadLine) MacName(NbrePc+1, 1)=trim(GetField(1, line, ";")) MacName(NbrePc+1, 2)=trim(GetField(2, line, ";")) MacName(NbrePc+1, 3)="" if MacName(NbrePc+1, 2)<>"" then index=GetIndexField(3, line, ";", 0) if index>0 and index<=len(line) then MacName(NbrePc+1, 4)=mid(line, index) NbrePc=NbrePc+1 end if loop objfile.close NbrePcSearch=0 ' tri du tableau MacName + détection doublon err=tritab() if (err and 7)<>0 then ListingErr="Avertissement: le fichier '" & MacNameFile & "' contient des doublons:" & vbCrLf if (err and 1)<>0 then ListingErr=ListingErr & " /*** ligne(s) strictement identique(s) ***/" & vbCrLf if (err and 2)<>0 then ListingErr=ListingErr & " /*** ligne(s) contenant la même adresse MAC et un nom de pc différent ***/" & vbCrLf ListingErr=ListingErr & "Tous les doublons ont été supprimés. Voulez vous sauvegarder les modification?" err=MsgBox(ListingErr, vbQuestion + vbYesNo + vbSystemModal + 0,"Enregistrer les modifications dans le fichier?") if err=vbyes then 'sauvegarde le fichier if SavMacName()=true then MsgBox "Le fichier '" & MacNameFile & "' a été mis à jour. ", vbInformation + vbOkOnly + vbSystemModal + 0,"Sauvegarde fichier" else MsgBox "Erreur de mise à jour du fichier '" & MacNameFile & "'.", vbCritical + vbOkOnly + vbSystemModal + 0,"Sauvegarde fichier" end if end if end if 'Lancement ie + affichage postes OpenIE() shell.AppActivate "Gestionnaire d'ordinateurs" AffichePageWeb "startpc.htm" RazEtatPc=false do StartTime = Timer do WScript.Sleep 30 action=GetActionPageWeb() if RazEtatPc=true then 'le username de chaque pc est affiché difftime=Timer-StartTime if difftime>60 then ' affichage du username pendant un labs de temps max de 60s (durée de validité de l'info) for i=1 to NbrePcSearch PcSearch(i, 3)=Black PcSearch(i, 4)="" next RazEtatPc=false AffichePageWeb "startpc.htm" end if end if Loop While (action = "off") if action="demarrer" or action="arreter" or action="redemarrer" or action="macadress" then for i=1 to NbrePcSearch execute "IsChecked=IE.Document.SelectionForm.cac_" & i & ".Checked" if IsChecked then PcSearch(i, 2)=true else PcSearch(i, 2)=false PcSearch(i, 3)=Gray PcSearch(i, 4)="" next AffichePageWeb "startpc.htm" StartTime = Timer if action="demarrer" then if objFSO.FileExists(RepWork & "\wolcmd.exe") then for i=1 to NbrePcSearch if PcSearch(i, 2) and MacName(PcSearch(i, 1), 1)<>"" then commande=RepWork & "\wolcmd " & MacName(PcSearch(i, 1), 1) & " " & CastIp & " " & CastIp Shell.Run commande, 0, 0 Wscript.Sleep 300 Shell.Run commande, 0, 0 Wscript.Sleep 300 Shell.Run commande, 0, 0 PcSearch(i, 3)=Black difftime=Timer-StartTime if difftime>2 then StartTime = Timer : AffichePageWeb "startpc.htm" end if next else MsgBox "Impossible de lancer le démarrage des postes. " & vbCrLf & "Le fichier 'WolCmd.exe' n'a pas été trouvé dans le dossier de l'application." & vbCrLf & "Vous pouvez le télécharger sur <www.depicus.com>.",vbCritical + vbOkOnly + vbSystemModal + 0,"Fichier introuvable" end if end if if action="arreter" or action="redemarrer" then for i=1 to NbrePcSearch if PcSearch(i, 2) then if action="arreter" then commande="shutdown -s -f -m \\" & MacName(PcSearch(i, 1), 2) if action="redemarrer" then commande="shutdown -r -f -m \\" & MacName(PcSearch(i, 1), 2) Shell.Run commande, 0, 0 PcSearch(i, 3)=Black difftime=Timer-StartTime if difftime>2 then StartTime = Timer : AffichePageWeb "startpc.htm" end if next end if if action="macadress" then IE.Document.Script.SetVal("off") NewMac=false for i=1 to NbrePcSearch if PcSearch(i, 2) then if PcIsOn(MacName(PcSearch(i, 1), 2)) then MacTemp=GetMacAdress(MacName(PcSearch(i, 1), 2)) if MacTemp="" then PcSearch(i, 3)=red PcSearch(i, 4)="[NotAccess]" else if MacTemp=MacName(PcSearch(i, 1), 1) then PcSearch(i, 3)=green PcSearch(i, 4)="[" & MacTemp & "]" else PcSearch(i, 3)=red PcSearch(i, 4)="new[**" & MacTemp & "**]" MacName(PcSearch(i, 1), 3)=MacTemp NewMac=true end if end if else PcSearch(i, 3)=red PcSearch(i, 4)="[OffLine]" end if end if if GetActionPageWeb()<>"off" then ret=MsgBox("Arrêter le traitement?", vbQuestion + vbYesNo + vbSystemModal + 0,"Arrêt traitement") if ret=vbyes then exit for end if difftime=Timer-StartTime if difftime>2 then StartTime = Timer : AffichePageWeb "startpc.htm" next end if AffichePageWeb "startpc.htm" if NewMac=true then ret=MsgBox("De nouvelles adresses Mac ont été trouvées. Mettre à jour le fichier mac-name.txt?", vbQuestion + vbYesNo + vbSystemModal + 0,"Enregistrer les MacAdress?") if ret=vbyes then if SavMacName()=true then for i=1 to NbrePc if MacName(i, 3)<>"" then MacName(i, 1)=MacName(i, 3) : MacName(i, 3)="" next MsgBox "Le fichier '" & MacNameFile & "' a été mis à jour. ", vbInformation + vbOkOnly + vbSystemModal + 0,"Sauvegarde MacAdress" else MsgBox "Erreur de mise à jour du fichier '" & MacNameFile & "'.", vbCritical + vbOkOnly + vbSystemModal + 0,"Sauvegarde MacAdress" end if end if end if end if if action="rechercher" then NbrePcSearch=0 textsearch=trim(IE.Document.SelectionForm.textsearch.value) if textsearch<>"" then for i=1 to NbrePc if IsFind(MacName(i, 2), textsearch) then NbrePcSearch=NbrePcSearch+1 PcSearch(NbrePcSearch, 1)=i 'index MacName PcSearch(NbrePcSearch, 2)=true 'case à cocher=ON PcSearch(NbrePcSearch, 3)=Black 'pc ON(green), OFF(red), UNKNOW(black) PcSearch(NbrePcSearch, 4)="" 'username end if next end if AffichePageWeb "startpc.htm" end if if action="rechercherinv" then for i=1 to 500 Inversion(i)=true next for i=1 to NbrePcSearch Inversion(PcSearch(i, 1))=false next NbrePcSearch=0 for i=1 to NbrePc if Inversion(i)=true then NbrePcSearch=NbrePcSearch+1 PcSearch(NbrePcSearch, 1)=i 'index MacName PcSearch(NbrePcSearch, 2)=true 'case à cocher=ON PcSearch(NbrePcSearch, 3)=Black 'pc ON ou OFF PcSearch(NbrePcSearch, 4)="" 'username end if next AffichePageWeb "startpc.htm" end if if action="supprimer" then j=0 for i=1 to NbrePcSearch execute "IsChecked=IE.Document.SelectionForm.cac_" & i & ".Checked" if not IsChecked then j=j+1 if j<>i then PcSearch(j, 1)=PcSearch(i, 1) 'index MacName PcSearch(j, 2)=PcSearch(i, 2) 'case à cocher=ON PcSearch(j, 3)=PcSearch(i, 3) 'pc ON ou OFF PcSearch(j, 4)=PcSearch(i, 4) 'username end if end if next NbrePcSearch=j AffichePageWeb "startpc.htm" end if if action="inverser" then for i=1 to NbrePcSearch execute "IsChecked=IE.Document.SelectionForm.cac_" & i & ".Checked" if IsChecked then PcSearch(i, 2)=false else PcSearch(i, 2)=true next AffichePageWeb "startpc.htm" end if if action="actualiser" then for i=1 to NbrePcSearch execute "IsChecked=IE.Document.SelectionForm.cac_" & i & ".Checked" if IsChecked then PcSearch(i, 2)=true else PcSearch(i, 2)=false PcSearch(i, 3)=Gray PcSearch(i, 4)="" next AffichePageWeb "startpc.htm" IE.Document.Script.SetVal("off") StartTime = Timer for i=1 to NbrePcSearch if PcSearch(i, 2)=true then if PcIsOn(MacName(PcSearch(i, 1), 2)) then PcSearch(i, 3)=green PcSearch(i, 4)="[" & getusername(MacName(PcSearch(i, 1), 2)) & "]" if PcSearch(i, 4)="[]" then PcSearch(i, 4)="[NoUser]" else PcSearch(i, 3)=red PcSearch(i, 4)="[OffLine]" end if if GetActionPageWeb()<>"off" then ret=MsgBox("Arrêter le traitement?", vbQuestion + vbYesNo + vbSystemModal + 0,"Arrêt traitement") if ret=vbyes then exit for end if difftime=Timer-StartTime if difftime>2 then StartTime = Timer : AffichePageWeb "startpc.htm" end if next AffichePageWeb "startpc.htm" RazEtatPc=true end if err.clear() IE.Document.Script.SetVal("off") if err.number<>0 then exit do Loop exitprog() '------------------------------------------------------------ ' Fonction de tri du tableau MacName(); renvois code erreur: ' si 2 lignes du tableau sont strictement identiques -> TriTab|=1 ' si 2 lignes du tableau contiennent les mêmes adresses mac -> TriTab|=2 Function TriTab() TriTab=0 : ii=1 while ii<NbrePc jj=ii+1 while jj<=NbrePc 'tri du tableau ordre croissant if MacName(jj, 2)<MacName(ii, 2) then 'permute les lignes MacName(NbrePc+1, 1)=MacName(ii, 1) : MacName(NbrePc+1, 2)=MacName(ii, 2) : MacName(NbrePc+1, 4)=MacName(ii, 4) MacName(ii, 1)=MacName(jj, 1) : MacName(ii, 2)=MacName(jj, 2) : MacName(ii, 4)=MacName(jj, 4) MacName(jj, 1)=MacName(NbrePc+1, 1) : MacName(jj, 2)=MacName(NbrePc+1, 2) : MacName(jj, 4)=MacName(NbrePc+1, 4) end if 'recherche et suppression des incohérences: mac en double if MacName(jj, 1)=MacName(ii, 1) then 'codage erreur if MacName(jj, 2)=MacName(ii, 2) then TriTab=TriTab or 1 else TriTab=TriTab or 2 'suppression ligne for kk=jj+1 to NbrePc MacName(kk-1, 1)=MacName(kk, 1) MacName(kk-1, 2)=MacName(kk, 2) MacName(kk-1, 4)=MacName(kk, 4) next NbrePc=NbrePc-1 else jj=jj+1 end if wend ii=ii+1 wend end function '------------------------------------------------------------ ' Fonction d'affichage de la page web [pageweb) Function AffichePageWeb(pageweb) On error resume next NbreColonnes=6 err.clear() Set objPageWeb = objFSO.OpenTextFile(RepWork & "\" & pageweb, ForReading) if err.number<>0 then MsgBox "Erreur d'ouverture de fichier." & vbCrLf & "Veuillez vérifier que le fichier '" & RepWork & "\" & pageweb & "' est accessible.", vbCritical + vbOkOnly + vbSystemModal + 0,"Erreur ouverture fichiers" exitprog() end if IE.document.Open Do Until objPageWeb.AtEndOfStream line=trim(objPageWeb.ReadLine) if line<>"" then IE.document.Writeln(line) if line="<!--inserrer ici la liste des PC-->" then 'insertion du code html pour affichage sélection pc NbreLigne=int(NbrePcSearch/NbreColonnes) if NbreLigne*NbreColonnes<NbrePcSearch then NbreLigne=NbreLigne+1 for ii=1 to NbreLigne ligne="<tr>" IE.document.Writeln(ligne) for jj=1 to NbreColonnes IndexTabSearch=(ii-1)*NbreColonnes+jj if IndexTabSearch>NbrePcSearch then exit for if PcSearch(IndexTabSearch, 2) then selected="checked" else selected="" if PcSearch(IndexTabSearch, 4)<>"" then strusername="<br>" & PcSearch(IndexTabSearch, 4) else strusername="" ligne="<td width='10%'><input type='checkbox' name='cac_" & IndexTabSearch & "' value='ONOFF' " & selected & "><font color='" & PcSearch(IndexTabSearch, 3) & "' size='2'>" & MacName(PcSearch(IndexTabSearch, 1), 2) & strusername & "</font></td>" IE.document.Writeln(ligne) next ligne="</tr>" IE.document.Writeln(ligne) next end if end if loop IE.document.Close objPageWeb.Close IE.Document.SelectionForm.textsearch.value=textsearch end function '------------------------------------------------------------ ' Fonction d'arret du script Function exitprog() on error resume next IE.Quit Set IE = Nothing wscript.quit end function '------------------------------------------------------------ ' Fonction ouverture IE Function OpenIE() Set IE = WScript.CreateObject("InternetExplorer.Application", "IE_") With IE .left=0 .top=0 .height=740 .width=1024 .menubar=0 .toolbar=0 .statusBar=0 .navigate "About:Blank" .visible=1 End With ' Attendre la fin du chargement de IE Do while IE.busy loop end function '------------------------------------------------------------ ' fonction retournant la valeur du n ième champ(NumField) d'une variable chaine de caractaires(ligne) function GetField(NumField, ligne, separateur) 'verification et init variables GetField="" if separateur="" then separateur=";" if NumField<1 then exit function if trim(ligne)="" then exit function OutOfRange=len(ligne)+1 'traitement ii=0 : IndexLigneFin=0 do 'init variables ii=ii+1 IndexLigneDeb=IndexLigneFin IndexLigneFin=OutOfRange ' recherche IndexLigneFin for sep=1 to len(separateur) 'traite multi séparateur ex: separateur=":;/" équivalent à separateur=":" OU separateur=";" OU separateur="/" IndexLigneFinTemp = Instr(IndexLigneDeb+1, ligne, mid(separateur, sep, 1)) if IndexLigneFinTemp>0 and IndexLigneFinTemp<IndexLigneFin then IndexLigneFin=IndexLigneFinTemp next if IndexLigneFin=OutOfRange then exit do loop until ii=NumField if ii=NumField then if IndexLigneDeb=0 then IndexLigneDeb=1 else IndexLigneDeb=IndexLigneDeb+1 IndexLigneFin=IndexLigneFin-1 if IndexLigneFin>=IndexLigneDeb then GetField=mid(ligne, IndexLigneDeb, IndexLigneFin-IndexLigneDeb+1) end if end function '------------------------------------------------------------ ' fonction retournant l'index de départ ou de fin(DepFin) du N ième champ(NumField) d'une variable chaine de caractaires(ligne) ' DepFin=0 -> recherche index départ sinon recherche index Fin function GetIndexField(NumField, ligne, separateur, DepFin) 'verification et init variables GetIndexField=-1 if separateur="" then separateur=";" if NumField<1 then exit function if trim(ligne)="" then exit function OutOfRange=len(ligne)+1 'traitement ii=0 : IndexLigneFin=0 do 'init variables ii=ii+1 IndexLigneDeb=IndexLigneFin IndexLigneFin=OutOfRange ' recherche IndexLigneFin for sep=1 to len(separateur) 'traite multi séparateur ex: separateur=":;/" équivalent à separateur=":" OU separateur=";" OU separateur="/" IndexLigneFinTemp = Instr(IndexLigneDeb+1, ligne, mid(separateur, sep, 1)) if IndexLigneFinTemp>0 and IndexLigneFinTemp<IndexLigneFin then IndexLigneFin=IndexLigneFinTemp next if IndexLigneFin=OutOfRange then exit do loop until ii=NumField if ii=NumField then if IndexLigneDeb=0 then IndexLigneDeb=1 else IndexLigneDeb=IndexLigneDeb+1 IndexLigneFin=IndexLigneFin-1 if IndexLigneFin>=IndexLigneDeb then if StartEnd=0 then GetIndexField=IndexLigneDeb else GetIndexField=IndexLigneFin end if end if end function '------------------------------------------------------------ ' retourne true si ping ok sinon retourne false function PcIsOn(strpc) Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}!\\").ExecQuery("select * from Win32_PingStatus where address = '" & strpc & "'") PcIsOn=false For Each objStatus in objPing If objStatus.Statuscode = 0 Then PcIsOn=true : exit function next end function '------------------------------------------------------------ ' retourne true si la recherche strsearch composé de "|"(OR) et de "&"(AND) est trouvé dans strbase sinon retourne false ' ex: strsearch="pc1|pc2"; retourne true si la chaine "pc1" OU la chaine "pc2" est trouvé dans strbase ' strsearch="pc1&pc2"; retourne true si la chaine "pc1" ET la chaine "pc2" sont trouvées dans strbase ' strsearch="*"; retourne true function IsFind(strbase, strsearch) if strsearch="*" then IsFind=true : exit function kk=1 : IsFind=false do str2search=trim(GetField(kk, strsearch, "|&")) 'récupération du kk ième champs if str2search="" then exit do operator="" if kk>1 then operator=mid(strsearch, GetIndexField(kk, strsearch, "|&", 0)-1, 1) 'récupération du kk ième opérateur if operator="" then 'donc dernier champs de strsearch if Instr(1, strbase, str2search)>0 then IsFind=true else IsFind=false end if if operator="|" and Instr(1, strbase, str2search)>0 then IsFind=true if operator="&" and Instr(1, strbase, str2search)=0 then IsFind=false kk=kk+1 loop end function '------------------------------------------------------------ ' retourne le username du compte connecté sur le pc OnThisPc function getusername(OnThisPc) getusername="" Set objWMIService = GetObject("winmgmts:\\" & OnThisPc & "\root\CIMV2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly) For Each objItem In colItems getusername=trim(objItem.UserName) next end function '------------------------------------------------------------ ' retourne l'adresse mac du pc OnThisPc function GetMacAdress(OnThisPc) on error resume next GetMacAdress="" Err.clear() set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & OnThisPc).ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE") If Err.Number<>0 Then exit function for each IPConfig in IPConfigSet mtemp=trim(IPConfig.MACAddress) Next for ii=1 to len(mtemp) 'retrait des ':' char=mid(mtemp, ii, 1) if char<>":" then GetMacAdress=GetMacAdress & char next End function '------------------------------------------------------------ ' Sauvegarde du tableau MacName() dans le fichier [MacNameFile] function SavMacName() on error resume next SavMacName=false 'ouverture fichier temporaire [MacNameFile].tmp err.clear() if objFSO.fileExists(MacNameFile & ".tmp") then objFSO.deleteFile(MacNameFile & ".tmp") Set objWriteFile = objFSO.OpenTextFile(MacNameFile & ".tmp", ForWriting, True) if err.number<>0 then exit function 'ecriture dans fichier [MacNameFile].tmp for xx=1 to NbrePc if MacName(xx, 3)<>"" then lignetemp=MacName(xx, 3) & ";" else lignetemp=MacName(xx, 1) & ";" lignetemp=lignetemp & MacName(xx, 2) & ";" if MacName(xx, 4)<>"" then lignetemp=lignetemp & MacName(xx, 4) objWriteFile.WriteLine(lignetemp) next objWriteFile.close 'cré 2 copies de sauvegarde: [MacNameFile].sav->[MacNameFile].sav.bak ' et [MacNameFile]->[MacNameFile].sav 'renome [MacNameFile].tmp->[MacNameFile] if err.number=0 then if objFSO.FileExists(MacNameFile & ".sav") then if objFSO.FileExists(MacNameFile & ".sav.bak") then objFSO.DeleteFile(MacNameFile & ".sav.bak") objFSO.MoveFile MacNameFile & ".sav" , MacNameFile & ".sav.bak" end if objFSO.MoveFile MacNameFile , MacNameFile & ".sav" err.clear() objFSO.MoveFile MacNameFile & ".tmp", MacNameFile if err.number=0 then SavMacName=true end if end function '------------------------------------------------------------ ' retourne l'action demandé par l'utilisateur function GetActionPageWeb() on error resume next err.clear() GetActionPageWeb=IE.Document.Script.CheckVal() if err.number<>0 then 'teste si IE est fermé WScript.Sleep 30 err.clear() IE.document.Open : IE.document.close if err.number<>0 then exitprog() else AffichePageWeb "startpc.htm" end if end function
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.