Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb de boucle

2 réponses
Avatar
Vincent
Bonjour,

J'essaie de scripter le redémarrage d'un service sur des serveurs distants.
Vu que le temps nécessaire à l'arrêt puis au redémarrage du service est
aleatoire suivant le serveur, je ne souhaite pas utiliser l'instruction
WScript.Sleep. Alors j'ai essayé avec une boucle qui vérifie que le service
est dans l'état "STOPPED" avant de le redémarrer. Malheureusement, je ne sors
jamais de la boucle quel que soit l'état du service. Je ne comprends pas
pourquoi, cependant, il doit bien y avoir une erreur dans mon script ! :-) Je
ne suis pas un pro alors si quelqu'un peut me dire quelle erreur j'ai fait,
ça serait cool.

Voilà mon script, merci d'avance:

On Error Resume Next
Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("DHCPList.txt", _
ForReading, FailIfNotExist, OpenAsASCII)

Do Until objFile.AtEndOfStream
strComputer = Trim(objFile.ReadLine)
WScript.Echo " Processing " & strComputer & " ..."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer &
"\root\cimv2")

Set colListOfServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where Name = 'DHCPServer'")

For each objService in colListOfServices

objService.StopService()
Do Until objService.State = "Stopped"
Loop

objService.StartService()
Do Until objService.State = "Running"
Loop

Next
Wscript.Echo "DHCP Service on " & strComputer & "has been restarted !"

objRecordSet.MoveNext
Loop

2 réponses

Avatar
Gilles LAURENT
"Vincent" a écrit dans le message
de news:
| Bonjour,

Bonjour,

[...]

| objService.StopService()
| Do Until objService.State = "Stopped"
| Loop

Le problème vient du fait que la propriété 'State' sera toujours égale à
"Running" car c'est la valeur qui a été lue lors de la construction de
la collection via WMI. La modification des propriétés n'est pas
dynamique donc le fait d'arrêter le service ne modifie pas les valeurs
des propriétés. Pour connaitre l'état du service il est nécessaire de
mettre à jour la collection et donc de relancer une interrogation.

| objService.StartService()
| Do Until objService.State = "Running"
| Loop

Idem

Ci-dessous la procédure qui peut être utilisée pour attendre l'état du
service.
Dans votre code, remplacez :
Do ... Loop
par
1- WaitForServiceState "DHCPServer", "Stopped"
ou
2- WaitForServiceState "DHCPServer", "Running"

-- Coupez ici --

' procédure utilisée pour attendre que le service spécifié
' soit dans l'état demandé
Sub WaitForServiceState (serviceName, reqServiceState)
Dim curServiceState
Dim colServices

curServiceState = 0
do until curServiceState = 1
Wscript.Sleep (500)
Set colServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where " & _
"Name = '" & serviceName & "' And " & _
"State='" & reqServiceState & "'")
curServiceState = colServices.count
Loop

End Sub

-- Coupez ici --

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
Vincent
Merci beaucoup pour votre aide

Bonne journée


"Vincent" a écrit dans le message
de news:
| Bonjour,

Bonjour,

[...]

| objService.StopService()
| Do Until objService.State = "Stopped"
| Loop

Le problème vient du fait que la propriété 'State' sera toujours égale à
"Running" car c'est la valeur qui a été lue lors de la construction de
la collection via WMI. La modification des propriétés n'est pas
dynamique donc le fait d'arrêter le service ne modifie pas les valeurs
des propriétés. Pour connaitre l'état du service il est nécessaire de
mettre à jour la collection et donc de relancer une interrogation.

| objService.StartService()
| Do Until objService.State = "Running"
| Loop

Idem

Ci-dessous la procédure qui peut être utilisée pour attendre l'état du
service.
Dans votre code, remplacez :
Do ... Loop
par
1- WaitForServiceState "DHCPServer", "Stopped"
ou
2- WaitForServiceState "DHCPServer", "Running"

-- Coupez ici --

' procédure utilisée pour attendre que le service spécifié
' soit dans l'état demandé
Sub WaitForServiceState (serviceName, reqServiceState)
Dim curServiceState
Dim colServices

curServiceState = 0
do until curServiceState = 1
Wscript.Sleep (500)
Set colServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where " & _
"Name = '" & serviceName & "' And " & _
"State='" & reqServiceState & "'")
curServiceState = colServices.count
Loop

End Sub

-- Coupez ici --

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD