如何读取目录和/或文件的128位NTFS FILE_ID?

6

因此,NTFS使用128位GUID来标识文件和目录,您可以轻松查看此信息:

C:\ Temp> C:\ Windows \ System32 \ fsutil.exe objectid query。
对象ID:ab3ffba83c67df118130e0cb4e9d4076
BirthVolume ID:ca38ec6abfe0ca4baa9b54a543fdd84f
BirthObjectId ID:ab3ffba83c67df118130e0cb4e9d4076
域ID:00000000000000000000000000000000
这很明显,但如何以编程方式检索此信息?查看OpenFileById(...)的WinApi,您应该能够获取此信息。人们希望在“Win32 FileID API Library”中完成此操作,然而该方法(GetFileInformationByHandleEx)返回一个FILE_ID_BOTH_DIR_INFO结构。该结构定义了一个FileId; 然而,它是一个LARGE_INTEGER(64位),而不是完整的128位标识符。
我猜可以使用WMI来实现这一点,那么我应该去哪里?
2个回答

7
一番搜索带我到了DeviceIoControl,在那里可以找到你问题的答案:FSCTL_GET_OBJECT_ID返回和fsutil输出相同的ID。不过,在BY_HANDLE_FILE_INFORMATION文档中提到,64位文件ID已经足以唯一识别给定卷上的文件。根据维基百科,NTFS仅支持最多2^32个文件,因此128位ID似乎是完全没有必要的。

完美!(真不敢相信我没找到那个)啊,同意128位ID有些过头了... - csharptest.net
2
但要注意,自Windows Server 2012引入的ReFS文件系统使用128位文件标识符,这里得到的对象ID在这样的卷上不再保证是唯一的! - Christoph

2
此外请注意,并非每个文件都有GUID。GUID机制主要用于.lnk文件,以便在目标移动时保持关联。仅$Volume和链接文件的目标具有这些GUID。此外,您可以手动设置它们。
它们的优点是GUID不应在卷之间冲突,而文件ID会冲突。FILE_ID实际上是MFT_RECORD_NUMBER的48位和MFT_SEQUENCE_ID的16位。

是的,我也曾经吃过这个亏,不得不使用FSCTL_CREATE_OR_GET_OBJECT_ID(需要SeBackup进程令牌)。64位的问题与MS创建它的原因相同。我需要跟踪文件的移动,即使在卷或机器之间也是如此。 - csharptest.net

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接