' ---------------------------------------------------------- ' Script d'exécution d'un programme recevant en paramètres ' le nom NetBIOS d'une machine, à exécuter pour toutes ' les machines d'un workgroup ou domaine. ' Le script récupère la liste de toutes les machines ' puis exécute le programme avec chaque nom d'ordinateur ' Ce programme peut par exemple être un fichier batch contenant ' des commandes de copies, suppression, renommage, ..., de fichiers ' Exemple (fichier "MAJ.BAT") ' @echo off ' copy k\toto\fichier1.xyz \\%1\partage\truc ' ren \\%1\c\trace.txt log.txt ' .... ' Il sera exécuté par la commande :" & VBCRLF ' runall /cMAJ.BAT" ' ' Syntaxe : ' runall [/d] /c ' ' Paramètres : ' : nom de doamine ou workgroup ' si absent : domaine de la machine locale ' : nom de fichier batch, ou exécutable ' admettant en paramètre le nom d'un ordinateur ' ' JC BELLAMY © 2002 ' ---------------------------------------------------------- ' On Error Resume Next Const SW_HIDE=0 Const SW_SHOWNORMAL=1 Dim net, shell, user, computer, args, fso Set net = Wscript.CreateObject("WScript.Network") Set shell = WScript.CreateObject("WScript.Shell") Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set args = Wscript.Arguments nbargs=args.count If nbargs=0 or testarg("?") or testarg("h") Then Syntaxe "" local=ucase(net.ComputerName) TestHost true If not testarg("c") then Syntaxe "Nom de commande absent" commande=getarg("c") domain="" If testarg("d") Then domain=ucase(getarg("d")) If domain="" Then ' Récupération du domaine Set ComputerSystem = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf ("Win32_ComputerSystem") for each ComputerItem in ComputerSystem domain=ComputerItem.Domain next end if wscript.echo "Domaine : " & domain ' Récupération des noms de machines du domaine set oWinNT=GetObject("WinNT://" & domain) oWinNT.filter = Array("computer") for each oDomain in oWinNT remote=ucase(oDomain.name) If remote<>local Then wscript.echo "Exécution de " & commande & " " & remote shell.run commande & " " & remote,SW_HIDE,true End If next Wscript.quit '-------------------------------------------------------------------- 'Sous-programme de test du moteur 'Vu les sorties générées, c'est CSCRIPT (et non pas WSCRIPT) 'qui doit être utilisé de préférence Sub TestHost(force) dim rep strappli=lcase(Wscript.ScriptFullName) strFullName =lcase(WScript.FullName) i=InStr(1,strFullName,".exe",1) j=InStrRev(strFullName,"\",i,1) strCommand=Mid(strFullName,j+1,i-j-1) if strCommand<>"cscript" then If force then Init="Ce script doit être lancé avec CSCRIPT" Else Init="Il est préférable de lancer ce script avec CSCRIPT" End If rep=MsgBox(Init & 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" params="" For i = 0 To nbargs-1 params=params & " " & args(i) next ficcmd.writeline chr(34) & strappli & chr(34) & params ficcmd.writeline "pause" ficcmd.close shell.Run nomcmd, SW_SHOWNORMAL,true force=true end if If force then WScript.Quit end if end sub '-------------------------------------------------------------------- Function testarg(param) testarg=false For i = 0 To nbargs-1 curarg=lcase(args(i)) If left(curarg,1)="/" or left(curarg,1)="-" Then If mid(curarg,2,len(param))=param Then testarg=true exit function End If End If Next End Function '-------------------------------------------------------------------- Function getarg(param) getarg="" For i = 0 To nbargs-1 curarg=lcase(args(i)) If left(curarg,1)="/" or left(curarg,1)="-" Then If mid(curarg,2,len(param))=param Then getarg=mid(args(i),2+len(param)) exit function End If End If Next End Function '-------------------------------------------------------------------- Sub Syntaxe(info) If info="" Then msg= "Script d'exécution d'un programme recevant en paramètres le nom NetBIOS" & VBCRLF msg=msg & "d'une machine, à exécuter pour toutes les machines d'un workgroup ou domaine." & VBCRLF msg=msg & "Le script récupère la liste de toutes les machines, puis exécute le programme" & VBCRLF msg=msg & "avec chaque nom d'ordinateur passé en paramètre." & VBCRLF msg=msg & "Ce programme peut par exemple être un fichier batch contenant des commandes" & VBCRLF msg=msg & "de copies, suppression, renommage, ..., de fichiers" & VBCRLF msg=msg & " Exemple (fichier ""MAJ.BAT"")" & VBCRLF msg=msg & " @echo off" & VBCRLF msg=msg & " copy k\toto\fichier1.xyz \\%1\partage\truc" & VBCRLF msg=msg & " ren \\%1\c\trace.txt log.txt" & VBCRLF msg=msg & " ..." & VBCRLF msg=msg & " Il sera exécuté par la commande :" & VBCRLF msg=msg & " runall /cMAJ.BAT" & VBCRLF & VBCRLF msg=msg & "JC BELLAMY © 2002" & VBCRLF Else msg="*** " & info & " ***" & VBCRLF End If msg=msg & "------------------------------------------" & VBCRLF msg=msg & "Syntaxe : " & VBCRLF msg=msg & " runall [/d] /c" & VBCRLF msg=msg & " : nom du domaine ou workgroup concerné" & VBCRLF msg=msg & " si ce nom est omis, on prend le domaine" & VBCRLF msg=msg & " de la machine locale" & VBCRLF msg=msg & " : nom de fichier batch ou exécutable" & VBCRLF msg=msg & " admettant en paramètre le nom d'un ordinateur" & VBCRLF & VBCRLF wscript.echo msg wscript.quit End Sub '--------------------------------------------------------------------