14 мая 2010 г.

NET TIME и w32time

Автор: Райан Сайзмор.
Оригинал на английском: NET TIME and w32time.

Похоже, существует некоторая неопределенность относительно связи w32time и команды NET TIME. Вот информация, что называется, из первоисточника.

Самое главное

Как вы все знаете (или, по крайней мере, должны знать), w32time - служба времени Windows, которая работает почти на всех компьютерах под управлением Windows 2000 и более поздних версий. Она состоит из службы времени (w32time) и пользовательского приложения для управления и диагностики (w32tm.exe). Служба выполняет синхронизацию времени с использованием UDP-порта 123 и протокола NTP. Взаимодействие w32tm.exe со службой времени осуществляется посредством специального RPC-интерфейса. В отличие от службы времени, NET TIME (точнее, приложение net.exe) является пользовательской утилитой для сверки часов с часами удаленного компьютера с использованием совершенно другого механизма. Приложение net.exe из каталога System32 - в некотором смысле "мастер на все руки", с помощью которого можно изменять различные элементы конфигурации операционной системы.

Как работает команда NET TIME

Приложение net.exe существует появилось довольно давно, возможно, еще до выхода Windows 2000. Все возможности net.exe обеспечиваются функциями библиотеки NetApi32.dll: NetUserAdd, NetUserChangePassword, NetJoinDomain и т.д. В этом списке есть функция NetRemoteTOD, которая используется в команде NET TIME. Эту функцию можно вызвать для получения времени на удаленном компьютере с использованием RPC. Вы можете сказать: "Райан, зачем мне использовать команду NET TIME, если я могу набрать 'w32tm /stripchart' и получить те же самые сведения более точно?" Я рад, что вы спросили.

Теперь самое время перечитать одно предложение из предыдущего абзаца. Функцию NetRemoteTOD можно вызвать для получения времени на удаленном компьютере с использованием RPC. Здесь важно то, что взаимодействие осуществляется посредством RPC, а не NTP, именно поэтому команда NET TIME полезна и в настоящее время. Предположим, на каком-то компьютере по некоторой причине не работает служба времени, например, в связи с отказом или неверной настройкой. Если вам необходимо узнать время на этом компьютере, то в случае с w32tm.exe вас постигнет неудача. w32tm.exe использует протокол NTP, поэтому для получения результатов требуется работа службы времени на удаленном компьютере. NetRemoteTOD использует RPC, и для того, чтобы узнать время на удаленном компьютере, достаточно чтобы на нем работала служба "Удаленный вызов процедур (RPC)". В этом и заключается сила NET TIME.

Однако, команда NET TIME не безупречна. В типовых условиях контроллеры домена (к которым обычно направляется вызов NetRemoteTOD) могут быть недоступны каждой машине домена. С другой стороны, UDP-порт 123, используемый службой времени, редко блокируется.

Как пользоваться командой NET TIME

C:\>net
The syntax of this command is:
NET
[ ACCOUNTS COMPUTER CONFIG CONTINUE FILE GROUP HELP
HELPMSG LOCALGROUP PAUSE SESSION SHARE START
STATISTICS STOP TIME USE USER VIEW ]


Нас интересует аргумент 'TIME' (ниже приведены данные для Windows 7):

C:\>net help time
The syntax of this command is:

NET TIME

[\\computername /DOMAIN[:domainname] /RTSDOMAIN[:domainname]] [/SET]

NET TIME synchronizes the computer's clock with that of another computer
or domain, or displays the time for a computer or domain. When used without
options on a Windows Server domain, it displays the current
date and time at the computer designated as the time server for the domain.

\\computername Is the name of the computer you want to check or
synchronize with.

/DOMAIN[:domainname] Specifies to synchronize the time from the Primary Domain
Controller of domainname.

/RTSDOMAIN[:domainname] Specifies to synchronize with a Reliable Time Server
from domainname.

/SET Synchronizes the computer's time with the time
on the specified computer or domain.

The /QUERYSNTP and /SETSNTP options have been deprecated. Please use w32tm.exe
to configure the Windows Time Service.

NET HELP command MORE displays Help one screen at a time.


Как видите, у команды есть набор параметров, для каждого из которых требуется пояснение. По умолчанию, при запуске команды NET TIME без параметров выполняется попытка обнаружения контроллера домена (используя DC Locator) и последующий вызов NetRemoteTOD для получения времени на этом контроллере домена.

У команды NET TIME есть три параметра, определяющих ее поведение. Параметр /DOMAIN используется для задания имени домена, в котором нужно искать контроллер домена с флагом TIMESERV. Параметр /RSTDOMAIN работает так же, за исключением того, что ищет контроллер домена с флагом GTIMESERV. Параметр /SET используется для установки на локальном компьютере такого же времени, как и на удаленном компьютере.

В конце концов, можно вызвать команду NET TIME для синхронизации часов с машиной, которая не является контроллером домена.

Вы, наверное, также заметили у команды NET TIME параметры и /QUERYSNTP /SETSNTP. До появления w32tm.exe они использовались для указания сервера, с которым должна синхронизироваться служба w32time. С тех пор, как эту работу выполняет w32tm.exe, параметры и /QUERYSNTP /SETSNTP стали менее значимыми.

Практика

Команда NET TIME без параметров возвращает время на контроллере домена. Контроллер домена выбирается произвольным образом: единственный критерий отбора - наличие флага TIMESERV, означающего, что это сервер времени домена.

С помощью параметра /DOMAIN можно указать нужный домен:

C:\>net time /DOMAIN:mydomain.com
Current time at \\DC-01.mydomain.com is 8/7/2009 10:04:12 AM


Кроме того, можно явно указать контроллер домена:

C:\>net time \\DC-01.mydomain.com
Current time at \\DC-01.mydomain.com is 8/7/2009 10:06:01 AM

На самом деле необязательно обращаться к контроллеру домена. Я могу обратиться к локальной машине, используя NetRemoteTOD:

C:\>net time \\localhost*
Current time at \\localhost is 8/7/2009 10:12:11 AM


Примечание. Команда NET TIME без указания имени машины ищет источник времени, используя DC Locator. У машины, на которой служба времени по какой-либо причине не работает, флаг TIMESERV, скорее всего, установлен не будет. Тем не менее, можно проверить время на удаленной машине, явно указав ее имя.

* Для обращения к локальной машине вместо "localhost" следует указать имя локального компьютера (исключение составляет случай, когда ваш компьютер действительно называется "localhost") или набрать команду "net time \\%computername%" (если, например, вы не знаете, как называется компьютер). - Примечание переводчика.

Комментариев нет:

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