在Windows机器上,有没有办法找出时间是否已经改变了,而不是连续监视WM_TIMECHANGE消息?
例如,我想让我的应用程序在启动时执行的第一件事是查看自上次运行应用程序以来是否改变了时间。
据我所知,看到一个变化的唯一方法是看WM_TIMECHANGE消息,但我只会看到,如果我的应用程序正在运行。
是。 您可以阅读Windows事件日志并查找对系统时间的更改。 (系统时间更改是自动记录的系统事件之一。)例如,我只是调整了我的系统时间几秒钟,系统事件日志中出现以下内容:
信息10/21/2011 11:16:26 AM内核通用1无
系统时间从2011 – 10 – 21T16:16:26.000000000Z更改为2011 – 10 – 21T16:16:26.000000000Z。
您可以使用Win32 API访问事件日志,然后查询这些事件以确定是否确实更改了时间。 这个解决方案的好处在于它是内置的并且始终运行。 无需通过自定义服务监控事件等。您只需查询操作系统的数据。
这仍然不是一个防弹解决方案,因为具有管理员权限的人可以进行机会设置,清除日志等。但是,您绝对会对您的应用程序进行防范。 系统事件日志不是Windows用户常常想到的东西。
该特定事件的XML:(取消确定的隐私和安全)
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Microsoft-Windows-coreel-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>
不,你不能。 这就是为什么时间敏感的数字版权管理计划通常是无用的。
你可以尝试通过使用服务来解决它,然后你必须通过使用另一个黑客来解决服务的停机时间,而另一个黑客也是如此。
无论如何,如果这就是你所要做的,那么简单地在程序关闭时将某个地方(可能加密的系统时间)的值存储起来,然后确保在程序启动时没有传递它就足够了。 它不会阻止那些基本上“冻结”从关机到启动的时间的用户,但只要有9/10的人试图超越您的定时试用,就足够了。
您可以让您的应用程序(在碰巧正在运行时)周期性地将系统时间与从某个服务器资源获取的时间进行比较。 如果您突然看到系统时间和服务器时间之间的差异已经增加,那意味着系统时间已经被重新设置。
显然,这是不能在没有互联网接入的机器上工作的。
上面的一个想法(虽然我注意到,如果可行,检查外部时钟是确定的答案) – 您也可以定期读取系统时钟并将其存储(可能是加密的)到某个隐藏文件中。 每次执行此操作时,都要检查以确保新值比文件中的新值更新。 这样做的触发器可能在每个启动等。
像所有内部方法一样,这个人很容易找出隐藏的文件。 因此,如果隐藏的文件丢失,或者其日期标记与其内容不匹配,则也可以标记问题。