четверг, 26 мая 2011 г.

Date Time In My Network Синхронизация времени компьютеров сети

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

Для работы понадобится утилита PsExec.exe из набора Sysinternals PsTools Марка Руссиновича (англ. Mark Russinovich), она позволяет выполнить команду или запустить программу на удаленном компьютере.

Cобрать текущие показания времени со всех машин сети под управлением Windows XP, Vista, Windows 7.
Поможет нижеприведенный батник, у меня он сохранен под именем DateTimeInMyNetwork.cmd
@echo off
cls
::    считываю букву диска, которую система присвоила Flash-disk,
::    с него запускаются эти командные файлы и на нем в каталоге
::    x:\tools лежат вспомогательные программы,
::    и добавляю к переменной %PATH% путь к этим программам
set path=%~d0/tools;%path%
::    удаляю старый файл, если он есть
del "%TEMP%\networktime.log" 2>nul
set logfile="%TEMP%\networktime.log"
echo. >>%logfile%
echo #-------- %DATE% %TIME% --------# >>%logfile%
echo. >>%logfile%
::    выполняю команду для локального компьютера
Echo %date%    %time%    %ComputerName% >>%logfile%
::    создаю в текущей директории echotime.cmd который будет
::    скопирован на удаленный компьютер
>echotime.cmd Echo @Echo %%date%%    %%time%%    %%ComputerName%%
::    выполняю команду для всех компьютеров подсети
psexec \\* -c echotime.cmd >>%logfile%
del echotime.cmd
type %logfile% & echo. & pause
::    В некоторых сетях для локального компьютера считывать переменные не нужно.
::    Если браузинг в подсети работает плохо (net view - список в сети),
::    то pcexec с параметром \\* отработает только на тех компьютерах, которые
::    видны по net view в момент запуска командного файла содержащего
::    параметр \\*
Синхронизировать время по времени машины с которой запускается батник.

Обратите внимание, что для контроля правильности установки времени, вызывается вышеприведенный батник (командный файл, файл пакетной обработки)

@ECHO OFF
cls
if "%~1"=="" goto HELP
if "%~1"=="?" goto HELP
if "%~1"=="/?" goto HELP
if "%~1"=="-?" goto HELP
::    считываю букву диска, которую система присвоила Flash-disk,
::    с него запускаются эти командные файлы и на нем в каталоге
::    х:\tools лежат вспомогательные программы,
::    и добавляю к переменной %PATH% путь к этим программам
set path=%~d0/tools;%path%
::    сейчас настроена на синхронизацию сети с часами станции
::    где запускается этот командный файл
::    При пустом экране будет ожидать ввода пароля пользователя
::    В параметре передать имя учетной записи с административными правами
set mycomp=%computername%
echo.
echo Ведите пароль пользователя
echo.
echo Wating for account password
echo.
psexec.exe -u %1 -e \\*  NET TIME \\%mycomp% /SET /Y
ping -n 5 127.0.0.1 >nul
DateTimeInMyNetwork.cmd
goto :EOF
:HELP
echo.
echo.
echo  Использование:
echo.
echo   net_time_set.cmd USER
echo.
echo  где USER - имя учетной записи с правами администратора
echo.
echo.
echo.
pause>>nul
Проверить sntp на машинах:
@ECHO OFF
cls
::    считываю букву диска, которую система присвоила Flash-disk,
::    с него запускаются эти командные файлы и на нем в каталоге
::    х:\tools лежат вспомогательные программы,
::    и добавляю к переменной %PATH% путь к этим программам
set path=%~d0/tools;%path%
::    для всех станций подсети
psexec.exe \\*  NET TIME /querysntp | find "SNTP:"
::    для отдельной, имя передать в параметре.
rem    psexec.exe \\%1  NET TIME /querysntp
echo.
pause
Установить sntp для всех машин сети:
@ECHO OFF
cls
::    считываю букву диска, которую система присвоила Flash-disk,
::    с него запускаются эти командные файлы и на нем в каталоге
::    х:\tools лежат вспомогательные программы,
::    и добавляю к переменной %PATH% путь к этим программам
set path=%~d0/tools;%path%
::    До запуска убедиться, что UDP 123 порт открыт.
psexec.exe \\%1  NET TIME /setsntp:"ntp2.cs.wisc.edu ntp1.cs.wisc.edu"
::    пауза 5 сек
Ping -n 5 127.0.0.1
psexec.exe \\%1 net stop "Служба времени Windows"
Ping -n 5 127.0.0.1
psexec.exe \\%1 net start "Служба времени Windows"
Ping -n 5 127.0.0.1
psexec.exe \\%1 net time /querysntp | find "SNTP:"
Ping -n 5 127.0.0.1
psexec.exe \\%1 w32tm /resync /rediscover
echo.
pause

Последнее время в качестве sntp сервера, как правило использую наш ntp.time.in.ua Отличается хорошей доступностью и стабильностью.

См. также:

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

Анонимный комментирует...

Спасибо огромное!
Вся подборка - лучшие статьи.
По синхронизации - наполненнее и короче не видел. По другим - такого вообще не видел. Хотя, казалось бы, все просто. Но это - когда прочитаешь напмсанное другим. Что особенно отличает - тут все сжато и полно. Респект.

Yuriy комментирует...

Спасибо за отзыв. Будете использовать в работе, обратите внимание на то, что батники писались "на скорую руку" и тестировались большей частью на 32-х разрядной XP.

Отправить комментарий