neo2k2
Messages postés126Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 9 novembre 2009
-
30 janv. 2008 à 10:51
neo2k2
Messages postés126Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 9 novembre 2009
-
30 janv. 2008 à 13:12
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
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
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.
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
neo2k2
Messages postés126Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 9 novembre 20093 30 janv. 2008 à 13:12
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.