与 USN 一样,我希望您需要进行一些试验和错误才能使其正常工作。我希望这些观察/猜测可能会有所帮助:
当文件的最后一个硬链接被删除时,文件被删除;因此,如果最后一个硬链接已被删除,您应该会看到 USN_REASON_FILE_DELETE 而不是 USN_REASON_HARD_LINK_CHANGE。我相信每个参考编号指的是一个文件(或目录,但 NTFS 不支持多个指向目录 AFAIK 的硬链接)而不是一个硬链接。所以在事件被记录之后,至少,文件引用号应该仍然有效,并且指向文件的另一个名称。
如果该文件还存在,您可以通过参考号查找并使用FindFirstFileNameW
和朋友查找当前链接。将此与有问题的事件记录以及任何相关的后续事件进行比较应该可以为您提供足够的信息,尽管如果同一文件的多个硬链接被删除和/或创建,您可能无法重建发生这种情况的顺序,并且如果您没有足够的关于文件系统先前状态的信息,您可能无法识别已删除的硬链接。我不知道这对你是否重要。
如果文件不再存在,您应该仍然能够通过删除它的 USN 记录来识别它。同样,考虑到所有相关事件,并有足够的关于先前状态的信息,你应该能够重建大部分发生的事情,如果不是顺序的话。
有一些希望我们可以做得比这更好:事件记录中的文件名和/或 ParentFileReference 编号可能指的是创建或删除的硬链接,而不是指向文件的任意链接。在这种情况下,您将获得有关事件序列的所有相关信息,除了任何特定事件是创建还是删除,您应该能够通过查看文件的当前状态并向后工作来解决记录。
我假设您已经在附近寻找可能包含其他信息的更改记录?例如,在创建硬链接时没有生成 USN_REASON_RENAME_NEW_NAME 记录,或者在删除硬链接时没有生成 USN_REASON_RENAME_OLD_NAME 记录?还是成对的 USN_REASON_HARD_LINK_CHANGE 记录,一条用于文件,一条用于包含受影响的文件硬链接的目录?(一厢情愿,我希望,但看看不会有坏处!)
出于测试目的,您可以使用该mklink
命令创建硬链接。