【问题标题】:How to open a file by id with DELETE access?如何通过具有 DELETE 访问权限的 id 打开文件?
【发布时间】:2020-02-10 08:09:24
【问题描述】:

使用 NT 原生函数 NtCreateFile 可以使用 FILE_OPEN_BY_FILE_ID 创建选项按 id 打开文件。但是,在这样做时,DELETE 访问标志似乎被忽略了。如果我设置它,文件将正常打开,但任何删除或重命名文件的尝试都会失败(例如,通过设置 FILE_DELETE_ON_CLOSE 或使用 FILE_RENAME_INFORMATION 类和 NtSetInformationFile)。

这样打开的文件不能删除吗?有没有其他方法可以通过 id 而不是 name 来删除文件?

【问题讨论】:

  • hmm .. 我只是测试自己 - 真的文件没有被删除,STATUS_INVALID_PARAMETER FileRenameInformation - 所以我从一开始就错了。现在寻找更多细节。
  • 是的,我完全错了。 ntfs 确实不允许 raname 或删除由 id 打开的文件
  • 我想你可以在这里问这个问题 - community.osr.com/categories/ntfsd - 此类主题的最佳论坛

标签: filesystems nt-native-api


【解决方案1】:

除了 RbMm 的回答之外,我还发现了 Alex Carp 的一篇博文,Some Limitations Using Files Opened By ID,解释了这样做的理由。

不幸的是,按 ID 打开的文件的语义与按名称打开的相同文件的语义略有不同。例如,文件名命名空间允许文件有多个名称(硬链接),而 ID 命名空间则不允许。不同命名空间的不同语义会使得一些操作没有意义。

例如,因为 NTFS 允许文件使用多个名称,如果文件是通过 ID 打开并尝试更改命名空间的操作,那么应该影响哪个名称?为了清楚起见,如果文件 \Foo\f.txt 和文件 \Bar\b.txt 是同一个文件的硬链接,并且我按 ID 打开文件并尝试重命名它,应该更改哪个名称?如果我尝试删除呢?

简而言之,在 NTFS 模型中删除文件实际上意味着删除对文件的引用(也称为名称)。只有在删除所有对它的引用后,作为副作用,文件本身才能被删除。很像许多编程语言中的引用计数。

假设有一个操作需要一个文件 ID 并删除所有引用以及文件,但这将是一个非常不同的操作并且可能很棘手(例如,它需要对所有受影响的文件名执行权限检查,等等关闭所有相关句柄,防止引用文件的新文件名被删除等)。所以在这方面,它不存在也就不足为奇了。

【讨论】:

  • 删除所有链接的权限应该不是问题。如果句柄具有删除访问权限,则这必须由文件上的安全描述符授予,而不是来自特定链接父目录的删除子访问权限。此外,对于 readonly 属性,还有一组文件属性。 OTOH,共享模式并不常见,因此必须全部处理或全部处理。如果由于现有打开,任何链接上的共享模式不共享删除访问权限,则操作必须作为共享冲突失败。
【解决方案2】:

我查找 ntfs-4 源代码并在NtfsSetRenameInfo 中查看说下一个code

//
//  Do a quick check that the caller is allowed to do the rename.
//  The opener must have opened the main data stream by name and this can't be
//  a system file.
//

if (!FlagOn( Ccb->Flags, CCB_FLAG_OPEN_AS_FILE ) ||
    (Lcb == NULL) ||
    (NtfsSegmentNumber( &Fcb->FileReference ) < FIRST_USER_FILE_NUMBER)) {

    DebugTrace( -1, Dbg, ("NtfsSetRenameInfo:  Exit -> %08lx\n", STATUS_INVALID_PARAMETER) );
    return STATUS_INVALID_PARAMETER;
}

FileDispositionInformationFILE_DELETE_ON_CLOSE 选项的情况相同 (1)

    if (FlagOn( Ccb->Flags, CCB_FLAG_DELETE_ON_CLOSE )) {

        if (FlagOn( Ccb->Flags, CCB_FLAG_OPEN_AS_FILE )) {

如果文件中没有设置CCB_FLAG_OPEN_AS_FILE,由于某种原因,ntfs 不允许重命名或删除文件。 (id打开文件时不设置)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多