Centrum skryptów - Systemy operacyjne

Jak sprawdzić czas systemu na zdalnym komputerze?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

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.

Jak sprawdzić czas systemu na zdalnym komputerze?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak można sprawdzić czas systemu na zdalnym komputerze?

-- MN

Cześć Skrypciarze! Odpowiedź

Cześć, MN. Istnieje takie przekonanie, że jeżeli bardzo intensywnie o czymś myślimy i bardzo mocno czegoś pragniemy, to prędzej czy później to otrzymamy. Nie dotyczy to tylko dzieci wierzących w Świętego Mikołaja, przekonanych o tym jest także wielu dorosłych. Podobno nawet napisano na ten temat wiele książek. Skrypciarz piszący te słowa żadnej z nich nie przeczytał, ale z własnego doświadczenia wie, że jeżeli bardzo intensywnie o czymś myśli i bardzo mocno tego chce, jest tylko kwestią czasu, kiedy jego marzenie się spełni. Ostatnio bardzo pragnął napisać skrypt pozwalający na sprawdzenie czasu systemu i oto rezultat:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colItems = objWMIService.ExecQuery("Select * From Win32_LocalTime")

 

For Each objItem in colItems

    strTime = objItem.Hour & ":" & objItem.Minute & ":" & objItem.Second

    dtmTime = CDate(strTime)

    Wscript.Echo FormatDateTime(dtmTime, vbFormatLongTime)

Next

Trochę straszny, nieprawdaż?

W sumie nie jest to zwyczajny skrypt, jest bardziej fantazyjny niż wszystkie wymyślone do tej pory przez Skrypciarzy. Nie jest może idealny, biorąc pod uwagę, że współpracuje tylko z Windows XP i nowszymi wersjami systemu Windows. (A przecież są osoby, które w dalszym ciągu używają systemu Windows 2000.) Ale to nie jest dla nas żaden problem. Na sam koniec pokażemy alternatywną metodę określenia czasu systemu, która sprawdzi się także dla systemu Windows 2000. Przynajmniej tyle możemy zrobić, żeby naprawić fakt, że Skrypciarz piszący te słowa zapomniał pomyśleć o użytkownikach systemu Windows 2000.

Skrypt rozpoczyna się od podłączenia do usługi WMI na lokalnym komputerze. Zaraz, zaraz, czyż nie mieliśmy sprawdzić czasu systemu na zdalnym komputerze? No tak. Aby określić czas systemu na zdalnym komputerze, należy przypisać nazwę tego komputera do zmiennej o nazwie strComputer, w ten oto sposób:

strComputer = "atl-fs-01"

Po podłączeniu do usługi WMI, używamy następującego zapytania w celu pobrania wszystkich wystąpień klasy Win32_LocalTime:

Set colItems = objWMIService.ExecQuery("Select * From Win32_LocalTime")

Przy okazji dowiadujemy się, dlaczego nasz skrypt nie współpracuje z systemem Windows 2000: klasa Win32_LocalTime została po raz pierwszy wprowadzona w Windows XP.

Jak można się było spodziewać, klasa Win32_LocalTime jest klasą jednoelementową, co oznacza, że odsyła tylko jeden element. (W chwili obecnej jeden komputer może posiadać tylko jeden czas systemu; być może się to kiedyś zmieni, ale na razie na to się nie zanosi.) Jednakże nawet, jeżeli otrzymamy tylko jeden element, metoda ExecQuery zawsze przekazuje informacje w formie kolekcji, co z kolei oznacza, że i tak musimy uruchomić pętlę For Each, która przejdzie przez wszystkie elementy w kolekcji:

For Each objItem in colItems

Wewnątrz tej pętli pobierzemy wartości właściwości Hour, Minute i Second. Następnie połączymy te wartości, zachowując wynik w zmiennej o nazwie strTime:

strTime = objItem.Hour & ":" & objItem.Minute & ":" & objItem.Second

Prawdę mówiąc, moglibyśmy na tym skończyć i wywołać echo wartości strTime. Jednak klasa Win32_LocalTime używa zegara w 24-godzinnym formacie czasu, co oznacza, że druga po południu po południu jest przedstawiona jako 14:00. Jeżeli nie mamy nic przeciwko temu, możemy uznać, że skończyliśmy. Skrypciarz piszący te słowa zdecydował się jednak dołączyć jeszcze kilka wierszy kodu, żeby przestawić zegar na 12-godzinny format czasu.

Co mamy przez to rozumieć? Cóż, przypuśćmy, że czas lokalny na komputerze to 2:33:16 po południu; oznacza to, że zmienna strTime będzie wynosić:

14:33:16

Żeby przekonwertować ją na format 12-godzinny, stosujemy funkcję CDate:

dtmTime = CDate(strTime)

Następnie używamy funkcji FormatDateTime, aby wywołać echo wartości dtmTime za pomocą ustawień czasu określonych w Opcjach regionalnych i językowych naszego komputera (służy do tego stała vbLongTme skryptu VBScript). Na komputerze testowym Skrypciarzy będzie to wyglądać następująco:

2:33:16 PM

Ten widok jest trochę przyjemniejszy, zwłaszcza jeżeli nie jesteśmy przekonani do 24-godzinnego formatu czasu.

Cóż, widok ten naprawdę jest przyjemniejszy, pod warunkiem, że nie używamy systemu Windows 2000. Jeżeli tak, powyższy skrypt na niewiele się nam przyda. Ale nie ma powodu do rozpaczy, w systemie Windows 2000 możemy sprawdzić czas systemu używając klasy Win32_OperatingSystem oraz właściwości LocalDateTime. Właściwość LocalDateTime zachowuje czas wykorzystując niesławny format UTC (Universal Time Coordinate), jednak przy odrobinie wysiłku możemy przekonwertować wartości UTC na coś bardziej przyjaznego dla użytkownika:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colItems = objWMIService.ExecQuery("Select * From Win32_OperatingSystem")

 

For Each objItem in colItems

    strTime = objItem.LocalDateTime

    dtmTime = CDate(Mid (strTime, 9, 2) & ":" & Mid(strTime, 11, 2) & ":" & _

        Mid(strTime, 13, 2))

    dtmTime = CDate(dtmTime)

    Wscript.Echo FormatDateTime(dtmTime, vbFormatLongTime)

Next

Nie będziemy dziś szczegółowo omawiać tego skryptu, jednak więcej informacji o formacie czasu UTC znaleźć można w przewodniku Microsoft Windows 2000 Scripting Guide (j.ang.).

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne