有没有办法检测系统时钟是否已在Windows中向后更改?

Nic*_*ell 13 windows winapi

在Windows机器上,有没有办法在不连续监视WM_TIMECHANGE消息的情况下查明时间是否已向后更改?

例如,我想让我的应用程序在启动时做的第一件事是查看自上次运行应用程序以来时间是否已经更改.

据我所知,查看更改的唯一方法是查看WM_TIMECHANGE消息,但我只会看到我的应用程序正在运行.

Pau*_*sik 20

是.您可以阅读Windows事件日志并查找系统时间的更改.(系统时间更改是自动记录的系统事件之一.)例如,我只是将系统时间调整了几秒钟,系统事件日志中出现以下内容:

信息10/21/2011 11:16:26 AM Ke​​rnel-General 1无

系统时间已从2011年 - 10 - 21T16:16:26.000000000Z改为2011年 - 10 - 21T16:16:26.000000000Z.

您可以使用Win32 API访问事件日志,然后查询这些事件以确定时间是否确实已更改.这个解决方案的优点在于它内置并且始终在运行.无需通过自定义服务等监控事件.您只需查询操作系统的数据即可.

这仍然不是一个防弹解决方案,因为拥有管理员权限的人可以设置机会,清除日志等.但你绝对可以通过layperson证明你的应用程序.系统事件日志不是Windows用户经常考虑的事情.

该特定事件的XML :(取消隐私和安全性)

  <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
  <Provider Name="Microsoft-Windows-Kernel-General" 
        Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" /> 
  <EventID>1</EventID> 
  <Version>0</Version> 
  <Level>4</Level> 
  <Task>0</Task> 
  <Opcode>0</Opcode> 
  <Keywords>0x8000000000000010</Keywords> 
  <TimeCreated SystemTime="2011-10-21T16:16:26.001000000Z" /> 
  <EventRecordID>138478</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="40044" ThreadID="50016" /> 
  <Channel>System</Channel> 
  <Computer>xxxxx.xxxxxxxxx.org</Computer> 
  <Security UserID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /> 
  </System>
  <EventData>
  <Data Name="NewTime">2011-10-21T16:16:26.000000000Z</Data> 
  <Data Name="OldTime">2011-10-21T16:16:26.000000000Z</Data> 
  </EventData>
  </Event>
Run Code Online (Sandbox Code Playgroud)


Mah*_*dsi 5

不,你不能。这就是为什么时间敏感的 DRM 方案通常毫无用处。

可以尝试通过使用服务来解决这个问题,然后您必须使用另一个 hack 以及在此之上的另一个 hack 来解决服务的停机时间。

无论如何,如果这就是您想要做的所有事情,那么只需将程序关闭时的系统时间值存储在某个地方(可能是加密的),然后确保它没有在程序启动时传递就足够了。它不会阻止用户基本上“冻结”从关机到启动的时间,但对于 9/10 试图通过定时试用的人来说已经足够了。