Почему права доступа к файлам сохраняются при перемещении файлов в том же томе?

9

Иногда возникает проблема, связанная с тем, что файл имеет разрешения, отличные от папки, в которой он находится.

Теперь я узнал, что есть статья в КБ, объясняющая причину этого:

По умолчанию объект наследует разрешения от своего родительского объекта, либо во время создания, либо когда он копируется или перемещается в родительскую папку. Единственное исключение из этого правила возникает при перемещении объекта в другую папку на том же томе. В этом случае исходные разрешения сохраняются.

Таким образом, пользователь переместил файл из одной папки в другую, и права доступа к исходной папке были сохранены.

Мой вопрос сейчас: почему существует это исключение? В чем причина этого?

VVS
источник

Ответы:

8

Я объяснил это в блоге http://think-like-a-computer.com/2011/07/24/moving-files-on-the-same-ntfs-volume-does-inherit-permissions/, но это также объясняется ниже.

Когда файл копируется, он должен создать новый файл и назначить ему новый набор разрешений, чтобы он получал разрешения из родительской папки, как вы знаете.

Когда файл перемещается на другой том, на самом деле происходит его копирование на новый том, а старый файл удаляется. Таким образом, тот же процесс повторяется, как описано выше, поскольку он снова является новым файлом и требует установки разрешений.

Когда файл перемещается в том же объеме, на самом деле ничего не происходит (на уровне диска). Это просто меняет логический путь к файлу. Фактические данные и физический файл на диске не были затронуты или изменены. Вы когда-нибудь замечали, что когда вы перемещаете файл 5 ГБ в другую папку на том же диске, это делается практически мгновенно? Вот почему, потому что он фактически не перемещался, но указатель на то, где файл логически существует, изменился. Поскольку он не был изменен, разрешения также не меняются.

Это причина такого поведения.

Изменить: то, что я забыл упомянуть ... Статья MS не совсем точна. MS цитата:

По умолчанию объект наследует разрешения от своего родительского объекта, либо во время создания, либо когда он копируется или перемещается в родительскую папку. Единственное исключение из этого правила возникает при перемещении объекта в другую папку на том же томе. В этом случае исходные разрешения сохраняются.

Приведенная выше цитата относится только к объектам, которым были даны ТОЛЬКО определенные разрешения sec (отключить наследование). Как упомянуто в моих комментариях, все дело в том, чтобы записи ACL были максимально эффективными. Рассмотрим следующий пример:

Для простоты объяснения, скажем, у вас есть папка, позволяющая пользователям изменять только права. Ниже приведены тысячи файлов, и ни один из них не имеет явных разрешений. Не очень эффективно создавать списки ACL для каждого файла, поскольку они имеют одинаковые права доступа, поэтому он устанавливает ОДНУ запись ACL для папки. Следующий бит очень важен для понимания; Сами файлы не имеют ACL PERMS. Поэтому, когда вы перемещаете какой-либо из этих файлов в новую папку на том же томе, MS заявляет, что с ним перемещаются привилегии (как указано выше). Задай себе вопрос .... как? Там не было никаких разрешений на файл в первую очередь, чтобы перейти. Это на самом деле неверно, и я только что проверил это сейчас, чтобы подтвердить это. Допустим, папка назначения, в которую вы перемещаете файл, имеет права доступа, позволяющие изменять права только для каждой группы. Хорошо, поскольку файл не имеет ACL напрямую, он наследует ACL родительской папки. Это означает, что разрешения изменились с изменения пользователя (старая папка) на изменение каждого (новая папка).

Заметьте разницу ?? На этот раз перемещение файла в другую папку на том же томе фактически изменило правила, а MS говорит, что этого не происходит. Я только что нашел ошибку в документации MS с 2000 года?

Теперь рассмотрим тот же сценарий при использовании явных разрешений. Если вы установили явные разрешения для файла в этой папке (наследование отключено), который, например, запрещает пользователям доступ для чтения, теперь он создает новую запись ACL специально для этого файла. Теперь, когда вы перемещаете файл в новое место, он имеет запись ACL, непосредственно связанную с ним. В этом случае перемещение файла в новое место на том же томе ОСТАВЛЯЕТ его разрешения (как утверждает MS)!

откатчик
источник
+1 Оба являются хорошими ответами, но ваш - ближе к делу. Мне нравится ваш комментарий о том, как файл 5GB перемещается мгновенно. Хороший визуальный.
Котро
Я склонен думать, что «копирование не происходит» является основной причиной, по которой ACL не затрагивается.
ВВС
1
Нет технической причины, по которой изменение таблицы файловой системы не должно влиять на соответствующую запись ACL. Я думаю, что это объяснение правильно. Но я также думаю, что это описывает эффект, а не фактическую причину. Причина - собственная модель безопасности ACL, основанная на томах. Операции перемещения / копирования между различными томами понимаются как передача привилегий и изменения в том же томе как независимые от привилегий. По умолчанию естественно.
Гном
1
И по логике, права на файл устанавливаются при создании. Обратите внимание, что при изменении разрешений для папки вам необходимо распространить разрешения на все дочерние объекты. Вот почему Windows иногда выдает диалоговое окно, поскольку оно изменяет все дочерние объекты, если их много.
Surfasb
1
@ Макер: Извините, но ваше объяснение просто неправильно. Windows всегда хранит ACL с файлами, даже если они наследуются. И с точки зрения файловой системы они всегда перемещаются вместе с файлом, если файл перемещается в пределах одного и того же тома. В зависимости от определенных системных настроек, Windows Explorer подключится и отрегулирует разрешения после перемещения. Но это Explorer и не имеет ничего общего с файловой системой. И что еще хуже: это зависит от версии Windows и (как я уже говорил) определенных системных настроек. См. Blogs.msdn.com/b/oldnewthing/archive/2006/08/24/717181.aspx
Пол
6

Когда вы перемещаете файлы в том же объеме, вы традиционно перестраиваете файловую систему . Изменение прав доступа к файлу на уровне каталога может заблокировать вас из этого файла в момент завершения операции перемещения. Это нежелательно, если, например, вы просто случайно переместили файл в систему или в папку со специальными правами владения или иным образом защищены. Не будет никакого способа исправить ошибку, кроме как стать владельцем файла (если у вас есть права) или войти в систему с привилегированной учетной записью. Принимая во внимание нормальную повседневную работу компьютера, вы можете обнаружить, что у вас нет контроля над файловой системой.

Такое поведение распространено среди большинства (если не всех) операционных систем, использующих ACL. Это гарантирует нормальную работу файловой системы в томе как пользователями, так и приложениями.

И наоборот, при перемещении файлов между томами вы традиционно отдаете файл для управления кем-то или кем-то еще. Как вы хорошо понимаете, имеет смысл, чтобы файл включал в себя разрешения для целевой папки, что даст цели необходимые разрешения, чтобы затем перестроить свою собственную файловую систему по своему усмотрению.

Естественно, это не всегда желательно. По этой причине операции перемещения и копирования могут быть определены с помощью специальных правил наследования разрешений. Из той же статьи:

  • Чтобы сохранить разрешения при копировании или перемещении файлов и папок, используйте утилиту Xcopy.exe с ключом / O или / X. Исходные разрешения объекта будут добавлены к наследуемым разрешениям в новом местоположении.

  • Чтобы добавить исходные разрешения объекта к наследуемым разрешениям при копировании или перемещении объекта, используйте утилиту Xcopy.exe с переключателями –O и –X.

Гном
источник
«Это нежелательно, если, например, вы просто случайно переместили файл в систему или папку со специальными разрешениями на владение или иным образом защищены». - Таким образом, вы перемещаете файл, например, в папку с правами только для записи, и все еще можете переместить файл назад ... почему это не желательно для разных томов?
ВВС
1
@VVS, потому что ACL - это модель безопасности на основе файловой системы. Каждый том содержит свою собственную файловую систему и, следовательно, собственную таблицу ACL. С точки зрения безопасности ACL, другой том является эквивалентом другого «пользователя». Перемещая файл на другой том, вы передаете управление этому «пользователю». Но вам все еще предоставляется возможность не делать этого, если вы действительно этого хотите. Просто поведение по умолчанию решает проблемы безопасности ACL.
Гном
1

ОК, это настоящий низкий уровень. Первый - мы говорим об одном ПК или сервере? Я предполагаю, что мы говорим о сервере. Итак ... как администратор Wintel компании A вы создаете файловую систему на сетевом диске вашего нового сервера. Вы основываете его на отделах, то есть у каждого отдела есть папка, и у каждой папки есть свой собственный уникальный ACL из-за проблем конфиденциальности, как, вероятно, норма - да? Поэтому, если вы собираетесь переместить файл в папку другого отдела, с какой стати вы НЕ хотите, чтобы он наследовал привилегии своей новой папки? Что я имею в виду ... почему у вас есть файловая система на основе разрешений, если вы не собираетесь ее использовать? Я могу привести вам реальный пример, в котором важно, чтобы перемещенные файлы / папки всегда наследовали ACL родительской папки, просто спросите меня.

Перемещение файлов внутри тома или перемещение их с тома X на том Y ... в чем заключается существенная разница? Насколько я вижу, вы перемещаете расположение некоторых файлов - на разных томах или нет, что делает небольшую разницу в корпоративной среде. Настоящая причина, по которой один включает наследование по умолчанию, а другой еще не был упомянут Макером, - это «эффективность». Перетаскивание файлов внутри тома просто меняет запись в индексе - файлы не перемещаются, а их информация ACL остается без изменений. Делает для простой операции. Однако при перемещении файлов между томами файлы и их списки ACL должны быть переопределены, поэтому правильное выполнение этого и включение наследования имеет смысл, так как не приводит к ненужным накладным расходам.

Я не могу понять, почему Microsoft не решает эту проблему. Было бы слишком сложно включить диалоговое окно как часть проводника drag n drop? Что-то вроде «Вы переместили файлы в папку с разными правами доступа, хотите ли вы наследовать разрешения новой родительской папки? Y или N?»

С уважением, Stonegiant

Stonegiant
источник