Смена системной даты, чтобы протестировать приложение
Это самый старый трюк на свете: выставить часы Windows на дату, которую хотите проверить, запустить программу и вернуть часы обратно. Он работает — и пока часы сдвинуты, они сдвигают и всё остальное на машине.
Что на самом деле сдвигается вместе с часами
Системные часы не принадлежат одной лишь тестируемой программе. Каждый процесс, служба и сетевой обмен на машине читает одни и те же часы, поэтому изменение, сделанное ради одного теста, — это изменение для всех.
| Что читает часы | Что происходит, когда вы их сдвигаете |
|---|---|
| Вход в домен и общие папки | Kerberos по умолчанию допускает расхождение часов в пять минут. Сверх этого его билеты отклоняются, а вход или доступ к общей папке завершается ошибкой. |
| Сертификаты и HTTPS | Действителен ли сертификат, решают часы. Выставьте их за дату окончания сертификата — и каждое соединение, которое на него опирается, отклоняется как просроченное; отведите их достаточно далеко назад — и сертификат ещё не действует. |
| Служба времени Windows | Машина в домене берёт время у контроллера домена, и по умолчанию служба исправляет часы при любом расхождении. Выставленную вами дату могут вернуть, пока вы ещё тестируете. |
| Всё, что записывает время | Файлы, журналы, строки баз данных и отправленные письма, созданные при сдвинутых часах, несут дату теста и сохраняют её после того, как вы вернули часы. |
| ПО, запоминающее самую позднюю виденную дату | Некоторые программы считают часы, пошедшие назад, подделкой — а именно это и происходит, когда вы восстанавливаете настоящую дату. |
Чем дальше дата, тем больше из этого вы встретите. Машина, выставленная на 2038 год, видит просроченным любой выданный сегодня сертификат. Как проверять 2038 год без этого →
Нужно и право, которого нет у большинства учётных записей: смена системного времени — привилегия администратора, а на управляемой машине она часто вам не принадлежит.
Когда смена часов — правильный ответ
Виртуальная машина, которой больше никто не пользуется, с отключённой собственной синхронизацией часов — вполне хороший испытательный стенд. Потом вы её выбрасываете, так что ничто из записанного на ней не имеет значения. Если она у вас есть, а тест касается одной даты, это самое простое, что работает.
Проблемы начинаются, когда это машина, на которой вы работаете, машина в домене или машина, на которой одновременно работает то, что ничего не должно заметить.
Сдвиньте вместо этого часы одной программы
Сдвинутое время видит один процесс и запущенные им дочерние. Ваш вход в домен, ваши сертификаты и Windows Update его никогда не видят, так что ничего из таблицы выше не сдвигается — и потом нечего возвращать.
# Приложение видит 31 декабря 2027, 23:59:50. Всё остальное сохраняет настоящую дату. chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:50 # Начать за десять минут до полуночи и идти в 60 раз быстрее — смена года наступит через десять секунд chrono run "C:\apps\test.exe" --at 2027-12-31T23:50:00 --mode x60
Дошла ли сдвинутая для одной программы дата до неё на самом деле — это не то, что стоит предполагать. Каждая сессия заканчивается вердиктом и списком каналов времени, которые программа действительно читала. Как понять, что подмена сработала →
Что это не заменяет
- Программа, спрашивающая время у сервера, лежит за пределами досягаемости локальной подмены. Сессия сообщает об этом, когда видит, что программа открывает сетевое соединение, вместо того чтобы оставить вас с предположением, что тест прошёл.
- Тестирование самой системы — службы, реагирующей на изменение настоящих часов, запланированной задачи, поведения Windows при смене часов — не имеет замены смене часов, на машине, которую вам не жалко.