我想弄清楚 Windows 何时以及如何更新文件的文件访问时间。
首先,出于性能原因,大多数 Windows 安装都禁用了文件访问时间,因此在仔细研究它之前,您需要做的是激活 NTFS 文件系统上的最后访问时间:修改 key [ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
值名称 NtfsDisableLastAccessUpdate
到 DWORD 0
值数据(如果它当然设置为 1)。如果它不存在,就创建它。
阅读后File Times article在 MSDN 上,我仍然怀疑 Windows 如何更新访问时间。
我的问题如下:
- 访问时间是否在发出带有
FILE_READ_ATTRIBUTES
的 WinApiCreateFile()
时更新?就我而言,虽然以编程方式进行,但事实并非如此。通过 Explorer Shell 打开该文件的“文件属性”对话框会更新访问时间。 - 访问时间是否会在发出 WinApi
ExtractIconEx()
以从文件中读取图标时更新? 在我的例子中,以编程方式这样做,事实并非如此。通过 Explorer Shell 打开该文件的“文件属性”对话框会更新访问时间。
如果你问我,这两种情况都应该更新文件访问时间,但在我看来,直接调用 WinApi 不会更新它们,或者 Window/NTFS 驱动程序确实落后,而从 Windows 资源管理器操作文件时会更新的不错您认为这里存在或可能存在什么问题?
作为旁注,我确实按照以下方式执行了CloseHandle()
:
The only guarantee about a file timestamp is that the file time is correctly reflected when the handle that makes the change is closed.
我的最终结论是,网络上的观点确实是正确的,Windows 确实以随机方式更新文件访问时间,因此人们真的不应该完全依赖于 Windows 文件访问时间。
题外话:抱歉取证人员,您必须使用其他方法证明访问时间,否则您的案例可能会在几秒钟内无效。 :P
最佳答案
不,访问文件的元数据不会更改上次访问时间(名称、属性、时间戳)。在实践中效果不佳,只需使用资源管理器查看目录即可更改它。您必须实际打开文件。 ExtractIconEx() 通常是一个很好的候选者,除了 Windows 可以玩弄它。隐藏的 desktop.ini 文件可以将图标重定向到另一个文件。
使用上次访问时间对于取证毫无值(value)。您需要一个文件系统过滤驱动程序。类似于嵌入在 SysInternals 的 ProcMon 实用程序中的那个。它可能正在使用 ETW 顺便说一句,它在 Vista 时代变得非常强大。尽管如此,您的项目还是变得复杂了 10 倍。
关于windows - Windows + NTFS 中的文件访问时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4969338/