' ---------------------------------------------------------- ' Script d'arrêt ou démarrage de services ' sur les machines d'un domaine ou workgroup ' ' Syntaxe : ' setsvcdomain [-d] -s -e<état> [-u] [-p : nom du domaine ou workgroup concerné ' si ce nom est omis, on prend le domaine ' de la machine locale ' : nom du service (entre guillemets) ' <état> : START|STOP (si vide :affiche l'état actuel) ' : compte utilisateur (devant avoir les droits nécessaires) ' : mot de passe du compte ' ' JC BELLAMY © 2003 ' ---------------------------------------------------------- Dim net, shell, user, computer, args, ServiceSet, Service,objLocator,UserName,Password, 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 testarg("?") or testarg("h") Then msg=VBCRLF & "Script d'arrêt ou démarrage de services" & VBCRLF msg=msg & "sur les machines d'un domaine ou workgroup" & VBCRLF msg=msg & "JCB © 2002" & VBCRLF msg=msg & "------------------------------" & VBCRLF msg=msg & "Syntaxe :" & VBCRLF msg=msg & " setsvcdomain [-d] [-s] [-e<état>] [-u] [-p]" & 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 du service (si vide : liste de tous les services)" & VBCRLF msg=msg & " <état> : START|STOP (si vide : affiche l'état actuel)" & VBCRLF msg=msg & " : compte utilisateur (devant avoir les droits nécessaires)" & VBCRLF msg=msg & " : mot de passe du compte" & VBCRLF msg=msg & "NB: " & VBCRLF msg=msg & " - minuscules/majuscules indifférent" & VBCRLF msg=msg & " - le nom du service doit être entre guillemets s'il comporte des espaces" & VBCRLF msg=msg & " - caractère commutateur ""-"" ou ""/""" & VBCRLF msg=msg & " - le compte utilisateur ne concerne que les connexions distantes" & VBCRLF msg=msg & " S'il est omis, on prend le compte local en cours" & VBCRLF msg=msg & "Exemples :" & VBCRLF msg=msg & " setsvc" & VBCRLF msg=msg & " setsvc -dMAPLENET -sTelnet -eStart" & VBCRLF msg=msg & " setsvc /s""Service SNMP"" -uHOMER -pDohhhh!" & VBCRLF msg=msg & " setsvc /dETUDES /s""Service d'indexation"" /eStop" & VBCRLF & VBCRLF wscript.echo msg Wscript.quit End If Set objLocator = CreateObject("WbemScripting.SWbemLocator") If Err.Number then Wscript.Echo( "Erreur 0x" & CStr(Hex(Err.Number)) & _ " survenue dans la création de l'objet locator." ) If Err.Description <> "" Then Wscript.Echo( "Description: " & Err.Description & "." ) Err.Clear wscript.quit End If computer=net.ComputerName UserName="" Password="" If testarg("u") Then UserName=getarg("u") If testarg("p") Then Password=getarg("p") End If NameSpace="root\CIMV2" Set ObjService = objLocator.ConnectServer(computer, NameSpace, "", "") If Err.Number then msg="Erreur 0x" & CStr(Hex(Err.Number)) & " survenue dans la connexion à " & remote If Err.Description <> "" Then msg=msg & " : " & Err.Description wscript.echo msg wscript.quit End If ObjService.Security_.impersonationlevel = 3 domain="" If testarg("d") Then domain=getarg("d") If domain="" Then Set ComputerSystem=ObjService.ExecQuery("SELECT * FROM Win32_ComputerSystem") for each ComputerItem in ComputerSystem domain=ComputerItem.Domain next End If Svcname="" newstate="" Lib3="sur les ordinateurs du domaine " & domain If testarg("s") Then Svcname=getarg("s") Lib2=" du service """+SvcName+"""" Lib1="Etat" If testarg("e") Then newstate=getarg("e") Select Case newstate Case "start" Lib1="Démarrage" Case "stop" Lib1="Arrêt" End Select end if Lib0=Lib1 & Lib2 else Lib0="Liste des services" end if msg=Lib0 & VBCRLF & Lib3 & VBCRLF msg=msg & String(len(lib3),"-") & VBCRLF Wscript.echo msg set oWinnt=GetObject("WinNT://" & domain) For each oDomainItem in oWinnt classe=oDomainItem.Class Remote=oDomainItem.Name If classe="Computer" Then LoopService Remote,SvcName,Newstate Next wscript.quit ' ------------------------------------- Sub LoopService(Remote,SvcName,Newstate) Host=FormatStrL(Remote,16) CurUserName="" CurPassword="" If Remote<>computer Then CurUserName=UserName CurPassword=Password End If on error resume next Set ObjService=objLocator.ConnectServer(Remote, NameSpace, CurUserName, CurPassword) If err.Number<>0 Then exit sub End If on error goto 0 Set ServiceSet=ObjService.ExecQuery("SELECT * FROM Win32_service") If Svcname<>"" Then for each Service in ServiceSet If lcase(Service.DisplayName)=Svcname Then oldstate=getstate(Service.started) WScript.Echo VBCRLF & Host & " état initial : " & oldstate Select Case newstate Case "start" coderet=Service.StartService Wscript.echo " -> " & MsgRetStart(coderet) Case "stop" coderet=Service.StopService Wscript.echo " -> " & MsgRetStop(coderet) Case else WScript.Echo End Select Exit sub end if next Wscript.echo VBCRLF & Host & " : service """ & Svcname & """ non trouvé" Else Wscript.echo VBCRLF & Host & VBCRLF & string(len(remote),"=") StartedList="" StoppedList="" nStarted=0 nStopped=0 for each Service in ServiceSet If Service.started Then nStarted=nStarted+1 StartedList=StartedList & VBCRLF & FormatStrR(nStarted,3) & " " & Service.DisplayName Else nStopped=nStopped+1 StoppedList=StoppedList & VBCRLF & FormatStrR(nStopped,3) & " " & Service.DisplayName End If PrintList nStarted,"démarrés",StartedList PrintList nStopped,"arrêtés ",StoppedList Next 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(curarg,2+len(param)) exit function End If End If Next End Function '-------------------------------------------------------------------- Function getstate(param) If param Then getstate="Démarré" Else getstate="Arrêté " End If End Function '-------------------------------------------------------------------- Function MsgRetStart(coderet) Select Case coderet Case 0 msg="La requête a été acceptée." Case 1 msg="La requête n'est pas prise en charge." Case 2 msg="L'utilisateur n'a pas l'accès nécessaire." Case 3 msg="Le service ne peut pas être arrêté car d'autres services " & VBCRLF & _ "qui sont en cours d'exécution en dépendent." Case 4 msg="Le code de contrôle requis n'est pas valide ou n'est pas " & VBCRLF & _ "acceptable pour le service." Case 5 msg="Le code de contrôle requis ne peut pas être envoyé au service" & VBCRLF & _ "parce que l'état du service (Win32_BaseService:State) est égal à 0, 1 ou 2." Case 6 msg="Le service n'a pas été démarré." Case 7 msg="Le service n'a pas répondu à la demande de démarrage dans" & VBCRLF & _ "les temps impartis." Case 8 msg="Échec inconnu lors du démarrage du service." Case 9 msg="Le chemin d'accès au répertoire à l'exécutable du service" & VBCRLF & _ "n'a pas été trouvé." Case 10 msg="Le service est déjà en cours d'exécution." Case 11 msg="La base de données sur laquelle ajouter un nouveau service est bloquée." Case 12 msg="Une dépendance sur laquelle compte ce service a été supprimée du système." Case 13 msg="Le service n'a pas pu trouver le service nécessaire à partir" & VBCRLF & _ "d'un service dépendant." Case 14 msg="Le service a été désactivé du système." Case 15 msg="Le service n'a pas l'authentification correcte pour " & VBCRLF & _ "fonctionner sur le système." Case 16 msg="Ce service est en cours de suppression du système." Case 17 msg="Il n'y a pas de thread d'exécution pour le service." Case 18 msg="Il y a des dépendances circulaires lors du démarrage du service." Case 19 msg="Il y a un service en cours de fonctionnement sous le même nom." Case 20 msg="Il y a des caractères non valides dans le nom du service." Case 21 msg="Des paramètres non valides ont été passés au service." Case 22 msg="le compte sous lequel ce service doit fonctionner est soit invalide" & VBCRLF & _ "ou n'a pas les permissions pour faire fonctionner le service." Case 23 msg="Le service existe dans la base de données des services disponibles" & VBCRLF & _ "à partir du système." Case 24 msg="Le service est pour l'instant suspendu dans le système." Case else msg="Erreur inconnue" End Select MsgRetStart=msg End Function '-------------------------------------------------------------------- Function MsgRetStop(coderet) Select Case coderet Case 0 msg="Le service a été arrêté correctement." Case 1 msg="La requête n'est pas prise en charge." Case else msg="Erreur inconnue" End Select MsgRetStop=msg End Function '-------------------------------------------------------------------- Function FormatStrL(ch,lmax) s=ch l=len(s) If l