我正在开发一个与业务相关的程序,因此我需要知道系统日期是否正确 - 与远程服务器一致。你是如何在vb .NET winforms中做到的?
P.S:另外,当系统时钟改变以防止黑客攻击时,是否有任何方法可以引发某些事件?我不希望用户在登录帐户后更改本地日期。
提前致谢。
答案 0 :(得分:1)
您需要使用外部服务器验证时钟,如果它在某个容差范围内,则接受它。所有时钟在某种程度上都是错误的。通常,某个服务器上的Web服务就足够了,但有许多免费的NTP-services。但是请注意,我需要花费5分钟来绕过它,因此为了更高的安全性,您需要使用SSL(HTTPS)(使man-in-the-middle attacks成为不可能)。
但请注意:
如果您想知道用户何时更改时钟,只需设置一个线程以循环60秒Thread.Sleep(60000)。然后检查60秒前的当前日期时间。自上次检查以来,它应始终为60秒 - / + 1秒。 (+/- 1秒是为了弥补app在执行计时器时稍微悬挂的延迟等)
我把一个简单的例子拼凑在一起:
编辑:对不起,第一个样本是在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
答案 1 :(得分:0)
理论上只是步骤。
首先,在远程服务器中创建一个提供当前日期时间的asp .net应用程序。为确保增加安全性,请加密当前日期。
然后在您的PC中,创建一个winform应用程序,可以访问该远程服务器并根据需要获取当前时间。
然后在winform应用程序中,检索当前日期时间。然后,只需在远程服务器和winform应用程序中指示的当前时间之间进行比较。
您可以根据需要调整PC当前日期时间,以便与远程服务器时间同步。在业务应用程序的情况下,您可以通知用户或禁用应用程序功能,直到该用户按照您希望的方式执行操作。例如,拨打服务部门电话或获取解锁密钥等。
答案 2 :(得分:0)
在Tedd Hansen提交的.net VB代码中,请确保更改Private sub form1_load中的第一行: -
TimeMonitorThread = New Thread(AddressOf TimeMonitorThreadLoop)
(地址必须在那里,否则你会得到一个例外)
答案 3 :(得分:0)
我有一个应用程序,该应用程序在同一局域网上的SQL Server计算机上的局域网上运行。如果没有数据库服务器连接,该应用程序将无法运行,因此禁用网络最终将导致无应用程序使用。服务器已被物理锁定,因此除非获得许可或有效授权(防止BIOS更改),否则没人会打开或关闭服务器。如果有人遇到这种情况,则可以非常轻松地查询数据库并使用SELECT GETDATE()
获取准确的日期和时间,并将其与所需的任何变量进行比较。
对于我来说,我必须阻止用户将回溯的数据输入到系统中,因此在保存数据输入表单时,我查询数据库以比较当前机器的日期和服务器的日期以获取有效的输入。