Назад | Перейти на главную страницу

Найдите процесс Windows, который переводит время на 1 час назад

У меня есть машина с Windows, которая периодически меняет системное время по неизвестным причинам. Кажется, это происходит каждый час.

Эта машина Windows является виртуальной машиной (Parallels Desktop 9, гость Win7, хост OSX). Имеет службу NTP (NetTime), который быстро исправляет ошибку, но в те короткие несколько секунд между изменением и исправлением вызывает проблемы.

Я проверил:

Есть осложнение. У нас работает ночная астрономическая служба. Чтобы избежать проблем, связанных с автоматическим изменением летнего времени, мы отключаем автоматическое изменение летнего времени и вручную устанавливаем часовой пояс машины позже днем ​​в зону с правильным смещением. Например, в Испании сейчас летнее время. Стандартное время - UTC + 1, летнее время - UTC + 2. На следующее утро после перехода на летнее время мы установили часовой пояс компьютера на UTC + 2 Греции. Хост-компьютер настроен нормально (правильный часовой пояс, автоматическая смена летнего времени). Сложность заключается в том, что часы возвращаются к текущему времени в UTC + 1 (время до перехода на летнее время).

НЕКОТОРЫЙ процесс меняет это. Возможно, у него есть собственный часовой пояс. Но мне не удалось его отследить. Изменения регистрируются в системном журнале. Есть два ключевых пункта: когда время установлено неправильно, и когда оно исправлено:
(Полное раскрытие, журнал событий фильтруется по идентификатору события = 1, но другие события кажутся бессмысленными).

Интересно, насколько регулярно это происходит (каждый час, с точностью до секунды). Что еще интереснее, это часы время безотказной работы. Я могу следить за временем работы системы в диспетчере задач, и когда он тикает более часа, часы меняются.

Также интересно посмотреть на детали мероприятия:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
    - <System> 
        <Provider Name="Microsoft-Windows-Kernel-General" Guid="{GUID}" /> 
        <EventID>1</EventID> 
        <Version>0</Version> 
        <Level>4</Level> 
        <Task>0</Task> 
        <Opcode>0</Opcode> 
        <Keywords>0x8000000000000010</Keywords> 
        <TimeCreated SystemTime="2018-04-18T00:31:28.500000000Z" /> 
        <EventRecordID>500706</EventRecordID> 
        <Correlation /> 
        <Execution ProcessID="4" ThreadID="56" /> 
        <Channel>System</Channel> 
        <Computer>T07-VM-GUEST</Computer> 
        <Security UserID="SID" /> 
    </System> 
    - <EventData> 
        <Data Name="NewTime">2018-04-18T00:31:28.500000000Z</Data> 
        <Data Name="OldTime">2018-04-18T01:31:28.861800000Z</Data> 
    </EventData> 
</Event>

Мы можем видеть, что это событие изменяется с 01:31 до 00:31 (время UTC, с 03:31 до 02:31 по местному времени, как показано в журнале событий). Что особенно интересно, так это строка:

<Execution ProcessID="4" ThreadID="56" /> 

PID 4 - это System обработать:

Используя ProcessExplorer, я могу проверить системный процесс (PID 4) и увидеть некоторые подробности в ThreadId 56 (при условии, что они не будут переработаны, и я ищу правильный):

Но для меня это все чушь. Единственная значимая вещь, которую я здесь вижу, - это время начала и то, как оно соотносится с временем события изменения часов (как я сказал выше, каждый час синхронно с временем работы).

Этот ответ говорит об обнаружении изменений времени в журнале безопасности, и все изменения, инициированные службой NetTime, находятся там. Но подозрительно отсутствуют проблемные изменения:

Прав ли я в своем анализе, и если да, то почему системный процесс меняет мои системные часы каждый час?

Хорошо, как и все худшие типы проблем, у этой есть две части.

  1. Windows обновляет системное время каждый час до аппаратных часов. (Обратите внимание, это также происходит при загрузке, что ускорило тестирование)
  2. Parallels неправильно виртуализировала аппаратные часы. Я должен сказать, что использую старую версию Parallels (PD9), я надеюсь, что они уже исправили это.

Я не нашел окончательного заявления об этом, но я видел множество людей на моем месте, подтверждающих то же самое: каждый час Windows считывает часы реального времени (RTC или аппаратные часы в BIOS) и повторно синхронизирует их. с этим. См. Ссылки: # 1, # 2, # 3, # 4.

Очевидно, что большинство из них связано с неисправным RTC, разряженными батареями BIOS или двойной загрузкой с ОС * nix (которая сохраняет UTC в RTC, а не местное время). Но факт остается фактом: Windows будет делать это каждый час. Я пока не нашел способ отключить это.

Кроме того, Parallels не хранит аппаратные часы как таковые, вместо этого сохраняет смещение (от системного времени) в файле конфигурации виртуальной машины. Проблема в том, что это смещение неправильно учитывает летнее время. Так, например, у меня есть хост Mac в Мадриде, Испания, который обычно является UTC + 1, но в настоящее время в летнее время это UTC + 2. Когда я устанавливаю время на своей гостевой машине, Parallels вычисляет разницу между моим гостевым временем и часовым поясом хоста БЕЗ DST.

Приведем пример:
Текущее время - UTC 00:00.
Стандартное время Мадрида будет UTC + 1, поэтому 01:00. За исключением того, что сейчас летнее время, UTC + 2, 02:00. Я установил гостевую машину на 02:00, Windows пытается записать это в RTC, Parallels вычисляет разницу между моим гостевым временем и Madrid Standard (01:00) и сохраняет <TimeShift>-3600</TimeShift> в файл конфигурации (файл обновляется только при перезагрузке, я полагаю, эта переменная отслеживается в памяти во время выполнения). Таким образом, каждый раз, когда Windows считывает RTC (Parallels считывает системное время хоста), она думает, что RTC установлено на HostTime-3600s (-1 час), и обновляет время.

Я знаю, что моя гостевая машина имеет сложную настройку (вручную настроена на Каир, чтобы найти часовой пояс без DST), я подумал, что предоставлю Parallels преимущество сомнения и посмотрю, правильно ли она работает с гостевым и хостом, настроенным на правильный часовой пояс (Мадрид с летним временем). Нет, он все еще лажает.

Решение:
Я не могу найти способ запретить Windows читать RTC каждый час, поэтому на данный момент я заставил хост-машину использовать часовой пояс, который не использует DST (например, Каир, UTC + 2). Это работает. Когда я сохраняю время своего гостя до 02:00, а время Каира (UTC + 2) - 02:00, Parallels сохраняет <TimeShift>0</TimeShift>.

Некрасиво.

Для программного обеспечения доступны два времени: системное время и местное время. Системное время не должно обновляться независимо от настройки летнего времени. время местное. Если это не так, значит, в вашей ОС или, что более вероятно, в приложении есть ошибка программирования. возможно, приложение использует, например, GetLocalTime (), когда следует использовать GetSystemTime (), а пользовательский интерфейс ошибочно указывает, что это системное время.