W jaki sposób określić czas systemowy na komputerze?
Skrypciarze odpowiadają na Wasze pytania
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy. |
W jaki sposób określić czas systemowy na komputerze?
Cześć Skrypciarze! Czy istnieje jakiś sposób na pobranie czasu systemowego skonfigurowanego na komputerze zdalnym?
-- JJ
Cześć JJ. Istnieją co najmniej dwa sposoby i w obu używa się WMI. Jeśli pracujesz na Windows XP lub Windows Server 2003, możesz użyć klasy WMI Win32_LocalTime. Jak widać, to znacznie ułatwia uzyskanie czasu systemowego: łączysz się z komputerem zdalnym, wysyłasz zapytanie do klasy Win32_LocalTime, a następnie wywołujesz żądane wartości. Innymi słowy:
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
Dla urozmaicenia możesz połączyć wszystkie te wartości w standardowy ciąg data-czas, czyli coś w tym stylu: 1/26/2005 8:47:04 AM. Zrobi to ten skrypt:
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
Nie będziemy wyjaśniać każdej linii kodu w skrypcie, ale większość tego, co tu robimy, to łączenie wartości. Prawdę mówiąc są tu tylko dwie lekko podstępne rzeczy. Po pierwsze, sprawdzamy, czy wartość godziny jest mniejsza od 12; jeśli tak, to na końcu ciągu dodajemy AM (przed południem); jeśli nie, na końcu ciągu znajdzie się PM (po południu). Owszem, to oznacza, że godzina jest zwracana w formacie 24-godzinnym; tym sposobem 3:00 po południu stanie się 15:00. Dlatego też jeśli wartość godziny jest wyższa od 12, odejmujemy 12. Wówczas 15:00 zmieni się w 3:00.
Zarówno dla minut, jak i dla sekund, sprawdzamy, czy zwrócona wartość jest niższa niż 10. Po co? Cóż, przypuśćmy, że mamy godzinę 8, minut 6 i 5 sekund. Jeśli połączymy te wartości w takiej postaci, nasz czas będzie wynosił 8:6:5. Nie bardzo to wygląda na czas, prawda? Dlatego też jeżeli wartości minut i sekund są niższe niż 10, do obu dodajemy z przodu 0. Teraz łączymy 8, 06 i 05, i otrzymujemy czas 08:06:05. Teraz lepiej.
Klasa Win32_LocalTime nie istnieje niestety w Windows 2000. Czas systemowy można jednak uzyskać przez wysłanie zapytania do klasy Win32_OperatingSystem i sprawdzenie wartości właściwości LocalTime. Kłopot polega na tym, że data i godzina zostaną zwrócone w formacie UTC (Universal Time Coordinate – czas uniwersalny), co oznacza, że będą wyglądały tak: 20050127080605.000000+480. Fuj.
Nie będziemy wdawać się w szczegóły dotyczące formatu UTC; zainteresowanych zapraszamy do lektury tego rozdziału (j.ang.)Przewodnika Skryptowania Microsoft Windows 2000. Pokażemy Ci za to skrypt, który konwertuje wartość LocalDateTime na nieco bardziej czytelny format:
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
Niewiele tu formatowania; na przykład, nie przekonwertowaliśmy 15:00 na 3:00, nie określiliśmy też, czy czas jest AM, czy PM. To jednak można zrobić samemu, tym samym sposobem, którego użyliśmy przy Win32_LocalTime.
Do początku strony