当文件进入回收站时,权限会发生什么变化?

What happens to permissions when a file goes to the recycle bin?

我有一个与服务应用程序完成的文件管理相关的问题。我的问题是用户能够将文件移动到我为其创建硬link 的回收站,一旦他们这样做,我就失去了列出可用硬link 的能力。

只有当删除的硬link 文件位于 $RECYCLER 文件夹中,而不是位于同一磁盘上具有类似权限的文件夹时,才会出现这种情况。

要重现我的问题,假设有一个名为 Service 的用户帐户和一个合适的密码。

当前用户帐户:

md C:\tmp
echo CONTENTS>C:\tmp
fsutil hardlink create C:\tmp C:\tmp

这会创建一个名为 C:\tmp 的文件和一个名为 C:\tmp.

的硬 link

现在,如果您 runas 另一个用户为 Service 的终端,您可以:

fsutil hardlink list C:\tmp
\tmp
\tmp

效果不错。

现在,如果您(作为原始用户)将 2 文件移动到回收站,您将无法以 Service.

的身份访问这些文件
type C:\tmp
Access is denied.
fsutil hardlink list C:\tmp
Error:  Access is denied.

那是因为资源管理器将文件上的 DACL 更改为限制性 DACL,其中只有当前用户 SYSTEM 和管理员可以访问该文件。

如果您以原始用户身份执行 icacls C:\tmp /reset,现在您可以以 Service:

身份访问文件内容
type C:\tmp
CONTENTS

但是如果您尝试列出硬links,它会显示第一个 link 和拒绝访问错误:

fsutil hardlink list C:\tmp
\tmp
Error:  Access is denied.

如果你把文件上的hardlink列为原用户,你就知道原文件的回收站路径:

fsutil hardlink list C:\tmp
\tmp
$Recycle.Bin\S-1-5-21-111111111-2222222222-3333333333-1002$R1GX1HN

如果您将该文件移动到另一个(作为原始用户)文件夹:

md C:\tmp2
move $Recycle.Bin\S-1-5-21-111111111-2222222222-3333333333-1002$R1GX1HN C:\tmp2

现在 Service 您可以列出所有困难link:

fsutil hardlink list C:\tmp
\tmp
\tmp2$R1GX1HN

知道为什么会这样吗?

这与强制完整性控制有什么关系吗?

正如 @Eryk Sun 在评论中所解释的那样,问题与 Win32 报告硬链接的方式有关 API。

fsutil 似乎使用了 FindFirstFileNameFindNextFileName 函数,这两个函数都使用了 NtQueryInformationFile,后者又 returns 具有类型条目的结构FILE_LINK_ENTRY_INFORMATION 具有硬链接名称和父文件夹 NTFS ID

当调用者无权打开包含的文件夹以获取其名称(可能使用 OpenFileById and GetFinalPathByHandle)时,问题就出现了。