在Windows机器上,有没有办法在不连续监视WM_TIMECHANGE消息的情况下查明时间是否已向后更改?
例如,我想让我的应用程序在启动时做的第一件事是查看自上次运行应用程序以来时间是否已经更改。
据我所知,查看更改的唯一方法是查看WM_TIMECHANGE消息,但我只会看到我的应用程序正在运行。
答案 0 :(得分:18)
是。您可以阅读Windows Event Logs并查找系统时间的更改。 (系统时间更改是自动记录的系统事件之一。)例如,我只是将系统时间调整了几秒钟,系统事件日志中出现以下内容:
信息10/21/2011 11:16:26 AM Kernel-General 1无
系统时间已更改为2011 - 10 - 21T16:16:26.000000000Z 从2011年 - 10 - 21T16:16:26.000000000Z。
您可以use the Win32 API to get access to the event logs然后查询这些事件以确定时间是否确实已更改。这个解决方案的优点在于它内置并且始终在运行。无需通过自定义服务等监控事件。您只需查询操作系统的数据。
这仍然不是一个防弹解决方案,因为拥有管理员权限的人可以设置机会,清除日志等。但你绝对可以通过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>
答案 1 :(得分:3)
你可以试图通过使用服务来解决它,然后你必须通过使用另一个hack解决服务的停机时间,以及另外一个hack。< / p>
无论如何,如果这就是你要做的所有事情,那么只需在程序关闭时将某个地方(加密的,可能的)系统时间的值存储起来,然后确保它没有在程序启动上传递就够了。它不会阻止用户基本上“冻结”从关机到启动的时间,但对于试图通过定时试用的9/10人来说已经足够了。
答案 2 :(得分:2)
您可以让您的应用程序(当它正好运行时)定期将系统时间与从某个服务器资源获取的时间进行比较。如果您突然发现系统时间和服务器时间之间的差异已经增加,那意味着系统时间已经被设置回来。
显然,这不适用于没有互联网访问权限的计算机。
答案 3 :(得分:2)
上面提到的一个想法(虽然我注意到,如果可行的话,检查外部时钟是明确的答案) - 您还可以定期读取系统时钟并将其(可能是加密的)存储在某个隐藏文件中。每次执行此操作时,请检查以确保新值比文件中的值更新。执行此操作的触发器可以在每次启动时等。
与所有内部方法一样,这个方法很容易被某人弄清楚隐藏文件。因此,如果隐藏文件丢失,或者日期戳与其内容不匹配,也可以标记问题。