Есть ли в Windows абсолютное время для отметок времени? (.СЕТЬ) - PullRequest
9 голосов
/ 28 февраля 2010

Я работаю с приложением WPF / C #, где мне нужно на некоторое время заблокировать пользователям доступ к определенной функции. По сути, со времени определенного события я хочу запретить определенный доступ в течение следующих 24 часов.

Простой случай:

  • Событие происходит, сохраните временную метку (используя DateTime или подобное)
  • Пользователь пытается получить доступ к области через 15 часов, сравните сейчас с отметкой времени ... блок
  • Пользователь пытается получить доступ к области через 25 часов, сравните сейчас с отметкой времени ... allow

Все хорошо. Тем не менее, пользователь имеет возможность изменить системное время, что по-королевски меня винит. Они могут просто установить системное время на 24 часа вперед, и мое приложение не будет мудрым.

Я полагаю, что изменение времени в Windows относится к системным часам реального времени ... так есть ли какой-нибудь таймер, работающий независимо от системных часов? Тот, с которым пользователь не может связываться?

Любое понимание приветствуется.

Ответы [ 5 ]

3 голосов
/ 28 февраля 2010

Environment.TickCount не изменяется при изменении системного времени, но сбрасывается при перезагрузке. Одним из вариантов является защищенная веб-служба HTTPS и политика сертификатов, которая не допускает сбоев проверки сертификатов. В противном случае было бы довольно банальным подделать ответ от службы.

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

1 голос
/ 28 февраля 2010

Используя службу Windows, вы можете подделать абсолютное истекшее время, регистрируясь при обновлении системного времени.

Для этого, конечно же, потребуется установить службу на компьютер, а ваши пользователи не будут достаточно умны, чтобы исключить ее.

Вот некоторая информация о перехвате сообщения WM_TIMECHANGE в сервисе .NET: обнаружение события wm_timechange в сервисе Windows.

1 голос
/ 28 февраля 2010

Чтобы получить отметку абсолютного времени, попробуйте запрос NTP к одному из (бесплатных) серверов времени NIST

1 голос
/ 28 февраля 2010

Нет, нет абсолютных знаний о том, который час в Windows, как это может быть? Если вам нужна надежная временная метка, вам нужно получить ее из надежного места в Интернете. Тот, с которым пользователь не может связываться.

Вы можете получить время из службы сетевого времени или зайти на сайт www.time.gov и узнать время из HTML, который вы получите. http://www.time.gov/about.html

Или просто жить с несколькими пользователями, желающими перевести свои часы вперед.

1 голос
/ 28 февраля 2010

Не совсем. Единственный надежный абсолютный таймер - это внешний, под вашим контролем или контролем кого-то, кому вы доверяете, например, один из серверов времени в Интернете (например, time.windows.com). Вы можете получить к ним доступ, используя библиотеку NTP или SNTP, например, размещенную по адресу http://www.codeproject.com/KB/IP/ntpclient.aspx.. Конечно, в этом случае (согласно комментарию к ответу Джоша) вам необходимо подумать, что делать, если вы не можете дозвониться. сервер времени, например пользователь отключает аппарат от сети.

Вы можете использовать Environment.TickCount, чтобы получить время с момента запуска системы, с которым пользователь не может связываться - но если пользователь или кто-то еще перезагрузит систему, то это будет перезапущено, так что это ненадежно для цель, которую вы требуете.

...