Comment puis-je déterminer l'heure du système sur un ordinateur ?

S'il vous plaît Monsieur Script...

Hey, Scripting Guy!

Bienvenue dans cette section TechNet, dans laquelle le Monsieur Script de Microsoft répond aux questions récurrentes sur les scripts d'administration système.

Question du jour : comment puis-je déterminer l'heure du système sur un ordinateur ?

Comment puis-je déterminer l'heure du système sur un ordinateur ?Comment puis-je déterminer l'heure du système sur un ordinateur ?

S'il vous plaît Monsieur Script... Existe-t-il un moyen d'obtenir l'heure du système sur un ordinateur distant ?

-- JJ

Bonjour JJ. Il existe au moins deux moyens d'y parvenir, tous deux à l'aide de WMI. Si vous exécutez Windows XP ou Windows Server 2003, vous pouvez utiliser la classe WMI Win32_LocalTime. Comme vous pouvez le constater, il est relativement simple d'obtenir l'heure du système : il vous suffit de vous connecter à l'ordinateur distant, d'interroger la classe Win32_LocalTime et d'envoyer un écho des valeurs souhaitées. En d'autres termes :

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_LocalTime")

For Each objItem in colItems
    Wscript.Echo "Month: " & objItem.Month
    Wscript.Echo "Day: " & objItem.Day
    Wscript.Echo "Year: " & objItem.Year
    Wscript.Echo "Hour: " & objItem.Hour
    Wscript.Echo "Minute: " & objItem.Minute
    Wscript.Echo "Second: " & objItem.Second
Next

Si vous voulez vous amuser un peu, vous pouvez combiner toutes ces valeurs isolées au sein d'une chaîne date-heure standard qui ressemblerait à ceci : 1/26/2005 8:47:04 AM. Voici un script qui exécute justement cette tâche :

On Error Resume Next

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LocalTime")

For Each objItem in colItems
    intMonth = objItem.Month
    intDay = objItem.Day
    intYear = objItem.Year

    dtmDate = intMonth & "/" & intDay & "/" & intYear

    intHour = objItem.Hour
    If intHour < 12 Then 
        strAMPM = "AM"
    Else
        intHour = intHour - 12
        strAMPM = "PM"
    End If
  
    intMinutes = objItem.Minute
    If intMinutes < 10 Then
        intMinutes = "0" & intMinutes
    End If

    intSeconds = objItem.Second
    If intSeconds < 10 Then
        intSeconds = "0" & intSeconds
    End If

    dtmTime = intHour & ":" & intMinutes & ":" & intSeconds & " " & strAMPM
    
    Wscript.Echo dtmDate & " " & dtmTime
Next

Nous n'allons pas expliquer chaque ligne de code de ce script, mais pour la plupart d'entre elles, nous ne faisons que combiner des valeurs. En réalité, nous n'effectuons que deux opérations, un petit peu complexes. Tout d'abord, nous vérifions l'heure pour savoir si elle est inférieure à 12. Si oui, nous ajoutons AM à la fin de la chaîne ; dans le cas contraire, nous ajoutons PM. Et oui, vous l'avez bien compris, l'heure est renvoyée au format 24 heures ; ainsi, 3:00 de l'après-midi est renvoyé sous la forme 15:00. C'est pourquoi, lorsque nous vérifions l'heure, nous soustrayons 12 si elle est supérieure à 12. De cette façon, 15:00 devient 3:00 PM.

En ce qui concerne les minutes et les secondes, nous vérifions si la valeur renvoyée est inférieure à 10. Pourquoi ? Bien, imaginons que nous avons 8 heures, 6 minutes et 5 secondes. Si nous combinons ces valeurs telles quelles, nous obtiendrons l'heure sous la forme 8:6:5. Cela ne ressemble pas vraiment à un format d'heure, n'est-ce pas ? Par conséquent, si les minutes ou les secondes sont inférieures à 10, nous les faisons précéder d'un zéro. En procédant ainsi, nous combinons 8, 06 et 05 pour obtenir le format d'heure suivant : 08:06:05. Le résultat est bien meilleur n'est-ce pas ?

Bien sûr, cela suffit si vous utilisez Windows XP ou Windows Server 2003, mais qu'en est-il des utilisateurs de Windows 2000 ? D'accord, ils peuvent toujours obtenir cette même information, sauf que la procédure ne sera pas aussi simple.

Comme nous l'avons souligné plus haut, la classe Win32_LocalTime n'existe pas dans Windows 2000. Cependant, vous pouvez toujours obtenir l'heure du système en interrogant la classe Win32_OperatingSystem et en vérifiant la valeur de la propriété LocalDateTime. Le seul problème que pose cette approche, c'est que la date et l'heure sont renvoyées au format UTC (Universal Time Coordinate). Par conséquent, l'heure et la date obtenues ressemblent à l'exemple suivant : 20050127080605.000000+480. Côté lisibilité, ce n'est pas l'idéal.

Nous n'allons pas entrer dans les détails du format UTC. Si vous souhaitez obtenir davantage d'informations, consultez cette section du Microsoft Windows 2000 Scripting Guide ( site en anglais ). Nous allons toutefois vous présenter un script qui extrait la valeur de la propriété LocalDateTime et la convertit dans un format légèrement plus lisible :

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

For Each objItem in colItems
    dtmLocalTime = objItem.LocalDateTime
    dtmMonth = Mid(dtmLocalTime, 5, 2)
    dtmDay = Mid(dtmLocalTime, 7, 2)
    dtmYear = Left(dtmLocalTime, 4)
    dtmHour = Mid(dtmLocalTime, 9, 2)
    dtmMinutes = Mid(dtmLocalTime, 11, 2)
    dtmSeconds = Mid(dtmLocalTime, 13, 2)
Next

dtmNewDate = dtmMonth & "/" & dtmDay & "/" & dtmYear
dtmNewTime =  dtmHour & ":" & dtmMinutes & ":" & dtmSeconds

Wscript.Echo dtmNewDate & " " & dtmNewTime

La question du format n'a pas été traitée dans ce script. Par exemple, nous ne convertissons pas 15:00 en 3:00, ni n'indiquons s'il s'agit du matin ou de l'après-midi (AM ou PM). Mais vous pouvez aborder cet aspect vous-même en suivant la même approche que celle adoptée pour la classe Win32_LocalTime.

Pour en savoir plus

Consultez les archives de S'il vous plaît Monsieur Script... site en anglais