有时,我们会遇到这样的问题:文件的权限与其所在文件夹的权限不同。
现在我发现有一个知识库文章解释背后的原因:
默认情况下,对象会从其父对象继承权限,无论是在创建时还是在被复制或移动到其父文件夹时。此规则的唯一例外是将对象移动到同一卷上的其他文件夹。在这种情况下,原始权限将保留。
因此,用户将文件从一个文件夹移动到另一个文件夹,并且保留了原始文件夹的权限。
我现在的问题是:为什么会出现这个异常?这背后的原因是什么?
答案1
我在博客文章中解释过这一点http://think-like-a-computer.com/2011/07/24/moving-files-on-the-same-ntfs-volume-does-inherit-permissions/但下面也会解释。
当复制文件时,它必须创建一个全新的文件并为其分配一组新的权限,因此它会从父文件夹获取权限。
当文件被移动到另一个卷时,实际发生的是,它将被复制到新卷,而旧文件将被删除。因此,由于它再次成为新文件并且需要设置权限,因此会重复上述相同的过程。
当文件在同一卷内移动时,实际上什么也不会发生(在磁盘级别)。它只是改变了文件的逻辑路径位置。磁盘上的实际数据和物理文件没有被触及或更改。有没有注意到,当你将一个 5GB 的文件移动到同一驱动器上的另一个文件夹时,几乎是立即完成的?这就是原因,因为它实际上没有移动,但指向文件逻辑存在位置的指针已经改变。由于它没有以任何方式被修改,权限也不会改变。
这就是这种行为的原因。
编辑:我忘了提一件事……MS 文章并不完全准确。MS 引述:
默认情况下,对象会从其父对象继承权限,无论是在创建时,还是在将其复制或移动到其父文件夹时。此规则的唯一例外是当您将对象移动到同一卷上的其他文件夹时。在这种情况下,原始权限将保留。
上面的引述仅适用于已获得明确定义的 sec 权限(关闭继承)的对象。正如我在评论中提到的,这一切都是为了尽可能保持 ACL 条目的效率。请考虑以下示例:
为便于解释,我们假设您有一个文件夹,只允许用户修改权限。在此文件夹下,有数千个文件,但都没有设置明确的权限。为每个文件创建 ACL 效率不高,因为它们的权限完全相同,所以它为文件夹设置了一个 ACL 条目。接下来这一点非常重要,需要理解;文件本身没有 ACL 权限。因此,当您将这些文件中的任何一个移动到同一卷中的新文件夹中时,MS 会声称权限会随之移动(如上引述)。问问自己这个问题......怎么会这样?文件上一开始就没有权限可以移动。这实际上是不正确的,我刚刚测试了一下以确认这一点。假设您要将文件移动到的目标文件夹具有仅允许所有人组修改权限的权限。由于文件没有直接的 ACL,因此它会继承父文件夹的 ACL。这意味着权限已从用户修改(旧文件夹)更改为所有人修改(新文件夹)。
注意到区别了吗?这一次,将文件移动到同一卷中的另一个文件夹实际上改变了权限,而微软表示它不会这样做。我是不是刚刚在 2000 年以来的微软文档中发现了一个错误?哈哈?
现在看看使用显式权限时的相同场景。如果您在此文件夹中的文件上设置显式权限(继承已关闭),例如,拒绝用户读取访问权限,则它现在会专门为此文件创建一个新的 ACL 条目。现在,当您将文件移动到新位置时,它有一个与之直接相关的 ACL 条目。在这种情况下,将文件移动到同一卷中的新位置会保留其权限(正如 MS 所声称的那样)!
答案2
在同一卷内移动文件时你传统上正在重新排列你的文件系统. 在目录级别更改文件权限可能会在移动操作完成后立即将您锁定在该文件之外。例如,如果您不小心将文件移动到系统或具有特殊所有权权限或以其他方式受保护的文件夹中,则这种情况是不可取的。除了取得文件所有权(如果您有权限)或使用特权帐户登录之外,没有其他方法可以纠正错误。考虑到计算机的日常正常操作,您可能会发现您无法控制文件系统。
这种行为在大多数(如果不是全部)使用 ACL 的操作系统中很常见。它保证用户和应用程序都可以在卷内正常进行文件系统操作。
相反,在卷之间移动文件时,您通常会将文件交给其他人或某物进行控制。您很清楚,让文件合并目标文件夹权限是有意义的,这将为目标提供必要的权限,然后根据自己的意愿重新安排其自己的文件系统。
当然,这并不总是可取的。因此,可以使用特殊的权限继承规则来定义移动和复制操作。摘自同一篇文章:
要在文件和文件夹被复制或移动时保留权限,请使用带有 /O 或 /X 开关的 Xcopy.exe 实用程序。对象的原始权限将添加到新位置的可继承权限中。
要在复制或移动对象时将对象的原始权限添加到可继承权限,请使用带有 –O 和 –X 开关的 Xcopy.exe 实用程序。
答案3
好的,这是真正的内幕。首先 - 我们谈论的是一台 PC 还是一台服务器?我假设我们谈论的是服务器。所以......作为 A 公司的 Wintel 管理员,您在新服务器上的网络驱动器上创建了一个文件系统。您以部门为基础,即每个部门都有一个文件夹,每个文件夹都有自己独特的 ACL,因为保密问题,这可能是常态 - 是吗?因此,如果您要将文件移动到另一个部门的文件夹,您为什么不希望它继承其新文件夹的权限?我的意思是......如果您不打算使用它,为什么要有基于权限的文件系统?我可以给你一个现实生活中的例子,其中移动的文件/文件夹很重要总是继承其父文件夹的 ACL,只需问我。
在卷内移动文件或将文件从卷 X 移动到卷 Y ... 有什么本质区别?据我所知,在公司环境中,您是否移动某些文件的位置(跨不同卷或不跨不同卷)几乎没有区别。Mucker 已经提到了为什么一个默认包含继承而另一个不包含继承的真正原因 - 即“效率”。在卷内拖放文件只会更改索引条目 - 文件不会被移动,并且它们的 ACL 信息保持不变。这是一个简单的操作。但是,当文件跨卷移动时,文件及其 ACL有被重新定义,所以这样做适当地包括继承是很有意义的,因为它不会产生可避免的开销。
我不明白为什么微软不解决这个问题。在 Explorer 的拖放功能中加入一个对话框会不会太难?类似于“您已将文件移动到具有不同访问权限的位置,是否希望继承新父文件夹的权限?是还是否?”
问候,Stonegiant