Скрипт для изменения часовых поясов Украины, Беларуси и Армении

Прямо за Россией правительства Украины*, Беларуси и Армении решили отменить переход на сезонное время в конце октября 2011 года. Но такое решение было принято намного позже чем в Рф, в итоге чего на подготовку к этому событию осталось не много времени. Компания Майкрософт выпустила обновление Windows, где меняются часовые пояса в России- KB2570791, а вот для Армении, Украины и Беларуси такового обновления пока нет. Майкрософт обещает выпустить его в декабре 2011 года. Не считая того, для Windows 2000 обновлений нет, и помощи сумеют ожидать только счастливые владельцы Microsoft Services Premier Support.

В связи с этим в Веб появилось огромное количество советов по выходу из этой ситуации. Майкрософт, к примеру, предлагает пользоваться подобными часовыми поясами государств, где сезонное время уже отменено: (+03:00) Калининград для Украины и Беларуси либо (+05:00) Ташкент для Армении, соответственно. Мне приглянулся вариант предлагаемый Дмитрием Булановым в его статье на OsZone.net.

Но вариант REG- файла предложенный им неправильно отрабатывал на Windows XP, а внедрение REG-файла усложняло внедрение предпочтений групповой политики.

Исследовав документацию, я написал собственный вариант скрипта для конфигурации часового пояса. Но обо всем по порядку.

* 19 октября 2011 года правительство Украины решило отменить решение об отмене перехода на зимнее время. Таким макаром жителям этой страны изменять часовой пояс в этом году не пригодиться.

Теория

За предназначение и корректное отображение часового пояса в реестре Windows отвечает раздел

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTime Zones*Имя часового пояса*

Зависимо от версии операционной системы в нем хранятся характеристики, определяющие определенный часовой пояс.

Для Windows XP/2003 это характеристики:

Display
Dlt
Std
Index
MapID
TZI

Для Windows Vista и выше добавились еще несколько характеристик:

MUI_Display
MUI_Std
MUI_Dlt

Нас заинтересовывают характеристики, которые критичны для смены часового пояса:

Display – отвечает за отображение часового пояса в перечне выбора часовых поясов.

Dlt – задает заглавие летнего времени.

Std – «Стандартное» зимнее время.

TZI – Важнейший параметр. Это база данных о временном смещении, времени перехода на летнее время и т.д. Из этого параметра всякий раз при смене часового пояса создаются характеристики в разделе реестра

HKLMSYSTEMCurrentControlSetControlTimeZoneInformation

Ах так описывается структура ключа TZI на MSDN:

typedef struct _REG_TZI_FORMAT
{
LONG Bias;
LONG StandardBias;
LONG DaylightBias;
SYSTEMTIME StandardDate;
SYSTEMTIME DaylightDate;
} REG_TZI_FORMAT;

Таким макаром, в одном бинарном ключе перечисляются последующие характеристики: Bias, StandardBias, DaylightBias, StandardDate, DaylightDate. О значении этих характеристик также можно прочитать на MSDN.

Зависимо от языка и версии Windows, в раздел TimeZoneInformation копируются характеристики отображения часовой зоны в графическом интерфейсе. В Windows XP эти значения берутся из ключей реестра Display, Dlt, Std, а начиная с Vista из соответственной библиотеки локализации(MUI). Но для сопоставимости остаются и старенькые характеристики Display, DaylightName и т.д.

Сравнение характеристик в разделах TimeZone и TimeZoneInformation видно на картинке, взятой из увлекательной статьи в блоге BCL Team:

Скрипт для конфигурации часовых поясов Украины, Беларуси и Армении

Что любопытно, начиная с Windows Vista, Майкрософт отказалась от карты в окне смене часового пояса, а ведь эта карта была там, начиная с Windows 95, и для каждого часового пояса в реестре хранились координаты.

В реестре есть также раздел:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTime Zones*Имя часового пояса*DYNAMIC DST (DYNAMIC DAYLIGHT SAVING TIME)

Этот раздел хранит историю конфигураций часовых поясов по годам. Windows XP и Windows Server 2003 обновляют этот ключ средством накопительных обновлений. Для Windows 2000 такая поддержка прекращена. Хотя это не означает, что нельзя поменять эти значения вручную.

Резюме теоретической части

Сейчас можно сделать метод сотворения часового пояса для хоть какой точки земного шара:

Нужно сделать новый раздел реестра в ветке HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTime Zones для вашего часового пояса. В моем случае это Minsk Standard Time.
Задать корректные значения характеристик Display, Dlt, Std, TZI.
Поменять часовой пояс на вновь сделанный, каким- или методом (дальше описаны вероятные варианты).

Скрипт для конфигурации часового пояса

Я написал вам маленький скрипт, который можно использовать для смены хоть какого часового пояса. Чтоб поменять его под собственный часовой пояс, нужно изменять русское написание часового пояса в шифровке OEM 866, а потом сохранить скрипт в шифровке ANSI 1251. К примеру, если вы используете для редактирования программку Notepad2, то редактирование при помощи стремительных кнопок будет смотреться так:

Открыть скрипт;
Ctrl+A (Выделить все);
Ctrl+Shift+O (Конвертировать текст в шифровку OEM 866);
Отредактировать русские наименования часового пояса и характеристики для вашего часового пояса;
Ctrl+A (Выделить все);
Ctrl+Shift+A (Конвертировать текст в шифровку ANSI 1251);
Ctrl+S (Сохранить)

Другие методы сохранения в шифровке OEM смотрите тут.

Загрузите архив со скриптом с OsZone.net: скачать, или скопируйте текст скрипта ниже в Блокнот и сохраните его в шифровке ANSI как tz.cmd:

@Echo off
Rem Belarus timezone change utility(UTC+3 Minsk)
Rem (c) Azarov Denis 01/10/2011
Rem mail to volk1234@mail.ru
Rem forum page http://www.oszone.net/16420/Daylight_Saving_Time
Rem v 0.5 15.10.2011
:set_start_time
Set start_time=%TIME:~0,-3%
Set start_time=%start_time::=%
Set start_time=%start_time: =0%
Set start_time=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%start_time%
Rem Detecting OS,language and current tz registry key name :D etectEnv
For /F «Tokens=3″ %%A In (‘Reg Query «HKLMSYSTEMCurrentControlSetControlNlsLanguage» /V InstallLanguage’) Do Set OSLang=%%A
For /F «Tokens=3*» %%A In (‘Reg Query «HKLMSOFTWAREMicrosoftWindows NTCurrentVersion» /V CurrentVersion’) Do Set OSver=%%A
If %OSver% GTR 5.2 (
Set Regkey4=HKLMSYSTEMCurrentControlSetControlTimeZoneInformation
) Else (
Set Regkey4=HKCUSoftwareMicrosoftWindows NTCurrentVersionTime Zones
)
For /F «Tokens=2*» %%i In (‘Reg Query «%Regkey4%» /V TimeZoneKeyName 2^>nul^|find /i «REG_SZ» 2^>nul’) Do Set TZKN=%%j
If %OSver% == 5.2 Set TZKN=E. Europe Standard Time
Rem windows 2003r2 whithout updates had ‘GTB Standart Time’ timezonename for Minsk, not E. Europe Standard Time. And it have not tzchange util.
Rem Setting Variables
:TZVARS
Set Regkey1=HKLMSOFTWAREMicrosoftWindows NTCurrentVersionTime Zones%TZKN%
Set Regkey2=HKLMSYSTEMCurrentControlSetControlTimeZoneInformation
Set TZIdata=»4cffffff00000000c4ffffff0000000000000000000000000000000000000000000000000000000000000000″
Set TZIdata2=»88ffffff00000000c4ffffff00000a0000000500030000000000000000000300000005000200000000000000″
Set Dllres1=»@tzres.dll,-1730″
Set Dllres2=»@tzres.dll,-1731″
Set Dllres3=»@tzres.dll,-1732″
Set DisplayEn=»(UTC+03:00) Minsk»
Set DisplayRu=»(UTC+03:00) ЊЁ­бЄ»
Set DltEn=Minsk Daylight Time
Set StdEn=Minsk Standard Time
Set DltRu=ЊЁ­бЄ®Ґ ўаҐ¬п («Ґв®)
Set StdRu=ЊЁ­бЄ®Ґ ўаҐ¬п (§Ё¬ )
Set Backupdir=»%TEMP%TZBY%start_time%»
Set Regkey3=HKLMSOFTWAREMicrosoftWindows NTCurrentVersionTime Zones%StdEn%
If «%OSLang%»==»0419″ (
Goto :LangRu
) Else (
Goto :LangEn
)
:LangRu
Set DLT=%DltRu%
Set STD=%StdRu%
Set DSPL=%DisplayRu%
Goto :Regbackup
:LangEn
Set DLT=%DltEn%
Set STD=%StdEn%
Set DSPL=%DisplayEn%
Rem Backup regisry
:Regbackup
If Not Exist %Backupdir% MD %Backupdir%
REG EXPORT «%Regkey1%» %Backupdir%TZ.reg >nul
REG EXPORT «%Regkey2%» %Backupdir%TZI.reg >nul
Echo @Echo Off>>%Backupdir%restore_tz.cmd
Echo. >>%Backupdir%restore_tz.cmd
Echo Regedit /s TZ.reg>>%Backupdir%restore_tz.cmd
Echo Regedit /s TZI.reg>>%Backupdir%restore_tz.cmd
Echo Reg Delete «%Regkey3%» /f>>%Backupdir%restore_tz.cmd
Echo. >>%Backupdir%restore_tz.cmd
If %OSver% LEQ 5.2 (
Echo Tzchange /c «%TZKN%»>>%Backupdir%restore_tz.cmd
)
If %OSver% GTR 5.2 (
Echo Tzutil /s «%TZKN%»>>%Backupdir%restore_tz.cmd
)
Echo. >>%Backupdir%restore_tz.cmd
Echo Exit /b0>>%Backupdir%restore_tz.cmd
Rem Main: making settings for timezone utc +0300 Minsk
:SettingTZ
REG ADD «%Regkey3%» /v Dlt /t REG_SZ /d «%STD%» /f >nul
REG ADD «%Regkey3%» /v Std /t REG_SZ /d «%STD%» /f >nul
REG ADD «%Regkey3%» /v Display /t REG_SZ /d %DSPL% /f >nul
REG ADD «%Regkey3%Dynamic DST» /v 2010 /t REG_BINARY /d %TZIdata2% /f >nul
REG ADD «%Regkey3%Dynamic DST» /v 2011 /t REG_BINARY /d %TZIdata% /f >nul
REG ADD «%Regkey3%Dynamic DST» /v FirstEntry /t REG_DWORD /d 0x000007da /f >nul
REG ADD «%Regkey3%Dynamic DST» /v LastEntry /t REG_DWORD /d 0x000007db /f >nul
REG ADD «%Regkey3%» /v TZI /t REG_BINARY /d %TZIdata% /f >nul
If %OSver% GTR 5.2 (
REG ADD «%Regkey3%» /v MUI_Display /t REG_SZ /d %Dllres1% /f >nul
REG ADD «%Regkey3%» /v MUI_Std /t REG_SZ /d %Dllres2% /f >nul
REG ADD «%Regkey3%» /v MUI_Dlt /t REG_SZ /d %Dllres3% /f >nul
REG ADD «%Regkey2%» /v StandardName /t REG_SZ /d %Dllres2% /f >nul
REG ADD «%Regkey2%» /v DaylightName /t REG_SZ /d %Dllres2% /f >nul
REG ADD «%Regkey2%» /v DynamicDaylightTimeDisabled /t REG_DWORD /d 0×00000001 /f >nul
REG ADD «%Regkey2%» /v TimeZoneKeyName /t REG_SZ /d «%StdEn%» /f >nul
tzutil /s «%StdEn%»
)
If %OSver% LEQ 5.2 (
tzchange /c «%StdEn%»
)
Exit /b0

Малость о том, как работает скрипт. Он определяет Ваш текущий часовой пояс и делает запасную копию подходящих разделов реестра. Путь к запасной копии: %Temp%TZBYдата и время пуска. Для восстановления прежних опций нужно запустить файл restore _tz.cmd.

Принципиально! В Windows Server 2003R2 после незапятанной установке отсутствует утилита tzchange и отличается часовой пояс – заместо текущего E. Europe Standard Time установлен GTB Standart time. Если все нужные обновления установлены, то скрипт отработает корректно.

Принципиально! При выходе официального обновления для часового пояса безотступно рекомендуется вернуть старенькые опции и потом применить обновление.

Потом скрипт изменяет часовой пояс зависимо от версии ОС (XP/2003/Vista/7/2008R2) и языка (RUSENG).

Основной неувязкой при изменении часового пояса через скрипт была установка этого пояса активным. В Windows XP/2003 и Windows 7 есть утилиты командной строчки tzchange и tzutil соответственно.

В Windows Vista такие утилиты отсутствуют, и поменять часовой пояс можно через GUI, или испытать изменение заглавие на необходимое командой

control timedate.cpl,,/Z Minsk Standard Time»

Добавлено позже: Как оказывается, компания Майрософт прислушалась к просьбам юзеров и выпустила обновление KB2556308 которое добавляет в операционные системы Windows Vista и Windows Server 2008 утилиту tzutil. После установки этого обновления, скрипт для смены часового пояса отработает как следует.

Также юзерам Windows 2000 можно пользоваться специальной утилитой TzEdit (ровная ссылка на загрузку). для редактирования часового пояса вручную.

Еще есть метод сделать сделанную зону активной – это очевидно указать ее заглавие в параметре TimeZoneKeyName и перезагрузить компьютер. В Windows XP/2003 и Vista/7/2008R2 этот параметр находится в различных местах реестра:

В Windows XP/2003:

HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionTime Zones

[REG_SZ] TimeZoneKeyName = Minsk Standart Time

В Windows Vista/7/2008R2:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTimeZoneInformation

[REG_SZ] TimeZoneKeyName= Minsk Standart Time

Если вы желаете выполнить скрипт на всех компьютерах в организации, находящейся в домене, применяйте предпочтения групповых политик для опции пуска скрипта, к примеру, через планировщик заданий. Как это сделать, описано тут.

В конце хотелось бы увидеть, что ручное изменение часового пояса не решит заморочек с такими программками как Exchange, Outlook, SQL и т.д. Для неких из этих программ уже есть утилиты либо исправления, для других еще разрабатываются.

Если у Вас есть вопросы по статье вы сможете задать их в этом блоге.

Полезные ссылки

Центр справки и поддержки по переходу на летнее и зимнее время;
Объявление Майкрософт касаемо отмены сезонного времени в Армении, Беларуси и Украине;
Статья KB2625508 в базе познаний;
TIME_ZONE_INFORMATION structure на MSDN;
Статья, описывающая смену часовых поясов в 2008 году в США и Канаде;
Microsoft Daylight Saving Time & Time Zone Blog;
Настройка перехода на летнее время в операционных системах Microsoft Windows;

Аналогичный товар: Комментирование на данный момент запрещено, но Вы можете оставить ссылку на Ваш сайт.

Комментарии закрыты.