Ditributeur de fichiers en réseau

Signaler
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
-
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
-
Bonjour,

Je suis penché sur une application professionelle toute simple dont le but est de comparer les versions des programmes installés sur les pc cibles et installer la dernière version si ce n'est pas la bonne.

Le cahier des charges actuel est le suivant (en cours de modifications) :
   - se connecter à l'AD pour lister les pc du domaine (option que j'ai rajoutée car je savais le faire en VBS)
   - lister des fichiers (de type xls et mdb) dans des répertoires se trouvant sur le C des postes clients
   - lire les propriétés de ces fichiers en utilisant les DSO et afficher le numéro de version
   - comparer le numéro de version avec des fichiers de référence
   - installer sur les pc distants la dernière version
   - inscrire dans un log les pc qui ne sont pas à jour

Pour l'heure, j'ai essentiellement utilisé VBA et VBS car mes compétences en VB6 ou .NET ne sont pas suffisantes pour le faire. L'application est une macro Excel XP (qui tourne sous 2003-2007).

Pour lire les propriétés des fichiers, il faut télécharger et installer un add-on Microsoft qui s'appelle DSOFiles (http://support.microsoft.com/kb/224351), lequel donne des exemples en VB6 et VB7.

Voici le code qui liste les pc:

Dim args, oWinNT, oDomain
Dim Name
Set Shell = WScript.CreateObject("WScript.Shell")
domain="votre_domaine"
set oWinNT=GetObject("WinNT://" & domain)


Const ForReading 1, ForWriting 2
  Set WshShell = WScript.CreateObject("WScript.Shell")
   Dim fso, f
   Set fso = CreateObject("Scripting.FileSystemObject")
'fichier de sortie contenant la liste des pc de l'AD
 objOutFile = "C:\scripts\ADListR.txt"
    Set f = fso.OpenTextFile(objOutFile, ForWriting,true)
 for each oDomain in oWinNT
  if  lcase(oDomain.class)="computer" then
   Name = oDomain.name
   if lcase(Mid(Name, 1,3))="lap" or lcase(Mid(Name, 1,3))="pos" then
    f.writeline(Name)
   end if
  end if
 next


'--------------------------------------------------------------------
' Sous programme de test du moteur
Sub TestHost
dim rep
SW_SHOWNORMAL=1
strFullName =lcase(WScript.FullName)
strappli=lcase(Wscript.ScriptFullName)
i=InStr(1,strFullName,".exe",1)
j=InStrRev(strFullName,"",i,1)
strCommand=Mid(strFullName,j+1,i-j-1)
if strCommand<>"cscript" then
 rep=MsgBox("Ce script doit être lancé avec CSCRIPT" & VBCRLF & _
               "Cela peut être rendu permanent avec la commande" & VBCRLF & _
      "cscript //H:CScript //S /Nologo" & VBCRLF & _
      "Voulez-vous que ce soit fait automatiquement?", _
      vbYesNo + vbQuestion,strappli)
 if rep=vbYes  then
  nomcmd="setscript.bat"
  Set ficcmd = fso.CreateTextFile(nomcmd)
  ficcmd.writeline "@echo off"
  ficcmd.writeline "cscript //H:CScript //S /Nologo"
  ficcmd.writeline "pause"
  ficcmd.writeline chr(34) & strappli & chr(34)
  ficcmd.writeline "pause"
  ficcmd.close
  shell.Run nomcmd, SW_SHOWNORMAL,true
  end if
    WScript.Quit
 end if
end sub
'--------------------------------------------------------------------

Le code pour lister les fichiers sur les pc distants est le suivant :

On Error Resume Next


Set objExplorer = WScript.CreateObject _
    ("InternetExplorer.Application", "IE_")


' la liste des pc est un fichier html contenant une selectbox multiple
objExplorer.Navigate "[file:///C:\scripts\computer_list.htm file:///C:\scripts\computer_list.htm]"  
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 440
objExplorer.Height = 320
objExplorer.Visible = 1            


Do While (objExplorer.Document.Body.All.OKClicked.Value = "")
    Wscript.Sleep 100                
Loop


strComputers = objExplorer.Document.Body.All.OKClicked.Value
objExplorer.Quit
Wscript.Sleep 100


If strComputers = "Cancelled" Then
    Wscript.Quit
End If


arrComputers = Split(strComputers, ",")
 
 For Each strComputer in arrComputers
 '
 'Enumération des fichiers sur disks NTFS
 '
 Dim objFso, objFld, objTxt, objOutFile, WshShell, objDrive, objDirectory, i
 Set objFso = Createobject("Scripting.FileSystemobject")
 Set objDirectory = Createobject("Scripting.FileSystemobject")
 Set WshShell = WScript.Createobject("WScript.Shell")


 strUser = wshShell.ExpandEnvironmentStrings("%USERNAME%")
'fichier de sortie
 objOutFile = "C:\scripts\FileListR3.txt"


 Set objTxt = objFso.OpenTextFile(objOutFile, 2, True)


 For Each objDrive in objFso.Drives      If objDrive.IsReady True And objDrive.DriveType 2 Then
        Dim objDicoFiles
        Set objDicoFiles = Createobject("Scripting.Dictionary")
        '
        ' Programme principal
        'dossier à scanner
     objDirectory = "\" & strComputer & "\C$\temp"
     If Not objFso.FolderExists(objDirectory) Then
      objTxt.WriteLine "Le répertoire \" & strComputer & "\C$\temp n'existe pas."
     Else
         Call SearchFiles(objFso.GetFolder(objDirectory))
         Dim elements
         elements = objDicoFiles.Items
         'écriture dans le fichier txt      
         For i=0 To objDicoFiles.Count-1            If Instr(elements(i), "mdb" ) 1 Or Instr(elements(i), "xls" ) 1 Then
                 objTxt.WriteLine elements(i) 'si l'élément est un fichier Access ou Excel on l'ajoute
              End if
         Next
     End If
     '
     End if
 Next
 objTxt.Close
 call ExportXLF(objOutFile)
 '
    Set objDicoFiles = Nothing
       Set objDirectory = Nothing
 '
 Set objTxt = Nothing
 Set objFso = Nothing
 Set WshShell = Nothing
 '
 'WScript.Echo "Script terminé"
 'Wscript.ScriptName
 'Wscript.ScriptFullName
 WScript.Echo "Programme " & Wscript.ScriptName & " terminé ...."
 '
 Return = WshShell.Run("notepad " & objOutFile, 1, True)
 '
 Next
    ' =====================================================================
    ' End
    ' =====================================================================


' fonction de recherche
Sub SearchFiles(objFolder)
    On Error Resume Next
    Dim objFile, subFolder
    For Each objFile In objFolder.Files
        Set objDicoFiles(objFile.Path) = objFile
    Next
    For Each subFolder In objFolder.SubFolders
        Call SearchFiles(subFolder)
    Next
End Sub


'Wscript.Quit
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Mon premier problème est que le scan me donne TOUTES les extensions de fichiers OU aucun si j'utilise Instr(). Je veux ne lister QUE les fichiers xls et mdb!

Merci de m'aider à corriger cette première étape.


Le problème suivant est que ma liste dans mon fichier html est statique alors que je voudrais qu'elle soit contruite dynamiquement sur la base de mon fichier texte ADListR.txt.

2 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
salut,

voici une première piste de recherche :
http://www.codyx.org/snippet_lister-tous-fichiers-repertoire_198.aspx#688

le dernier arguent optionel prendra une fois "*.xls", une autre "*.mdb"
à noter que cette fonction n'est pas récursive, tu en trouveras d'autres sur codyx.org

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
2
Merci pour ton intervention seulement je reste sous VBS dans un premier temps, j'ai déjà fait l'application en VBA avec Excel seulement le temps d'exécution de la macro même récursive reste plus long.