Вам нужно будет проверить часы с помощью внешнего сервера и принять их, если они находятся в пределах определенного допуска.Все часы ошибочны в некоторой степени.Обычно веб-службы на сервере где-то достаточно, но есть много бесплатных NTP-служб .Однако обратите внимание, что мне потребуется 5 минут, чтобы обойти это, поэтому для большей безопасности вам нужно использовать SSL (HTTPS) (делает атаки «человек посередине» невозможными).
Примечаниеоднако:
- Необходимо правильно компенсировать часовые пояса, поскольку сервер и пользователи могут иметь разные часовые пояса.Информация о часовом поясе отправляется в формате DateTime в формате ISO 8601 , что достаточно просто.
- Что мешает пользователю отключить интернет?Вы действительно хотите требуется доступ в интернет для запуска приложения?Кто-то с ноутбуком быстро обнаружит, что автономный режим заставляет приложение работать.
- Один из методов, используемых некоторыми, заключается в том, чтобы сказать, что если время в будущем (после истечения срока действия продукта) будет обнаружено приложением, тонужно активировать его.Реактивация требует связи с интернет-сервером, который может проверять лицензию по доверенным часам.
Если вы хотите узнать, когда пользователь меняет часы, просто настройте поток на цикл с 60-секундным потоком.(60000).Затем проверьте текущий DateTime по сравнению с 60 секунд назад.Всегда должно быть 60 секунд - / + 1 секунда с момента последней проверки.(+/- 1 секунда, чтобы компенсировать задержки, такие как небольшое зависание приложения во время выполнения таймера и т. Д.)
Я собрал быстрый пример: РЕДАКТИРОВАТЬ: Извините, первый образец был в C #.Переделай это в VB.Net.
Imports System.Threading
Public Class Form1
Private TimeMonitorThread As Thread
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
TimeMonitorThread = New Thread(TimeMonitorThreadLoop)
TimeMonitorThread.Name = "TimeMonitorThread"
TimeMonitorThread.IsBackground = True
TimeMonitorThread.Start()
End Sub
Private Sub TimeMonitorThreadLoop()
Dim sleepSeconds As Integer = 60
Dim tolerance As Integer = 1
While (True)
Dim before As DateTime = DateTime.Now
Thread.Sleep(sleepSeconds * 1000)
Dim after As DateTime = DateTime.Now
If (Math.Abs(CInt(after.Subtract(before).TotalSeconds) - sleepSeconds) > tolerance) Then
' Time has changed!
End If
End While
End Sub
End Class