понедельник, 17 октября 2011 г.

Изменение часового пояса на компьютерах локальной сети

Иногда может возникнуть необходимость в установке другого часового пояса на множестве сетевых машин. В ручную это делать неудобно и муторно. Воспользуемся консольными командами. Однако вся сложность оказалась в том, что в различных версиях Windows разные команды для данных манипуляций.

Возьмем для примера часовой пояс+03 Багдад: Arabic Standard Time или по-русски Багдадское время.
Доступные пояса можно посмотреть в этой ветке реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.

Windows 2000
Консольная команда:
RunDLL32.exe shell32.dll,Control_RunDLL timedate.cpl,,/Z Arabic Standard Time

Windows XP & 2003
Консольная команда:
tzchange.exe /c "Arabic Standard Time"

Windows Vista & 2008
К сожалению не существует для этих версий корректной команды смены времени, но можно выкрутиться через изменение реестра и рестарт сервиса:
reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v TimeZoneKeyName /t REG_SZ /d "Arabic Standard Time" /f
net stop w32time
net start w32time

Windows 7 & 2008 R2
Консольная команда:
tzutil.exe /s "Arabic Standard Time"

Для автоматизации изменения часового пояса в домене можно воспользоваться следующим cmd-скриптом:

@echo off
rem For English name of time zone
set varen=Arabic Standard Time
rem For Russian name of time zone
set varru=Багдадское время
rem For Windows XP and 2003
if exist %windir%\system32\tzchange.exe (
reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v StandardName|find "%varen%"||reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v StandardName|find "%varru%"
if errorlevel == 1 (
tzchange.exe /c "%varen%"
)
) else (
rem For Windows 7 and Server 2008 R2
if exist %windir%\system32\tzutil.exe (
tzutil.exe /g|find "%varen%"
if errorlevel == 1 (
tzutil.exe /s "%varen%"
)
) else (
rem For Windows 2000 without reg.exe
if not exist %windir%\system32\reg.exe (
RunDLL32.exe shell32.dll,Control_RunDLL timedate.cpl,,/Z %varen%
) else (
reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v TimeZoneKeyName
rem For Windows 2000 with reg.exe
if errorlevel == 1 (
reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v StandardName|find "%varen%"||reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v StandardName|find "%varru%"
if errorlevel == 1 (
RunDLL32.exe shell32.dll,Control_RunDLL timedate.cpl,,/Z %varen%
) else (
exit
)
) else (
rem For Windows Vista and Server 2008
reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /f "%varen%" /d
if errorlevel == 1 (
reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v TimeZoneKeyName /t REG_SZ /d "%varen%" /f
net stop w32time
net start w32time
)))))


В начале скрипта нужно лишь поменять две переменные на соответствующий часовой пояс(одна английский вариант, вторая - русский). Работает для всех версий Windows, так как предусматривает все возможные варианты и команды. В домене для применения удобнее всего использовать групповые политики.

2 комментария:

  1. Спасибо... Сегодня это было очень актуально... Но скрипт почему-то не отрабатывает

    ОтветитьУдалить
  2. Если правильно перенесли текст в cmd-шник, от линии до линии, без лишних строк, пробелов, переносов - должно работать. Проверялось на всех указанных ОС, как локально так и через политику домена.
    Проверил текущий текст на наличии опечаток, но таковых не нашел...
    Смогу помочь, если более подробно опишете, каким образом запускаете скрипт.

    ОтветитьУдалить