Jak pobrać na komputer informację na temat strefy czasowej?
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. |
Jak pobrać na komputer informację na temat strefy czasowej?
Cześć, Skrypciarze! Jak pobrać na komputer informację na temat strefy czasowej?
-- AL
Cześć, AL! Czas i przestrzeń są naprawdę bardzo ciekawym tematem, stwierdziłem to szczególnie po godzinach spędzonych w samolocie do Barcelony. Zastanawiam się czasem, kiedy Star Trek stanie się w końcu rzeczywistością i kiedy będzie można się po prostu się teleportować (przepraszam: transportować, czy jak to tam szło). Jeszcze lepsza jest chyba bilokacja, bo kiedy znowu ugrzęźliśmy w kolejce, bo ktoś wepchnął się przed nas z całym wózkiem produktów, podczas gdy kasa przewidziana jest wyraźnie i drukowanymi literami „DO 5 PRODUKTÓW”, można by w tym czasie pozałatwiać jakieś inne sprawy, lub po prostu opalać się w Barcelonie i robić zakupy w Redmond. Dlaczego nie „robić zakupy w Barcelonie”? Zakładam, że bilokacja nie przewiduje przewożenia zakupów, tylko po prostu samo „bycie”, ale może się mylę…
Na razie mogę jedynie określić strefę czasową, w której znajduje się dany komputer:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_TimeZone")
For Each objItem in colItems
Set colItems2 = objWMIService.ExecQuery("Select * From Win32_ComputerSystem")
For Each objItem2 in colItems2
blnDaylightInEffect = objItem2.DaylightInEffect
Next
If blnDaylightInEffect Then
Wscript.Echo objItem.DaylightName
Else
Wscript.Echo objItem.StandardName
End If
Next
Jak widać, nie jest to bardzo skomplikowany skrypt. Zaczynamy od połączenia się z usługą WMI na komputerze lokalnym, a następnie używamy poniższego wiersza kodu w celu pobrania kolekcji stref czasowych, do których należy nasz komputer:
Set colItems = objWMIService.ExecQuery("Select * From Win32_TimeZone")
TAK. TAK. To odpowiedzi na Wasze pytania. Pierwsza odpowiedź dotyczy pytania „czy można uruchomić skrypt na komputerze zdalnym?”, musimy tylko przypisać nazwę tego komputera do zmiennej strComputer, w następujący sposób:
strComputer = "atl-fs-01"
Drugie TAK - nasza kolekcja będzie zawierała tylko jeden element, ponieważ zgodnie ze wszystkimi zasadami fizyki komputer może znajdować się tylko w jednym miejscu, o jednej porze i w jednej strefie czasowej, u ludzi też tak chyba jest (oczywiście nie dotyczy to Sai Baby).
Uwaga. Oczywiście o wiele fajniej byłoby znajdować się w kilku miejscach jednocześnie, teraz na przykład z chęcią znajdował bym się w Barcelonie…
Skoro o strefach czasowych, to jak zapewne wiecie (głównie z autopsji), większość świata zmienia czas dwa razy do roku, przez pół roku mamy więc do czynienia z czasem letnim, przez następne pół z czasem zimowym (jesteśmy chyba jedynym punktem na świecie w którym czas zimowy, a przynajmniej pogoda zimowa, rządzi przez bite 12 miesięcy). Chociaż w sumie może to Was zupełnie nie interesować. Interesują Was za to na pewno nazwy konkretnych stref czasowych. W tym celu właśnie zamierzamy ustawić pętlę For Each, która przejdzie przez całą kolekcję stref czasowych). Skomplikowane? Skądże:
For Each objItem in colItems
Wscript.Echo objItem.Caption
Next
Powinno nam to dać następujący rezultat:
(GMT-08:00) Pacific Time (US & Canada)
Teraz już wiemy jaki jest czas komputera, z którego został uruchomiony nasz skrypt (czas pacyficzny). Nie mówi nam jednak, czy jest to czas letni, czy zimowy. Spróbujmy zobaczyć czy to też uda nam się odgadnąć. Jest to przecież rzecz, z którą przeciętny Skrypciarz powinien się uporać, no nie?
Mając to na uwadze, wewnątrz pętli uruchamiamy następujący wiersz kodu:
Set colItems2 = objWMIService.ExecQuery("Select * From Win32_ComputerSystem")
Jeżeli myślicie sobie: „Hmm, wygląda to jak kwerenda WMI”, to macie rację – korzystamy z kolejnej kwerendy WMI. Chociaż klasa Win32_TimeZone mówi nam wiele o danym komputerze, łącznie ze strefą czasową, to nie mówi nam jednak, czy komputer działa obecnie w czasie zimowym, czy letnim. Aby uzyskać tę informację, potrzebujemy kwerendy klasy Win32_ComputerSystem, co też właśnie zrobiliśmy.
Teraz musimy uruchomić kolejną pętlę For Each, tym razem w celu przejścia przez kolekcję danych zwróconą przez klasę Win32_ComputerSystem (tutaj także kolekcja powinna zawierać jeden element). Wewnątrz pętli korzystamy z następującego wiersza kodu w celu przypisania wartości właściwości DaylightInEffect do zmiennej blnDaylightInEffect:
blnDaylightInEffect = objItem2.DaylightInEffect
Dlaczego właśnie tak? DaylightInEffect to wartość typu logicznego, która mówi nam czy komputer jest uruchomiony w czasie letnim. Jeżeli właściwość DaylightInEffect będzie równa True, to oznacza to, że komputer jest uruchomiony w czasie letnim, jeżeli zaś będzie równa False, to będzie to dla nas oznaczać czas zimowy. Oznacza to również, że musimy sprawdzić jaka jest wartość blnDaylightInEffect i przywołać następujące echo:
If blnDaylightInEffect Then
Wscript.Echo objItem.DaylightName
Else
Wscript.Echo objItem.StandardName
End If
Jak zapewne domyśliliście się DaylightName podaje nam nie tylko strefę czasową, ale określa dodatkowo, czy komputer działa obecnie w czasie letnim. Nazwa StandardName podaje nam… w sumie domyślcie się sami. Kiedy uruchomiliśmy nasz skrypt 26 listopada 2007 w Redmond, otrzymaliśmy następująca informację:
Pacific Standard Time
Dlaczego tak? Ponieważ nasz komputer działa obecnie w pacyficznym czasie zimowym. Jeżeli jednak uruchomilibyśmy skrypt miesiąc temu, kiedy obowiązywał jeszcze czas letni, powinniśmy otrzymać następującą informację zwrotną:
Pacific Daylight Time
Jak już wspomnieliśmy, taka informacja jest bardzo przydatna, szczególnie w firmach, które mają komputery zarówno w stanie Waszyngton (gdzie używa się czasu letniego) oraz w Arizonie (gdzie tego się nie robi).
Mamy dla Was jeszcze bonus: jak mówiliśmy wcześniej , klasa Win32_TimeZone udziela wielu informacji na temat danego komputera, podaje na przykład strefę czasową. Czego nie powiedzieliśmy to tego, że podaje nam ponadto dokładną datę zmiany czasu (do przodu - przejście na czas letni i do tyłu – na czas zimowy). Oto skrypt, który podaje nam tę informację:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_TimeZone")
For Each objItem in colItems
Wscript.Echo "Daylight Saving Time begins: " & _
objItem.DaylightMonth & "/" & objItem.DaylightDay
Wscript.Echo "Standard Time begins: " & _
objItem.StandardMonth & "/" & objItem.StandardDay
Next
Po połączeniu się z klasą Win32_TimeZone możemy ustalić dokładną godzinę przestawienia czasu z letniego na zimowy:
Wscript.Echo "Daylight Saving Time begins: " & _
objItem.DaylightMonth & "/" & objItem.DaylightDay
Przywołujemy tutaj echo właściwości DaylightMonth oraz DaylightDay (i formatujemy je tak, żeby wyglądały na datę), pierwsza reprezentuje oczywiście miesiąc danego troku, a druga dzień, w którym zacznie obowiązywać czas letni. Dla wszystkich Skrypciarzy w Redmond wynik powinien być następujący:
Daylight Saving Time begins: 3/2
Oznacza to dla nas, że 2 marca 2008 będziemy musieli przestawić zegarki o godzinę do przodu. Chcecie wiedzieć, kiedy będziecie mogli dłużej spać, bo cofa się zegarki? Musicie po prostu powtórzyć ten proces dla czasu zimowego, czyli użyć właściwości StandardMonth oraz StandardDay. Wynik powie
nam, kiedy nastąpi ta magiczna data spania o godzinę dłużej:
Standard Time begins: 11/1
I tak dalej w nieskończoność.
Muszę lecieć, bo zbliżam się już chyba do końca kolejki z 5 produktami…
Do początku strony |