在同一卷中移动文件时,为什么保留文件权限?


9

有时,我们会遇到一个问题,即文件的权限与其所在文件夹的权限不同。

现在,我发现有一篇知识库文章说明了其背后的原因:

默认情况下,对象在创建时,复制或移动到其父文件夹时都会从其父对象继承权限。将对象移动到同一卷上的其他文件夹时,将发生此规则的唯一例外。在这种情况下,将保留原始权限。

因此,用户将文件从一个文件夹移动到了另一个文件夹,并且保留了原始文件夹的权限。

我现在的问题是:为什么存在此异常?这背后的原因是什么?

Answers:


8

我已经在博客文章http://think-like-a-computer.com/2011/07/24/moving-files-on-the-same-ntfs-volume-does-inherit-permissions/中对此进行了解释,下面也进行了说明。

复制文件时,它必须创建一个全新的文件并为其分配一组新的权限,以便您从父文件夹中获取权限。

将文件移动到另一个卷时,实际发生的情况是将其复制到新卷中并删除了旧文件。因此,重复上述过程,因为它再次是一个新文件,并且需要设置权限。

当文件在同一卷中移动时,什么也没有发生(在磁盘级别)。它只是更改文件的逻辑路径位置。尚未触摸或更改磁盘上的实际数据和物理文件。有没有注意到,当您将5GB文件移动到同一驱动器上的另一个文件夹时,几乎立即完成了吗?这就是为什么,因为它实际上并没有移动,但是指向文件逻辑存在位置的指针已更改。由于未进行任何修改,因此权限也不会更改。

这就是这种行为的原因。

编辑:我忘了提到的东西... MS文章并不完全准确。微软报价:

默认情况下,对象在创建时,复制或移动到其父文件夹时都会从其父对象继承权限。将对象移动到同一卷上的其他文件夹时,将发生此规则的唯一例外。在这种情况下,将保留原始权限。

上面的引用仅适用于已获得明确定义的sec权限(关闭继承)的对象。正如我的评论中提到的,这都是关于保持ACL条目尽可能高效的。考虑以下示例:

为了简化说明,假设您设置了一个文件夹,仅允许用户修改权限。在此之下,有成千上万个文件,并且都没有设置明确的权限。为每个文件创建ACL并不是非常有效,因为它们的权限完全相同,因此它为文件夹设置了一个ACL条目。接下来的这一点非常重要。文件本身没有ACL PERMS。因此,当您将这些文件中的任何一个移到相同卷中的新文件夹中时,MS会声明烫发随其移动(如上引述)。问问自己这个...。首先,文件上没有烫发。这实际上是不正确的,我现在对其进行了测试以确认这一点。假设您要将文件移动到的目标文件夹具有权限,以允许所有人组仅修改权限。因为文件没有直接的ACL,所以它继承了父文件夹的ACL。这意味着权限已从用户修改(旧文件夹)更改为每个人修改(新文件夹)。

注意区别吗?这次,将文件移动到同一卷中的另一个文件夹实际上已更改了权限,而MS却说不行。自2000年以来,我刚刚在MS文档中发现一个错误吗?

现在,使用显式权限查看相同的情况。如果您对此文件夹内的文件设置了显式权限(关闭了继承功能)(例如,拒绝用户读取访问权限),它现在将专门为此文件创建一个NEW ACL条目。现在,当您将文件移动到新位置时,它具有与之直接相关的ACL条目。在这种情况下,将文件移动到同一卷中的新位置将重新获得其权限(如MS所述)!


+1都是不错的答案,但您的意义更大。我喜欢您对5GB文件如何立即移动的评论。良好的视觉效果。
KCotreau

我倾向于认为“没有复制发生”是不涉及ACL的主要原因。
VVS

1
没有技术上的原因,对文件系统表的更改不应影响相应的ACL条目。我认为这个解释是正确的。但是我也认为它描述了效果,而不是实际原因。原因是ACL自己的安全模型,该模型基于每个卷。在不同卷之间的移动/复制操作被理解为特权的转移,而同一卷内的更改被视为不可知特权。默认情况下,自然。
矮人

1
从逻辑上讲,文件的权限是在创建时设置的。请注意,当您更改文件夹的权限时,必须将权限传播到所有子对象。这就是Windows有时会抛出一个对话框的原因,因为它会更改所有子对象(如果有很多)。
surfasb

1
@Mucker:对不起,但是您的解释完全是错误的。Windows 始终将ACL与文件一起存储,即使它们是继承的也是如此。从文件系统的角度来看,如果文件在同一卷中移动,它们总是随文件一起移动。根据某些系统设置,Windows资源管理器将在移动后跳入并调整权限。但这就是资源管理器,与文件系统无关。更糟糕的是:这取决于Windows版本和(如我已经提到的)某些系统设置。参见blogs.msdn.com/b/oldnewthing/archive/2006/08/24/717181.aspx
Paul Groke 2014年

6

在同一卷中移动文件时,通常会重新布置文件系统。在目录级别更改文件许可权可能会在移动操作完成后立即将您锁定在该文件之外。例如,如果您只是不小心将文件移至系统或具有特殊所有权权限或受到其他保护的文件夹,则这是不希望的。除了取得文件的所有权(如果您具有特权)或使用特权帐户登录之外,没有其他方法可以纠正错误。考虑到计算机的日常正常运行,您可能会发现无法控制文件系统。

在大多数(如果不是全部)使用ACL的操作系统中,这种行为很常见。它可以保证用户和应用程序在卷内正常进行文件系统操作。

相反,在卷之间移动文件时,传统上是将文件交给他人或其他人控制。如您所知,文件然后包含目标文件夹权限是很有意义的,这将为目标提供必要的权限,然后根据需要重新排列其自己的文件系统。

自然,这并不总是可取的。因此,可以使用特殊权限继承规则定义移动和复制操作。在同一篇文章中:

  • 若要在复制和移动文件和文件夹时保留权限,请使用带有/ O或/ X开关的Xcopy.exe实用程序。对象的原始权限将被添加到新位置的可继承权限中。

  • 若要在复制或移动对象时将对象的原始权限添加到可继承权限,请使用带有–O和–X开关的Xcopy.exe实用程序。


“例如,如果您只是不小心将文件移至系统或具有特殊所有权权限或受到其他保护的文件夹,那么这是不可取的。” -因此,您将文件移动到具有只写权限的文件夹中,并且仍然能够将文件移回。
VVS

1
@VVS,因为ACL是基于文件系统的安全模型。每个卷都拥有自己的文件系统,并因此拥有自己的ACL表。从ACL安全性的角度来看,不同的卷等效于不同的“用户”。通过将文件移动到其他卷,您正在将控制权转移给该“用户”。但是您仍然可以选择是否确实愿意。只是默认行为解决了ACL安全问题。
矮人

1

确定这是真正的低点。首先-我们是在谈论单个PC还是服务器?我假设我们正在谈论服务器。因此,...作为公司A的Wintel管理员,您在新服务器的网络驱动器上创建了文件系统。您将其基于部门,即每个部门都有一个文件夹,并且由于机密性问题,每个文件夹都有其自己的唯一ACL,这很可能是规范-是吗?因此,如果要将文件移动到另一个部门的文件夹中,为什么不希望它继承其新文件夹的权限?我的意思是..为什么不使用基于权限的文件系统?我可以举一个真实的例子,对于这个问题,移动文件/文件夹始终继承其父文件夹的ACL非常重要,请问我。

在一个卷中移动文件或将它们从第X卷移动到第Y卷...本质区别是什么?据我所知,您正在移动某些文件的位置-跨不同卷移动或不移动,在公司环境中不会有什么不同。Mucker尚未提到一个默认包含继承而另一个默认不包含继承的真正原因-即“效率”。将文件拖放到卷中只会更改索引条目-文件不会移动,并且它们的ACL信息将被保留。使操作简单。当文件跨卷移动,然而,文件和它们的ACL 已经被重新定义,这样做正确,并包括继承是很有意义的,因为它不会导致本可避免的开销。

我不明白为什么Microsoft不解决此问题。在资源管理器的拖放操作中包含一个对话框是否太困难了?类似于“您已将文件移动到具有不同访问权限的位置,是否要继承新的父文件夹的权限?是还是否?”。

问候,巨石

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.