Centrum Skryptów - Systemy Operacyjny

Jak pobrać na komputer informację na temat strefy czasowej?

Udostępnij na: Facebook

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 Do początku strony

Centrum Skryptów - Systemy Operacyjny