Синхронизация времени в Windows

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,809
Реакции
6,574
Синхронизация времени в Windows

Абсолютно банальный пост, но не написать не могу. Как мне казалось, проблемы синхронизации времени уже нигде не существует, ведь каждый комп подключен к интернету. Ха! :) В нашей деревне есть еще организации, где самое точное время показывают часы, висящие над вахтершей бабой Клавой.

001.JPG

Наблюдал сегодня своими глазами в небольшой конторе. Парк машин порядка 15 компов. Домена никакого нет. Все компьютеры объеденины в локальную сеть двумя дешевыми китайскими свитчами. Один комп помимо этого имеет подключени к интернету по ADSL. Одмина в конторе нет, точнее он есть, но какой-то приходящий, который там появляется только в день выдачи зарплаты. На всех компах время разное с разбегом в 20 минут. Красота!

Освежим память и расскажем, как сделать порядок в этом вопросе.

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

Чтобы просто взять и синхронизировать время с сервером точного времени нужно всего-то в командной строке набрать:
Код:
net time \\имя_компа_сервера_точного_времени /set

Проще некуда. Если уж совсем лень читать дальше, то можно засунуть эту строку в cmd файл и в автозагрузку запихать. А мы дальше расскажем как сделать всё красиво.

Во-первых определим, какой IP-адрес у нашего сервера точного времени. Для примера пусть будет 192.168.1.1

Открываем командную строку и пишем там следующее:
Код:
w32tm /config /syncfromflags:manual /manualpeerlist:192.168.1.1

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

Затем, даем команду
Код:
w32tm /config /update

После этого среди всех сервером точного времени указываем приоритетный. В нашем примере он всего один, его и пишем:
Код:
net time /setsntp:192.168.1.1

Перезагружаем службу времени Windows
Код:
net stop w32time && net start w32time

И синхронизируем
Код:
w32tm /resync

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

Одмин, не ленись, сделай правильное время на компах!
 
Решение проблем с ошибкой синхронизации времени Windows

Выдержка из справки Windows:

В случае сбоя синхронизации часов:
По нажатии кнопки Обновить сейчас часы должны быть незамедлительно синхронизированы.
Попытка выполнить эту операцию может пройти неудачно по одной из следующих причин:
...
Слишком большая разница между временем, установленным на локальном компьютере и на сервере времени в Интернете. Сервер времени Интернета может не выполнить синхронизацию с часами на компьютере пользователя при разнице во времени более 15 часов. Чтобы правильно выполнить синхронизацию времени, убедитесь, что параметры даты и времени совпадают с текущим временем, установленным в окне «Свойства даты и времени» на панели управления.

Это ограничение можно обойти:
- рекомендую внимательно почитать и выполнить все, что написано в этой заметке.

Короче говоря, создаем и применяем вот такой твик реестра:

Код:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Config]
"MaxNegPhaseCorrection"=dword:ffffffff
"MaxPosPhaseCorrection"=dword:ffffffff

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Parameters]
"NtpServer"="pool.ntp.org,0x01"

Выберите сервер, к которому у Вас наименьший пинг.
Можно проверить через командную строку, например:
Код:
ping pool.ntp.org
ping 0.pool.ntp.org
ping 1.pool.ntp.org
ping ru.pool.ntp.org

А вот такой командой Вы можете запустить синхронизацию:
(из командной строки с повышенными привилегиями)
Код:
w32tm /config /update

Кроме того, синхронизация может не работать по причине отключенной службы.
Для автоматизации:
- включения службы w32time
- внесения в настройки сервера времени pool.ntp.org
- выполнения синхронизации
- перевода службы обратно в ручной режим (по-умолчанию)
я написал небольшой скрипт:

VB.NET / VBA:
with CreateObject("WScript.Shell")
    .Run "sc config w32time start= auto", 0, true
    .Run "net start w32time", 0, true
    .Run "w32tm /config /syncfromflags:manual /manualpeerlist:pool.ntp.org,0x01", 0, true
    .Run "w32tm /config /update", 0, true
    .Run "w32tm /resync", 0, true
    .Run "sc config w32time start= demand", 0, false
end with

Сохранять с расширением .VBS
Запускать с повышенными привилегиями.

Если Вам важно проверять успешность операции обновления времени,
можете воспользоваться вот таким вариантом скрипта (успех проверяется чтением результата от консольной команды w32tm)
и поддерживает как русскую так и английскую локализации систем:

VB.NET / VBA:
with CreateObject("WScript.Shell")
    .Run "sc config w32time start= auto", 0, true
    .Run "net start w32time", 0, true
    .Run "w32tm /config /syncfromflags:manual /manualpeerlist:pool.ntp.org,0x01", 0, true
    .Run "w32tm /config /update", 0, true
    set ExecObj = .Exec("w32tm /resync")
    sRet = CharsetConv(ExecObj.StdOut.ReadAll(), "ibm866", "windows-1251")
    .Run "sc config w32time start= demand", 0, true
    if instr(1, sRet, "Команда выполнена успешно", 1) <> 0 or instr(1, sRet, "The command completed successfully", 1) <> 0 then _
        WScript.Echo("Sync - Success.") else WScript.Echo("Sync - FAILED !!!")
end with

Function CharsetConv(Text, SourceCharset, DestCharset)
    with CreateObject("ADODB.Stream")
        .Type=2
        .Mode=3
        .Open
        .Charset = DestCharset
        .WriteText Text
        .Position=0
        .Charset = SourceCharset
        CharsetConv = .ReadText
    end with
End Function

Спасибо за внимание!
Всегда раз ответить на Ваши вопросы.
 
Последнее редактирование:
Phoenix, сеть с прокси? Скрипт запускал с повышенными привилегиями?
 
Нет прокси. С привилегиями сделал - то же самое. В программке отставание стабильное на 30 сек. Перезагрузку не делал, может повлияет, потом напишу.
 
Назад
Сверху Снизу