时间戳是否有Windows绝对时间?(.NET)

时间戳是否有Windows绝对时间?(.NET),.net,datetime,timestamp,systemtime,.net,Datetime,Timestamp,Systemtime,我正在使用一个WPF/C应用程序,我需要在一段时间内阻止用户访问特定功能。基本上,从某个事件发生时起,我希望在接下来的24小时内阻止某些访问 简单的情况是: 事件发生时,保存时间戳(使用DateTime或类似工具) 用户在15小时后尝试访问该区域,将现在与时间戳进行比较。。。挡块 用户在25小时后尝试访问该区域,将现在与时间戳进行比较。。。容许 一切都好。但是,用户有能力更改系统时间,这让我非常恼火。他们只需提前24小时设置系统时间,我的应用程序就不会那么聪明了 我假设在Windows中更改

我正在使用一个WPF/C应用程序,我需要在一段时间内阻止用户访问特定功能。基本上,从某个事件发生时起,我希望在接下来的24小时内阻止某些访问

简单的情况是:

  • 事件发生时,保存时间戳(使用DateTime或类似工具)
  • 用户在15小时后尝试访问该区域,将现在与时间戳进行比较。。。挡块
  • 用户在25小时后尝试访问该区域,将现在与时间戳进行比较。。。容许
一切都好。但是,用户有能力更改系统时间,这让我非常恼火。他们只需提前24小时设置系统时间,我的应用程序就不会那么聪明了

我假设在Windows中更改时间会影响系统的实时时钟。。。那么,是否存在独立于系统时钟的自由运行计时器?一个用户不能搞乱的


非常感谢您的帮助。

Environment.TickCount不会随系统时间的变化而变化,但会在重新启动时重置。一个选项是HTTPS安全web服务和不允许证书验证失败的证书策略。否则,欺骗服务的响应将非常简单


当我第一次开始销售软件时,我对盗版之类的东西非常怀疑。我不是说你的目的是一样的。但我得出的结论是,人们通常不会干扰他们的系统时间,因为它会把他们计算机上的许多其他事情搞砸,所以不值得这么麻烦。当然,不同的应用程序会有不同的完整性要求,但我只是想添加这一点。

不太可能。唯一可靠的绝对计时器是外部计时器,由您或您信任的人控制,例如Internet上的一个时间服务器(例如time.windows.com)。您可以使用NTP或SNTP库(如发布在上的库)访问这些。当然,在这种情况下(根据对Josh的回答的评论),如果您无法到达时间服务器,例如用户将机器与网络断开,则需要考虑该怎么办。
您可以使用Environment.TickCount来获取系统启动后的时间,用户无法处理这些时间——但是如果用户或其他人重新启动系统,那么系统将重新启动,因此它对于您所需的目的来说不可靠。

不,没有绝对的信息知道它在Windows中的时间,怎么可能?如果您需要一个可靠的时间戳,那么您需要从internet上的可靠位置获取一个时间戳。一个用户无法处理的问题

您可以通过网络时间服务获取时间,或者访问www.time.gov,从返回的html中提取时间


或者只是和少数愿意把时钟拨快的用户生活在一起

若要获取绝对时间戳,请使用Windows服务尝试向其中一个(免费)

请求NTP,您可以在系统时间更新时通过日志记录来伪造绝对已用时间

当然,这需要您能够在机器上安装服务,并且您的用户不够聪明,无法根除它


下面是一些关于在.NET服务中捕获WM_TIMECHANGE消息的信息:

,但这两个消息都取决于用户的环境。重新启动时会发生什么(对于Environment.TickCount)或者如果互联网被拔出(web服务)?@Stephen,我特别指出Environment.TickCount会在重新启动时重置。至于服务是否不可用-如果应用程序要求达到该完整性级别,则不应允许其脱机运行。+1这个答案的重要部分是,不仅外部时间源是唯一的实际选择,而且如果您确实想确定,你需要保护自己不被恶意用户欺骗时间服务-因此需要SSL。@马克,是的,我应该在我的回答中更清楚地指出这一点。谢谢。可能值得注意的是,用户仍然可以更改BIOS配置中的时间,因此,即使如此多的工作也可以很容易地避免。