Когда в последний раз были синхронизированы часы [решено]

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Когда в последний раз были синхронизированы часы [решено]

Сообщение shraibikus » 17.07.2020 19:08:29

Здравствуйте.

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

В Windows существует штатная консольная команда:
Код: Выделить всё
w32tm /query /status

Которая в принципе возвращает нужное нам значение, например в строке:
Время последней успешной синхронизации: 17.07.2020 19:49:46


В штатной панели управления настройка часов и их синхронизации это время так же "светится".

Однако, я так и не понял где это время "сохраняется" и можно ли его как то "вытащить" средствами автоматизации (WMI или еще что) что бы использовать в своих целях?
Вариант парсить командную строку рассматривался, но не очень нравится, ибо:
а) попадались станции на американском времени (там где делители не точка, а /);
б) попадались станции где эта команда возвращает вообще что то вроде "служба не работает" (проверял: служба - работает, время синхронизировано, в панели управления всё ок), а именно команда - ругается (мб и какие заморочки с правами, но я планирую компилированный проект отправлять в свободное плавание, в дикую природу - где возможности "исправить" работу командной строки нет и не будет);
в) попадались станции где синхронизация не настроена - и тогда парсить вывод этой команды усложняется, при условии что станции бывают и не на русском языке.

Есть тут люди которые могут предложить решение возникшего вопроса?
Последний раз редактировалось shraibikus 18.07.2020 16:46:27, всего редактировалось 1 раз.
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень

Re: Когда в последний раз были синхронизированы часы

Сообщение Снег Север » 17.07.2020 19:55:28

сохраняется в реестре
HKLM\System\CurrentControlSet\Services\w32time
Значения параметров наверняка где-то расписаны :D
Конечно, на вин7 и выше нужны админские права для доступа к службе W32Time и если синхронизация не запущена и не настроена, то никакого результата не получится.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2626
Зарегистрирован: 27.11.2007 16:14:47

Re: Когда в последний раз были синхронизированы часы

Сообщение shraibikus » 17.07.2020 20:03:09

Снег Север писал(а):Значения параметров наверняка где-то расписаны

Нашел инфу, спасибо, курю)
https://tickets.puppetlabs.com/browse/P ... ent-363096

Формат FILETIME, нужно как то сконвертировать его хотя бы в SYSTEMTIME.
https://docs.microsoft.com/en-us/window ... systemtime

Похоже всё что нужно нашел, пойду опробую. Результат сохраню для истории тут.
https://www.freepascal.org/docs-html/rt ... etime.html
Последний раз редактировалось shraibikus 17.07.2020 20:08:43, всего редактировалось 2 раз(а).
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень

Re: Когда в последний раз были синхронизированы часы

Сообщение Vadim » 17.07.2020 20:03:51

Снег Север писал(а):Конечно, на вин7 и выше нужны админские права для доступа к службе W32Time и если синхронизация не запущена и не настроена, то никакого результата не получится.

Для компьютеров в домене эта настройка происходит автоматом, без участия пользователя. Комп-клиент синхронизируется с контроллером домена. Я сейчас не помню, какие настройки там используются, но при вводе компа в домен, автоматически настраивается и служба времени.
Vadim
долгожитель
 
Сообщения: 3912
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Когда в последний раз были синхронизированы часы

Сообщение shraibikus » 17.07.2020 20:57:57

Нет, не нашел.
FileDateToDateTime конвертит из LongInt'а, в масштабах LongInt'а (от - 2147483648 до 2147483647)
https://www.freepascal.org/docs-html/rt ... etime.html

а у меня конкретно QWord, с масштабами QWord ( [0..18446744073709551615] ), как его туда "впихнуть"?
Простое
Код: Выделить всё
FileDateToDateTime(LongInt(QWordValue));

увы не помогает. Куда еще можно посмотреть?

Добавлено спустя 14 минут 13 секунд:
Так, сделал.

Код примерно такой:
Код: Выделить всё
uses
  // ..
  SysUtils, dateutils,  registry,  Windows,
  // что то из этого в конкретно этом примере возможно даже лишнее

  // ...

var
  stTmp: TSystemTime;

// ...

  Regi := TRegistry.Create;
  Regi.RootKey:=HKEY_LOCAL_MACHINE;
  try
    if Regi.OpenKeyReadOnly('\SYSTEM\CurrentControlSet\Services\W32Time\Config\') then begin
       qwLastGT := Regi.ReadInt64('LastKnownGoodTime');
    end
    else qwLastGT := 18446744073709551615;
  finally
    Regi.Free;
  end;
  WriteLn('qwLastGT: ' + IntToStr(qwLastGT));
  if (qwLastGT < 18446744073709551615) then begin
      Windows.FileTimeToSystemTime(FILETIME(qwLastGT), stTmp);
      dtLastGT := SystemTimeToDateTime(stTmp);
      WriteLn('Last Good Time: ' + DateTimeToStr(dtLastGT));
  end;


В общем, Спасибо!
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru